Skip to content

Commit 7f44d80

Browse files
Merge pull request #18 from NVIDIA-ISAAC-ROS/release-dp3
Isaac ROS 0.30.0 (DP3)
2 parents c15c25b + 08ceb80 commit 7f44d80

File tree

9 files changed

+77
-115
lines changed

9 files changed

+77
-115
lines changed

.gitattributes

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Ignore Python files in linguist
2+
*.py linguist-detectable=false
3+
14
# Images
25
*.gif filter=lfs diff=lfs merge=lfs -text
36
*.jpg filter=lfs diff=lfs merge=lfs -text
@@ -17,5 +20,6 @@
1720
*.so.* filter=lfs diff=lfs merge=lfs -text
1821

1922
# ROS Bags
23+
**/resources/**/*.zstd filter=lfs diff=lfs merge=lfs -text
2024
**/resources/**/*.db3 filter=lfs diff=lfs merge=lfs -text
2125
**/resources/**/*.yaml filter=lfs diff=lfs merge=lfs -text

README.md

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,28 @@
11
# Isaac ROS Argus Camera
22

3-
<div align="center"><img src="resources/100_library_left.JPG" width="350" title="HAWK Stereo Left"/><img src="resources/100_library_right.JPG" width="350" title="HAWK Stereo Right"/></div>
3+
<div align="center"><img src="resources/isaac_ros_argus_sample_raw.png" width="300" title="raw image"/> <img src="resources/isaac_ros_argus_sample_isp.png" width="300" title="isp processed image"/></div>
44

