Skip to content

Commit 62f3f35

Browse files
authored
Merge pull request #7 from NVIDIA-ISAAC-ROS/release-2.1
Isaac ROS 2.1.0
2 parents 3fd279c + 960937a commit 62f3f35

File tree

7 files changed

+1268
-11
lines changed

7 files changed

+1268
-11
lines changed

isaac_ros_benchmark/package.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
2222
<package format="3">
2323
<name>isaac_ros_benchmark</name>
24-
<version>2.0.0</version>
24+
<version>2.1.0</version>
2525
<description>Isaac ROS benchmarking utilities</description>
2626

2727
<maintainer email="[email protected]">Hemal Shah</maintainer>

isaac_ros_benchmark/src/nitros_monitor_node.cpp

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,25 @@ void NitrosMonitorNode::CreateNitrosMonitorSubscriber()
167167
template<typename T>
168168
void NitrosMonitorNode::ROSTypeMonitorSubscriberCallback(const std::shared_ptr<T> msg)
169169
{
170+
std::lock_guard<std::mutex> lock(is_monitoring_mutex_);
171+
if (!is_monitoring_) {
172+
return;
173+
}
174+
175+
uint32_t timestamp_key;
170176
if (revise_timestamps_as_message_ids_) {
171-
RecordEndTimestamp(msg->header.stamp.sec);
177+
timestamp_key = msg->header.stamp.sec;
172178
} else {
173-
RecordEndTimestampAutoKey();
179+
// Use increamental numbers as timestamp keys
180+
timestamp_key = end_timestamps_.size();
174181
}
182+
if (record_start_timestamps_) {
183+
std::chrono::time_point<std::chrono::system_clock> start_timestamp(
184+
std::chrono::seconds(msg->header.stamp.sec) +
185+
std::chrono::nanoseconds(msg->header.stamp.nanosec));
186+
RecordStartTimestamp(timestamp_key, start_timestamp);
187+
}
188+
RecordEndTimestamp(timestamp_key);
175189
}
176190

