Skip to content

Commit 926ec0a

Browse files
Isaac ROS 3.2
1 parent 2a75d8a commit 926ec0a

34 files changed

+1565
-212
lines changed

.gitattributes

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,5 @@
2525
**/resources/**/*.yaml filter=lfs diff=lfs merge=lfs -text
2626
**/resources/**/*.bag filter=lfs diff=lfs merge=lfs -text
2727

28-
# FIXME: Only for DNN packages
2928
# DNN Model files
3029
*.onnx filter=lfs diff=lfs merge=lfs -text

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Ignore all pycache files
22
**/__pycache__/**
33

4-
# FIXME: Only for DNN-based packages
54
# Ignore TensorRT plan files
65
*.plan
76
*.engine

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Visit [Isaac Perceptor](https://nvidia-isaac-ros.github.io/reference_workflows/i
88

99
## Performance
1010

11-
| Sample Graph<br/><br/> | Input Size<br/><br/> | Nova Carter<br/><br/> |
12-
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
13-
| [DNN Stereo Disparity Live Graph](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_ess_nova_benchmark/scripts/isaac_ros_hawk_1f_2lt_ess_depth_graph.py)<br/><br/><br/>3 Hawk Cameras<br/><br/><br/>1x Full ESS and 2x Throttled Light ESS<br/><br/> | 1200p<br/><br/><br/><br/><br/><br/> | Full: [30.2 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_hawk_1f_2lt_ess_depth_graph-carter_v2.4.json)<br/><br/><br/>Light: 15.2 fps (avg)<br/><br/><br/><br/> |
14-
| [Perceptor Graph](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_perceptor_nova_benchmark/scripts/isaac_ros_perceptor_graph.py)<br/><br/><br/>3 Hawk Cameras<br/><br/><br/><br/> | 1200p<br/><br/><br/><br/><br/><br/> | Nvblox ESDF: [9.46 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_perceptor_graph-carter_v2.4.json)<br/><br/><br/>Nvblox Mesh: 9.77 fps<br/><br/><br/>Visual Odometry: 30.1 fps<br/><br/> |
11+
| Sample Graph<br/><br/> | Input Size<br/><br/> | Nova Carter<br/><br/> |
12+
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
13+
| [DNN Stereo Disparity Live Graph](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_ess_nova_benchmark/scripts/isaac_ros_hawk_1f_2lt_ess_depth_graph.py)<br/><br/><br/>3 Hawk Cameras<br/><br/><br/>1x Full ESS and 2x Throttled Light ESS<br/><br/> | 1200p<br/><br/><br/><br/><br/><br/> | Full: [30.2 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_hawk_1f_2lt_ess_depth_graph-carter-v2.4-jp6.json)<br/><br/><br/>Light: 15.2 fps (avg)<br/><br/><br/><br/> |
14+
| [Perceptor Graph](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_perceptor_nova_benchmark/scripts/isaac_ros_perceptor_graph.py)<br/><br/><br/>3 Hawk Cameras<br/><br/><br/><br/> | 1200p<br/><br/><br/><br/><br/><br/> | Nvblox ESDF: [9.46 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_perceptor_graph-carter-v2.4-jp6.json)<br/><br/><br/>Nvblox Mesh: 1.01 fps<br/><br/><br/>Visual Odometry: 30.0 fps<br/><br/> |

isaac_ros_perceptor_bringup/CMakeLists.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,15 @@ find_package(rclpy REQUIRED)
2525
find_package(ament_cmake_auto REQUIRED)
2626
ament_auto_find_build_dependencies()
2727

28+
install(PROGRAMS
29+
scripts/create_map.py
30+
DESTINATION lib/${PROJECT_NAME}
31+
)
32+
33+
34+
# Embed versioning information into installed files
35+
ament_index_get_resource(ISAAC_ROS_COMMON_CMAKE_PATH isaac_ros_common_cmake_path isaac_ros_common)
36+
include("${ISAAC_ROS_COMMON_CMAKE_PATH}/isaac_ros_common-version-info.cmake")
37+
generate_version_info(${PROJECT_NAME})
38+
2839
ament_auto_package(INSTALL_TO_SHARE launch params)

isaac_ros_perceptor_bringup/launch/algorithms/hawks_processing.launch.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
#
1616
# SPDX-License-Identifier: Apache-2.0
1717

18-
import os
19-
18+
# flake8: noqa: F403,F405
2019
from isaac_ros_launch_utils.all_types import *
2120
import isaac_ros_launch_utils as lu
22-
import isaac_ros_perceptor_constants as pc
21+
import isaac_ros_perceptor_python_utils.constants as pc
2322

2423

2524
def create_imager_pipeline(stereo_camera_name: str, identifier: str,
@@ -34,7 +33,6 @@ def create_imager_pipeline(stereo_camera_name: str, identifier: str,
3433
plugin='nvidia::isaac_ros::image_proc::RectifyNode',
3534
namespace=f'{stereo_camera_name}/{identifier}',
3635
parameters=[{
37-
'input_qos': 'SENSOR_DATA',
3836
'output_width': pc.HAWK_IMAGE_WIDTH,
3937
'output_height': pc.HAWK_IMAGE_HEIGHT,
4038
}],
@@ -126,10 +124,12 @@ def generate_launch_description() -> LaunchDescription:
126124
args.add_arg('ess_number_of_frames_to_skip', 1)
127125
args.add_arg('ess_full_engine_file_path',
128126
lu.get_isaac_ros_ws_path() +
129-
'/isaac_ros_assets/models/dnn_stereo_disparity/dnn_stereo_disparity_v4.0.0/ess.engine')
127+
'/isaac_ros_assets/models/dnn_stereo_disparity/dnn_stereo_disparity_v4.1.0_onnx'
128+
'/ess.engine')
130129
args.add_arg('ess_light_engine_file_path',
131130
lu.get_isaac_ros_ws_path() +
132-
'/isaac_ros_assets/models/dnn_stereo_disparity/dnn_stereo_disparity_v4.0.0/light_ess.engine')
131+
'/isaac_ros_assets/models/dnn_stereo_disparity/dnn_stereo_disparity_v4.1.0_onnx/'
132+
'light_ess.engine')
133133

134134
# Create pipelines for each camera according to the camera config
135135
actions = args.get_launch_actions()
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES
2+
# Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
#
16+
# SPDX-License-Identifier: Apache-2.0
17+
# SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES
18+
# Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
19+
#
20+
# Licensed under the Apache License, Version 2.0 (the "License");
21+
# you may not use this file except in compliance with the License.
22+
# You may obtain a copy of the License at
23+
#
24+
# http://www.apache.org/licenses/LICENSE-2.0
25+
#
26+
# Unless required by applicable law or agreed to in writing, software
27+
# distributed under the License is distributed on an "AS IS" BASIS,
28+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29+
# See the License for the specific language governing permissions and
30+
# limitations under the License.
31+
#
32+
# SPDX-License-Identifier: Apache-2.0
33+
34+
import math
35+
36+
from isaac_ros_launch_utils.all_types import *
37+
import isaac_ros_launch_utils as lu
38+
39+
40+
def generate_launch_description() -> LaunchDescription:
41+
args = lu.ArgumentContainer()
42+
args.add_arg('container_name', 'nova_container')
43+
44+
pointcloud_to_flatscan_node = ComposableNode(
45+
package='isaac_ros_pointcloud_utils',
46+
plugin='nvidia::isaac_ros::pointcloud_utils::PointCloudToFlatScanNode',
47+
name='pointcloud_to_flatscan',
48+
namespace='front_3d_lidar',
49+
parameters=[{
50+
'min_z': -0.2,
51+
'input_qos': 'SENSOR_DATA',
52+
}],
53+
remappings=[
54+
('pointcloud', 'lidar_points'),
55+
('pointcloud/nitros', 'lidar_points/nitros'),
56+
],
57+
)
58+
59+
flatscan_to_laserscan_node = ComposableNode(
60+
package='isaac_ros_pointcloud_utils',
61+
plugin='nvidia::isaac_ros::pointcloud_utils::FlatScantoLaserScanNode',
62+
name='flatscan_to_laserscan',
63+
namespace='front_3d_lidar',
64+
parameters=[{
65+
'angle_min': -math.pi,
66+
'angle_max': math.pi,
67+
'angle_increment': math.pi / 720,
68+
}],
69+
)
70+
71+
load_lidar_processing_pipeline = LoadComposableNodes(
72+
target_container=args.container_name,
73+
composable_node_descriptions=[
74+
pointcloud_to_flatscan_node,
75+
flatscan_to_laserscan_node,
76+
],
77+
)
78+
79+
actions = args.get_launch_actions()
80+
actions.append(load_lidar_processing_pipeline)
81+
82+
return LaunchDescription(actions)

isaac_ros_perceptor_bringup/launch/algorithms/nvblox.launch.py

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@
1515
#
1616
# SPDX-License-Identifier: Apache-2.0
1717

18-
from isaac_ros_launch_utils.all_types import *
18+
import isaac_ros_launch_utils.all_types as lut
1919
import isaac_ros_launch_utils as lu
20-
import isaac_ros_perceptor_constants as pc
2120

2221
from nvblox_ros_python_utils.nvblox_launch_utils import NvbloxPeopleSegmentation
23-
import nvblox_ros_python_utils.nvblox_constants as nc
2422

2523
from typing import Any, List, Tuple
2624

@@ -33,92 +31,111 @@ def get_nvblox_remappings(camera_names: List[str],
3331
remappings.append((f'camera_{i}/depth/camera_info', f'{name}/camera_info'))
3432
# NOTE(alexmillane): If in people mapping mode the first camera subscribes to color
3533
# image coming from the segmentation graph.
36-
if enable_people_segmentation and name == 'front_stereo_camera':
37-
remappings.append((f'camera_{i}/color/image', f'/segmentation/image_resized'))
38-
remappings.append((f'camera_{i}/color/camera_info', f'/segmentation/camera_info_resized'))
34+
if enable_people_segmentation:
35+
remappings.append((f'camera_{i}/color/image', f'/{name}/segmentation/image_resized'))
36+
remappings.append((f'camera_{i}/color/camera_info',
37+
f'/{name}/segmentation/camera_info_resized'))
38+
remappings.append((f'camera_{i}/mask/image', f'/{name}/segmentation/people_mask'))
39+
remappings.append((f'camera_{i}/mask/camera_info',
40+
f'/{name}/segmentation/camera_info_resized'))
3941
else:
4042
remappings.append((f'camera_{i}/color/image', f'{name}/left/image_rect'))
4143
remappings.append((f'camera_{i}/color/camera_info', f'{name}/left/camera_info_rect'))
42-
if enable_people_segmentation:
43-
remappings.append((f'mask/image', f'/unet/raw_segmentation_mask'))
44-
remappings.append((f'mask/camera_info', f'/segmentation/camera_info_resized'))
4544
return remappings
4645

4746

48-
def get_nvblox_params(camera_names: List[str], enable_people_segmentation: bool,
49-
global_frame: str) -> List[Any]:
47+
def get_nvblox_params(
48+
camera_names: List[str],
49+
enable_people_segmentation: bool,
50+
global_frame: str,
51+
param_filename: str,
52+
) -> List[Any]:
5053
parameters = []
5154
parameters.append(lu.get_path('nvblox_examples_bringup', 'config/nvblox/nvblox_base.yaml'))
52-
parameters.append(lu.get_path('isaac_ros_perceptor_bringup', 'params/nvblox_perceptor.yaml'))
53-
parameters.append({'num_cameras': len(camera_names)})
54-
parameters.append({'global_frame': global_frame})
55+
56+
# Dynamics is always enabled, unless we're running in people segmentation mode
5557
if enable_people_segmentation:
5658
parameters.append(
5759
lu.get_path('nvblox_examples_bringup',
5860
'config/nvblox/specializations/nvblox_segmentation.yaml'))
59-
return parameters
61+
else:
62+
parameters.append(
63+
lu.get_path('nvblox_examples_bringup',
64+
'config/nvblox/specializations/nvblox_dynamics.yaml'))
6065

66+
parameters.append(lu.get_path('isaac_ros_perceptor_bringup', param_filename))
67+
parameters.append({'num_cameras': len(camera_names)})
68+
parameters.append({'global_frame': global_frame})
6169

62-
def check_valid_nvblox_configuration(args: lu.ArgumentContainer, enable_people_segmentation: bool):
63-
if enable_people_segmentation:
64-
# For now, we only allow people segmentation on the front camera.
65-
segmentation_camera_names = args.enabled_stereo_cameras_for_nvblox_people.split(',')
66-
assert len(
67-
segmentation_camera_names) <= 1, 'People segmentation is only possible for one camera.'
68-
assert segmentation_camera_names[0] == 'front_stereo_camera', \
69-
'People segmentation is only possible for the front stereo camera.'
70+
return parameters
7071

7172

72-
def add_nvblox(args: lu.ArgumentContainer) -> List[Action]:
73+
def add_nvblox(args: lu.ArgumentContainer) -> List[lut.Action]:
7374
camera_names = args.enabled_stereo_cameras_for_nvblox.split(',')
7475
enable_people_segmentation = len(args.enabled_stereo_cameras_for_nvblox_people) > 0
7576

7677
remappings = get_nvblox_remappings(camera_names, enable_people_segmentation)
77-
parameters = get_nvblox_params(camera_names, enable_people_segmentation, args.global_frame)
78-
check_valid_nvblox_configuration(args, enable_people_segmentation)
78+
parameters = get_nvblox_params(camera_names, enable_people_segmentation,
79+
args.nvblox_global_frame, args.param_filename)
80+
parameters.append({'after_shutdown_map_save_path': args.after_shutdown_map_save_path})
7981

8082
# Add the nvblox node.
81-
if enable_people_segmentation:
82-
nvblox_node_name = 'nvblox_human_node'
83-
nvblox_plugin_name = 'nvblox::NvbloxHumanNode'
84-
else:
85-
nvblox_node_name = 'nvblox_node'
86-
nvblox_plugin_name = 'nvblox::NvbloxNode'
87-
88-
nvblox_node = ComposableNode(
89-
name=nvblox_node_name,
83+
nvblox_node = lut.ComposableNode(
84+
name='nvblox_node',
9085
package='nvblox_ros',
91-
plugin=nvblox_plugin_name,
86+
plugin='nvblox::NvbloxNode',
9287
remappings=remappings,
9388
parameters=parameters,
9489
)
9590

9691
actions = []
9792
actions.append(lu.load_composable_nodes(args.container_name, [nvblox_node]))
9893
actions.append(
99-
lu.log_info(["Enabling nvblox for cameras '", args.enabled_stereo_cameras_for_nvblox, "'"]))
94+
lu.log_info(["Enabling nvblox for cameras '",
95+
args.enabled_stereo_cameras_for_nvblox, "'"]))
10096

10197
# Add people segmentation if enabled.
10298
if enable_people_segmentation:
99+
camera_namespaces = []
100+
camera_input_topics = []
101+
input_camera_info_topics = []
102+
output_resized_image_topics = []
103+
output_resized_camera_info_topics = []
104+
for _, name in enumerate(camera_names):
105+
camera_namespaces.append(name)
106+
camera_input_topics.append(f'/{name}/left/image_rect')
107+
input_camera_info_topics.append(f'/{name}/left/camera_info_rect')
108+
output_resized_image_topics.append(f'/{name}/segmentation/image_resized')
109+
output_resized_camera_info_topics.append(f'/{name}/segmentation/camera_info_resized')
110+
103111
actions.append(
104112
lu.include(
105113
'nvblox_examples_bringup',
106114
'launch/perception/segmentation.launch.py',
107115
launch_arguments={
108116
'container_name': args.container_name,
109-
'input_topic': '/front_stereo_camera/left/image_rect',
110-
'input_camera_info_topic': '/front_stereo_camera/left/camera_info_rect',
111-
'people_segmentation': NvbloxPeopleSegmentation.peoplesemsegnet_shuffleseg,
117+
'namespace_list': camera_namespaces,
118+
'input_topic_list': camera_input_topics,
119+
'input_camera_info_topic_list': input_camera_info_topics,
120+
'output_resized_image_topic_list': output_resized_image_topics,
121+
'output_resized_camera_info_topic_list': output_resized_camera_info_topics,
122+
'num_cameras': len(camera_names),
123+
# Isaac 3.0 enabled people seg only on front camera, and fps drops during
124+
# replay is not reported.
125+
'one_container_per_camera': False,
126+
'people_segmentation': NvbloxPeopleSegmentation.peoplesemsegnet_vanilla,
112127
}))
113128

114129
return actions
115130

116131

117-
def generate_launch_description() -> LaunchDescription:
132+
def generate_launch_description() -> lut.LaunchDescription:
118133
args = lu.ArgumentContainer()
119134
args.add_arg('enabled_stereo_cameras_for_nvblox')
120135
args.add_arg('enabled_stereo_cameras_for_nvblox_people')
121136
args.add_arg('container_name', 'nova_container')
122-
args.add_arg('global_frame', 'odom')
137+
args.add_arg('param_filename', 'params/nvblox_perceptor.yaml')
138+
args.add_arg('after_shutdown_map_save_path', '')
139+
args.add_arg('nvblox_global_frame', 'odom')
123140
args.add_opaque_function(add_nvblox)
124-
return LaunchDescription(args.get_launch_actions())
141+
return lut.LaunchDescription(args.get_launch_actions())

0 commit comments

Comments
 (0)