55
## Overview
6+
The Isaac ROS Argus Camera module contains an ROS 2 package for sensor processing to output images. Image sensors are connected on CSI and GMSL hardware interfaces to Jetson platforms. This package uses dedicated hardware engines to accelerate image processing. Output images are used in graphs of nodes for AI and CV perception packages, image compression for capture to disk by event recorders, and live-stream visuals for remote robot teleoperation.
7+
8+
Isaac ROS Argus Camera provides with several sensor capture and processing features, including AWB (auto-white-balance), AE (auto-exposure), and noise reduction. Leveraging hardware engines in Jetson, Argus provides multi-camera frame synchronization, with very high precision frame acquisition timestamping and jitter less than 100us.
9+
10+
<div align="center"><img src="resources/isaac_ros_argus_camera_nodegraph.png" width="800" title="graph of nodes with Argus Camera"/></div>
11+
12+
In the example graph of nodes above, the Argus Camera module processes sensor image data from the camera for input to vision-based perception graphs, including DNN stereo disparity, AprilTag, VSLAM, and H.264 encode. Each of the nodes in green is GPU accelerated for a high-performance compute graph from Argus camera to vision-based perception functions.
13+
14+
<div align="center"><img src="resources/isaac_ros_argus_camera_zeromemcpy.png" width="800" title="zero CPU memcpy with Argus Camera"/></div>
15+
16+
Argus Camera uses dedicated hardware engines to access the full memory bandwidth in Jetson. Raw camera images are delivered via CSI or GMSL interfaces directly to the GPU accelerated memory. The ISP hardware processes the raw image directly into a GPU accelerated output image topic.
17+
18+
Widely available USB and Ethernet plug-in cameras can be used for robotics applications, but there is performance cost for this convenience. The I/O interface (USB or Ethernet) places the image from the camera directly into CPU-accessible memory. The camera driver makes a copy from the I/O interface using the CPU to make the image available to other applications. The Camera driver wrapper node in ROS performs another memcpy with the CPU from the driver to publish the image in ROS. Before a USB or Ethernet image arrives as a published topic, two CPU memcpy actions have been perfromed for every pixel. In contrast, the Argus Camera module processes sensor data into output image topics in ROS without the CPU touching a single pixel in the image.
19+
20+
> **Note**: Argus Camera outputs sensor_msgs/Image at the sensor data rate, subject to performance capabilites of the Jetson platform(s). For example, a [Hawk camera](https://www.leopardimaging.com/li-ar0234cs-stereo-gmsl2-hawk/) configured for 30fps (frames per second) stereo 1920x1080 will output time-synchronized left and right camera frames sensor_msgs/Image at 30fps.
21+
22+
> **Note**: Argus Camera is not supported on x86_64 platforms with discrete GPUs that do not have a CSI or GMSL interface to connect to a camera.
23+
24+
> **Note**: See [Argus](https://docs.nvidia.com/jetson/l4t-multimedia/group__LibargusAPI.html) for more information on camera processing.
625
7-
This repository provides the Isaac ROS Argus node, which enables ROS developers to use monocular and stereo cameras connected to Jetson platforms over CSI. The node uses the [Libargus API](https://docs.nvidia.com/jetson/l4t-multimedia/group__LibargusAPI.html) internally for acquiring images and associated metadata from camera devices.
826

927
### Isaac ROS NITROS Acceleration
1028

@@ -41,24 +59,24 @@ This package is powered by [NVIDIA Isaac Transport for ROS (NITROS)](https://dev
4159

4260
## Latest Update
4361

44-
Update 2022-10-19: Updated OSS licensing
62+
Update 2023-03-23: Update to be compatible with JetPack 5.1.1
4563

4664
## Supported Platforms
4765

48-
This package is designed and tested to be compatible with ROS2 Humble running on [Jetson](https://developer.nvidia.com/embedded-computing) with off-the-shelf cameras from NVIDIA partners (see the [Reference Cameras](#reference-cameras) section for more details).
66+
This package is designed and tested to be compatible with ROS 2 Humble running on [Jetson](https://developer.nvidia.com/embedded-computing) with off-the-shelf cameras from NVIDIA partners (see the [Reference Cameras](#reference-cameras) section for more details).
4967
> **Note**: x86_64 system is not supported.
5068
51-
> **Note**: Versions of ROS2 earlier than Humble are **not** supported. This package depends on specific ROS2 implementation features that were only introduced beginning with the Humble release.
69+
> **Note**: Versions of ROS 2 earlier than Humble are **not** supported. This package depends on specific ROS 2 implementation features that were only introduced beginning with the Humble release.
5270
5371
| Platform | Hardware | Software | Notes |
5472
| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
55-
| Jetson | [Jetson Orin](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/) <br> [Jetson Xavier](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-agx-xavier/) | [JetPack 5.0.2](https://developer.nvidia.com/embedded/jetpack) | The [CSI](https://en.wikipedia.org/wiki/Camera_Serial_Interface) camera device needs to be connected and presented as a video device (e.g. `/dev/video0`). <br><br> For best performance, ensure that [power settings](https://docs.nvidia.com/jetson/archives/r34.1/DeveloperGuide/text/SD/PlatformPowerAndPerformance.html) are configured appropriately. |
73+
| Jetson | [Jetson Orin](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/) <br> [Jetson Xavier](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-agx-xavier/) | [JetPack 5.1.1](https://developer.nvidia.com/embedded/jetpack) | The [CSI](https://en.wikipedia.org/wiki/Camera_Serial_Interface) camera device needs to be connected and presented as a video device (e.g. `/dev/video0`). <br><br> For best performance, ensure that [power settings](https://docs.nvidia.com/jetson/archives/r34.1/DeveloperGuide/text/SD/PlatformPowerAndPerformance.html) are configured appropriately. |
5674

5775
### Docker
5876

5977
To simplify development, we strongly recommend leveraging the Isaac ROS Dev Docker images by following [these steps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common/blob/main/docs/dev-env-setup.md). This will streamline your development environment setup with the correct versions of dependencies on Jetson platforms.
6078

61-
> **Note:** All Isaac ROS Quickstarts, tutorials, and examples have been designed with the Isaac ROS Docker images as a prerequisite.
79+
> **Note**: All Isaac ROS Quickstarts, tutorials, and examples have been designed with the Isaac ROS Docker images as a prerequisite.
6280
6381
### Reference Cameras
6482

@@ -194,7 +212,7 @@ Refer to [this page](https://docs.nvidia.com/jetson/l4t-multimedia/classArgus_1_
194212

195213
> **Note**: Each camera module should have stored the calibration parameters in internal memory like EEPROM, and the device driver must support the Argus Ext API to extract those parameters. Contact your camera vendor to get the required drivers.
196214

197-
> **Note:** If your camera does not support the Argus Ext API, you can also specify a URL to a camera info `.ini` file parseable by the ROS [CameraInfoManager](http://wiki.ros.org/camera_info_manager) using the `camera_info_url` parameter on the Isaac ROS Argus node. This will allow you to provide parameters you may have calibrated using the ROS Camera Calibration package, for example.
215+
> **Note**: If your camera does not support the Argus Ext API, you can also specify a URL to a camera info `.ini` file parseable by the ROS [CameraInfoManager](http://wiki.ros.org/camera_info_manager) using the `camera_info_url` parameter on the Isaac ROS Argus node. This will allow you to provide parameters you may have calibrated using the ROS Camera Calibration package, for example.
198216

199217
> **Note**: When the `camera_info_url` is provided, the loaded parameters override the `CameraInfo` from Argus Ext API.
200218

@@ -218,6 +236,7 @@ Exit the Docker container and restart the `nvargus` daemon by running `sudo serv
218236

219237
| Date | Changes |
220238
| ---------- | ------------------------------------------ |
239+
| 2023-03-23 | Update to be compatible with JetPack 5.1.1 |
221240
| 2022-10-19 | Updated OSS licensing |
222241
| 2022-08-31 | Update to be compatible with JetPack 5.0.2 |
223242
| 2022-06-30 | Support NITROS acceleration |
Lines changed: 19 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES
2-
# Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
33
#
44
# Licensed under the Apache License, Version 2.0 (the "License");
55
# you may not use this file except in compliance with the License.
@@ -15,118 +15,41 @@
1515
#
1616
# SPDX-License-Identifier: Apache-2.0
1717

18-
cmake_minimum_required(VERSION 3.8)
19-
project(isaac_ros_argus_camera)
20-
21-
# Default to C++17
22-
if(NOT CMAKE_CXX_STANDARD)
23-
set(CMAKE_CXX_STANDARD 17)
24-
endif()
18+
cmake_minimum_required(VERSION 3.23.2)
19+
project(isaac_ros_argus_camera LANGUAGES C CXX)
2520

2621
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
2722
add_compile_options(-Wall -Wextra -Wpedantic)
2823
endif()
2924

30-
# Default to Release build
31-
if(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
32-
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
33-
endif()
34-
message( STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}" )
35-
36-
execute_process(
37-
COMMAND uname -m
38-
COMMAND tr -d '\n'
39-
OUTPUT_VARIABLE ARCHITECTURE)
40-
message(STATUS "Architecture: ${ARCHITECTURE}")
25+
execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE)
26+
message( STATUS "Architecture: ${ARCHITECTURE}" )
4127

4228
find_package(ament_cmake_auto REQUIRED)
4329
ament_auto_find_build_dependencies()
30+
4431
# Only build Argus nodes on Jetson platform
4532
if(${ARCHITECTURE} STREQUAL "aarch64")
46-
# Find VPI dependency
47-
find_package(vpi REQUIRED)
48-
# Base class
49-
ament_auto_add_library(base_node SHARED src/argus_camera_node.cpp)
50-
# Mono camera node
51-
ament_auto_add_library(mono_node SHARED src/argus_camera_mono_node.cpp)
52-
# Stereo camera node
53-
ament_auto_add_library(stereo_node SHARED src/argus_camera_stereo_node.cpp)
54-
55-
target_include_directories(
56-
mono_node
57-
PRIVATE /usr/lib/aarch64-linux-gnu/tegra
58-
/usr/src/jetson_multimedia_api/argus/include
59-
/usr/src/jetson_multimedia_api/argus/samples/utils
60-
/usr/src/jetson_multimedia_api/include
61-
include)
62-
63-
target_include_directories(
64-
stereo_node
65-
PRIVATE /usr/lib/aarch64-linux-gnu/tegra
66-
/usr/src/jetson_multimedia_api/argus/include
67-
/usr/src/jetson_multimedia_api/argus/samples/utils
68-
/usr/src/jetson_multimedia_api/include
69-
include)
70-
71-
target_compile_definitions(mono_node PRIVATE "COMPOSITION_BUILDING_DLL")
33+
# aarch64
7234

73-
target_compile_definitions(stereo_node PRIVATE "COMPOSITION_BUILDING_DLL")
35+
ament_auto_add_library(base_node SHARED src/argus_camera_node.cpp)
36+
ament_auto_add_library(mono_node SHARED src/argus_camera_mono_node.cpp)
37+
rclcpp_components_register_nodes(mono_node "nvidia::isaac_ros::argus::ArgusMonoNode")
38+
set(node_plugins "${node_plugins}nvidia::isaac_ros::argus::ArgusMonoNode;$<TARGET_FILE:mono_node>\n")
7439

75-
target_link_libraries(
76-
mono_node
77-
/usr/lib/aarch64-linux-gnu/tegra/libnvargus.so
78-
/usr/lib/aarch64-linux-gnu/tegra/libnvargus_socketclient.so
79-
/usr/lib/aarch64-linux-gnu/tegra/libnvargus_socketserver.so
80-
/usr/lib/aarch64-linux-gnu/tegra/libnvbuf_utils.so
81-
vpi)
82-
83-
target_link_libraries(
84-
stereo_node
85-
/usr/lib/aarch64-linux-gnu/tegra/libnvargus.so
86-
/usr/lib/aarch64-linux-gnu/tegra/libnvargus_socketclient.so
87-
/usr/lib/aarch64-linux-gnu/tegra/libnvargus_socketserver.so
88-
/usr/lib/aarch64-linux-gnu/tegra/libnvbuf_utils.so
89-
vpi)
90-
91-
rclcpp_components_register_nodes(mono_node "nvidia::isaac_ros::argus::ArgusMonoNode")
92-
set(node_plugins
93-
"${node_plugins}nvidia::isaac_ros::argus::ArgusMonoNode;$<TARGET_FILE:mono_node>\n"
94-
)
95-
96-
rclcpp_components_register_nodes(stereo_node "nvidia::isaac_ros::argus::ArgusStereoNode")
97-
set(node_plugins
98-
"${node_plugins}nvidia::isaac_ros::argus::ArgusStereoNode;$<TARGET_FILE:stereo_node>\n"
99-
)
100-
101-
# Install config directory
102-
install(
103-
DIRECTORY config
104-
DESTINATION share/${PROJECT_NAME})
105-
install(
106-
DIRECTORY launch
107-
DESTINATION share/${PROJECT_NAME})
108-
install(
109-
TARGETS mono_node
110-
ARCHIVE DESTINATION lib
111-
LIBRARY DESTINATION lib
112-
RUNTIME DESTINATION bin)
113-
114-
install(
115-
TARGETS stereo_node
116-
ARCHIVE DESTINATION lib
117-
LIBRARY DESTINATION lib
118-
RUNTIME DESTINATION bin)
119-
endif()
40+
ament_auto_add_library(stereo_node SHARED src/argus_camera_stereo_node.cpp)
41+
rclcpp_components_register_nodes(stereo_node "nvidia::isaac_ros::argus::ArgusStereoNode")
42+
set(node_plugins "${node_plugins}nvidia::isaac_ros::argus::ArgusStereoNode;$<TARGET_FILE:stereo_node>\n")
12043

12144
if(BUILD_TESTING)
12245
find_package(ament_lint_auto REQUIRED)
12346
ament_lint_auto_find_test_dependencies()
12447

12548
find_package(launch_testing_ament_cmake REQUIRED)
126-
if(${ARCHITECTURE} STREQUAL "aarch64")
127-
add_launch_test(test/isaac_ros_argus_camera_mono_test.py)
128-
add_launch_test(test/isaac_ros_argus_camera_stereo_test.py)
129-
endif()
49+
add_launch_test(test/isaac_ros_argus_camera_mono_test.py)
50+
add_launch_test(test/isaac_ros_argus_camera_stereo_test.py)
13051
endif()
13152

132-
ament_auto_package(INSTALL_TO_SHARE launch)
53+
endif() # aarch64
54+
55+
ament_auto_package(INSTALL_TO_SHARE config launch)

isaac_ros_argus_camera/package.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
2121
<package format="3">
2222
<name>isaac_ros_argus_camera</name>
23-
<version>0.20.0</version>
23+
<version>0.30.0</version>
2424
<description>Support for Argus Stereo Camera</description>
2525

2626
<maintainer email="[email protected]">Greg Lo</maintainer>
@@ -33,13 +33,16 @@
3333

3434
<depend>camera_info_manager</depend>
3535
<depend>geometry_msgs</depend>
36+
<depend>isaac_ros_image_proc</depend>
3637
<depend>isaac_ros_nitros</depend>
3738
<depend>isaac_ros_nitros_camera_info_type</depend>
3839
<depend>isaac_ros_nitros_image_type</depend>
3940
<depend>rclcpp</depend>
4041
<depend>rclcpp_components</depend>
4142
<depend>tf2_ros</depend>
4243

44+
<build_depend>isaac_ros_common</build_depend>
45+
4346
<test_depend>ament_lint_auto</test_depend>
4447
<test_depend>ament_lint_common</test_depend>
4548
<test_depend>isaac_ros_test</test_depend>

isaac_ros_argus_camera/src/argus_camera_node.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,17 @@ const std::unordered_map<std::string, DistortionType> g_ros_to_gxf_distortion_mo
4747
});
4848

4949
const std::vector<std::pair<std::string, std::string>> EXTENSIONS = {
50-
{"isaac_ros_nitros", "gxf/std/libgxf_std.so"},
51-
{"isaac_ros_nitros", "gxf/cuda/libgxf_cuda.so"},
52-
{"isaac_ros_nitros", "gxf/serialization/libgxf_serialization.so"},
53-
{"isaac_ros_nitros", "gxf/libgxf_sight.so"},
54-
{"isaac_ros_nitros", "gxf/libgxf_atlas.so"},
55-
{"isaac_ros_nitros", "gxf/libgxf_isaac_messages.so"},
56-
{"isaac_ros_nitros", "gxf/multimedia/libgxf_multimedia.so"},
57-
{"isaac_ros_nitros", "gxf/tensorops/libgxf_tensorops.so"},
58-
{"isaac_ros_nitros", "gxf/libgxf_argus.so"},
59-
{"isaac_ros_nitros", "gxf/libgxf_message_compositor.so"}
50+
{"isaac_ros_gxf", "gxf/lib/std/libgxf_std.so"},
51+
{"isaac_ros_gxf", "gxf/lib/cuda/libgxf_cuda.so"},
52+
{"isaac_ros_gxf", "gxf/lib/serialization/libgxf_serialization.so"},
53+
{"isaac_ros_gxf", "gxf/lib/libgxf_gxf_helpers.so"},
54+
{"isaac_ros_gxf", "gxf/lib/libgxf_sight.so"},
55+
{"isaac_ros_gxf", "gxf/lib/libgxf_atlas.so"},
56+
{"isaac_ros_gxf", "gxf/lib/libgxf_isaac_messages.so"},
57+
{"isaac_ros_gxf", "gxf/lib/multimedia/libgxf_multimedia.so"},
58+
{"isaac_ros_image_proc", "gxf/lib/image_proc/libgxf_tensorops.so"},
59+
{"isaac_ros_gxf", "gxf/lib/libgxf_argus.so"},
60+
{"isaac_ros_gxf", "gxf/lib/libgxf_message_compositor.so"}
6061
};
6162
constexpr char PACKAGE_NAME[] = "isaac_ros_argus_camera";
6263
const std::vector<std::string> GENERATOR_RULE_FILENAMES = {
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)