177191
void NitrosMonitorNode::NitrosTypeMonitorSubscriberCallback(
@@ -180,22 +194,42 @@ void NitrosMonitorNode::NitrosTypeMonitorSubscriberCallback(
180194
{
181195
(void)data_format_name;
182196

197+
std::lock_guard<std::mutex> lock(is_monitoring_mutex_);
198+
if (!is_monitoring_) {
199+
return;
200+
}
201+
202+
uint32_t timestamp_key;
183203
if (revise_timestamps_as_message_ids_) {
184-
gxf_result_t code;
185204
std_msgs::msg::Header ros_header;
186-
187-
code = nvidia::isaac_ros::nitros::GetTypeAdapterNitrosContext().getEntityTimestamp(
188-
msg_base.handle, ros_header);
189-
if (code != GXF_SUCCESS) {
205+
if (nvidia::isaac_ros::nitros::GetTypeAdapterNitrosContext().getEntityTimestamp(
206+
msg_base.handle, ros_header) != GXF_SUCCESS)
207+
{
190208
RCLCPP_ERROR(
191209
get_logger(),
192210
"[NitrosMonitorNode] getEntityTimestamp Error");
193211
}
194-
195-
RecordEndTimestamp(ros_header.stamp.sec);
212+
timestamp_key = ros_header.stamp.sec;
196213
} else {
197-
RecordEndTimestampAutoKey();
214+
timestamp_key = end_timestamps_.size();
215+
}
216+
217+
if (record_start_timestamps_) {
218+
std_msgs::msg::Header ros_header;
219+
if (nvidia::isaac_ros::nitros::GetTypeAdapterNitrosContext().getEntityTimestamp(
220+
msg_base.handle, ros_header) != GXF_SUCCESS)
221+
{
222+
RCLCPP_ERROR(
223+
get_logger(),
224+
"[NitrosMonitorNode] getEntityTimestamp Error");
225+
} else {
226+
std::chrono::time_point<std::chrono::system_clock> start_timestamp(
227+
std::chrono::seconds(ros_header.stamp.sec) +
228+
std::chrono::nanoseconds(ros_header.stamp.nanosec));
229+
RecordStartTimestamp(timestamp_key, start_timestamp);
230+
}
198231
}
232+
RecordEndTimestamp(timestamp_key);
199233
}
200234

201235
} // namespace isaac_ros_benchmark
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# SPDX-FileCopyrightText: NVIDIA CORPORATION & AFFILIATES
2+
# Copyright (c) 2023 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+
"""
18+
Live benchmarking Isaac ROS ArgusStereoNode.
19+
20+
The graph consists of the following:
21+
- Graph under Test:
22+
1. ArgusStereoNode: publishes images
23+
24+
Required:
25+
- Packages:
26+
- isaac_ros_argus_camera
27+
"""
28+
29+
from launch_ros.actions import ComposableNodeContainer
30+
from launch_ros.descriptions import ComposableNode
31+
32+
from ros2_benchmark import ImageResolution
33+
from ros2_benchmark import BasicPerformanceCalculator, BenchmarkMode
34+
from ros2_benchmark import ROS2BenchmarkConfig, ROS2BenchmarkTest
35+
from ros2_benchmark import MonitorPerformanceCalculatorsInfo
36+
37+
IMAGE_RESOLUTION = ImageResolution.HD
38+
39+
def launch_setup(container_prefix, container_sigterm_timeout):
40+
"""Generate launch description for live benchmarking Isaac ROS ArgusStereoNode."""
41+
argus_node = ComposableNode(
42+
name='ArgusStereoNode',
43+
namespace=TestIsaacROSArgusStereoNode.generate_namespace(),
44+
package='isaac_ros_argus_camera',
45+
plugin='nvidia::isaac_ros::argus::ArgusStereoNode',
46+
parameters=[{
47+
'module_id': 5,
48+
}]
49+
)
50+
51+
left_image_monitor_node = ComposableNode(
52+
name='LeftImageMonitorNode',
53+
namespace=TestIsaacROSArgusStereoNode.generate_namespace(),
54+
package='isaac_ros_benchmark',
55+
plugin='isaac_ros_benchmark::NitrosMonitorNode',
56+
parameters=[{
57+
'monitor_index': 0,
58+
'monitor_data_format': 'nitros_image_rgb8',
59+
'use_nitros_type_monitor_sub': True,
60+
}],
61+
remappings=[('output', 'left/image_raw')]
62+
)
63+
64+
right_image_monitor_node = ComposableNode(
65+
name='RightImageMonitorNode',
66+
namespace=TestIsaacROSArgusStereoNode.generate_namespace(),
67+
package='isaac_ros_benchmark',
68+
plugin='isaac_ros_benchmark::NitrosMonitorNode',
69+
parameters=[{
70+
'monitor_index': 1,
71+
'monitor_data_format': 'nitros_image_rgb8',
72+
'use_nitros_type_monitor_sub': True,
73+
}],
74+
remappings=[('output', 'right/image_raw')]
75+
)
76+
77+
composable_node_container = ComposableNodeContainer(
78+
name='container',
79+
namespace=TestIsaacROSArgusStereoNode.generate_namespace(),
80+
package='rclcpp_components',
81+
executable='component_container_mt',
82+
prefix=container_prefix,
83+
sigterm_timeout=container_sigterm_timeout,
84+
composable_node_descriptions=[
85+
argus_node,
86+
left_image_monitor_node,
87+
right_image_monitor_node,
88+
],
89+
output='screen'
90+
)
91+
92+
return [composable_node_container]
93+
94+
def generate_test_description():
95+
return TestIsaacROSArgusStereoNode.generate_test_description_with_nsys(launch_setup)
96+
97+
98+
class TestIsaacROSArgusStereoNode(ROS2BenchmarkTest):
99+
"""Live performance test for Isaac ROS ArgusStereoNode."""
100+
101+
# Custom configurations
102+
config = ROS2BenchmarkConfig(
103+
benchmark_name='Isaac ROS ArgusStereoNode Live Benchmark',
104+
benchmark_mode=BenchmarkMode.LIVE,
105+
benchmark_duration=5,
106+
test_iterations=5,
107+
collect_start_timestamps_from_monitors=True,
108+
custom_report_info={'data_resolution': IMAGE_RESOLUTION},
109+
monitor_info_list=[
110+
MonitorPerformanceCalculatorsInfo(
111+
'start_monitoring0',
112+
[BasicPerformanceCalculator({
113+
'report_prefix': 'Argus Left Image',
114+
'message_key_match': True
115+
})]),
116+
MonitorPerformanceCalculatorsInfo(
117+
'start_monitoring1',
118+
[BasicPerformanceCalculator({
119+
'report_prefix': 'Argus Right Image',
120+
'message_key_match': True
121+
})])
122+
]
123+
)
124+
125+
def test_benchmark(self):
126+
self.run_benchmark()

0 commit comments

Comments
 (0)