Skip to content

Commit 5bd613d

Browse files
Merge pull request #69 from NVIDIA-ISAAC-ROS/release-4.1
Isaac ROS 4.1
2 parents 557d7b5 + fa513f9 commit 5bd613d

File tree

3 files changed

+32
-30
lines changed

3 files changed

+32
-30
lines changed

README.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
NVIDIA-accelerated AprilTag detection and pose estimation.
44

5-
<div align="center"><a class="reference internal image-reference" href="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/isaac_ros_apriltag_sample_crop.gif/"><img alt="image" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/isaac_ros_apriltag_sample_crop.gif/" width="550px"/></a></div>
5+
<div align="center"><a class="reference internal image-reference" href="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.1/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/isaac_ros_apriltag_sample_crop.gif/"><img alt="image" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.1/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/isaac_ros_apriltag_sample_crop.gif/" width="550px"/></a></div>
66

77
## Overview
88

@@ -11,7 +11,7 @@ Isaac ROS AprilTag contains a ROS 2 package for detection of
1111
a type of fiducial marker that provides a point of reference or measure.
1212
AprilTag detections are NVIDIA-accelerated for high performance.
1313

14-
<div align="center"><a class="reference internal image-reference" href="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/isaac_ros_apriltag_nodegraph.png/"><img alt="image" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/isaac_ros_apriltag_nodegraph.png/" width="800px"/></a></div>
14+
<div align="center"><a class="reference internal image-reference" href="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.1/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/isaac_ros_apriltag_nodegraph.png/"><img alt="image" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.1/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/isaac_ros_apriltag_nodegraph.png/" width="800px"/></a></div>
1515

1616
A common graph of nodes connects from an input camera through rectify
1717
and resize to AprilTag. Rectify warps the input camera image into a
@@ -25,11 +25,10 @@ For example, an 8mp input image of 3840×2160 may be much larger than
2525
necessary and a 4:1 downscale to 1920x1080 could make more efficient
2626
use of compute resources and satisfy the required detection distance of
2727
the application. Each of the green nodes in the above diagram is NVIDIA
28-
accelerated, allowing for a high-performance compute graph from Argus
29-
Camera to ApriTag. For USB and Ethernet cameras, the graph is
30-
accelerated from Rectify through AprilTag detection.
28+
accelerated, allowing for a high-performance compute graph from camera
29+
input to AprilTag detection.
3130

32-
<div align="center"><a class="reference internal image-reference" href="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/apriltagdetection_message_illustration.png/"><img alt="image" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/apriltagdetection_message_illustration.png/" width="700px"/></a></div>
31+
<div align="center"><a class="reference internal image-reference" href="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.1/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/apriltagdetection_message_illustration.png/"><img alt="image" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.1/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_apriltag/apriltagdetection_message_illustration.png/" width="700px"/></a></div>
3332

3433
As illustrated above, detections are provided in an output array for the
3534
number of AprilTag detections in the input image. Each entry in the
@@ -59,8 +58,8 @@ This package is powered by [NVIDIA Isaac Transport for ROS (NITROS)](https://dev
5958

6059
| Sample Graph<br/><br/> | Input Size<br/><br/> | AGX Thor<br/><br/> | x86_64 w/ RTX 5090<br/><br/> |
6160
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
62-
| [AprilTag Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/benchmarks/isaac_ros_apriltag_benchmark/scripts/isaac_ros_apriltag_node.py)<br/><br/> | 720p<br/><br/> | [392 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_apriltag_node-agx_thor.json)<br/><br/><br/>10 ms @ 30Hz<br/><br/> | [596 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_apriltag_node-x86-5090.json)<br/><br/><br/>2.3 ms @ 30Hz<br/><br/> |
63-
| [AprilTag Graph](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/benchmarks/isaac_ros_apriltag_benchmark/scripts/isaac_ros_apriltag_graph.py)<br/><br/> | 720p<br/><br/> | [366 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_apriltag_graph-agx_thor.json)<br/><br/><br/>13 ms @ 30Hz<br/><br/> | [596 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_apriltag_graph-x86-5090.json)<br/><br/><br/>4.1 ms @ 30Hz<br/><br/> |
61+
| [AprilTag Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.1/benchmarks/isaac_ros_apriltag_benchmark/scripts/isaac_ros_apriltag_node.py)<br/><br/> | 720p<br/><br/> | [392 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.1/results/isaac_ros_apriltag_node-agx_thor.json)<br/><br/><br/>10 ms @ 30Hz<br/><br/> | [596 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.1/results/isaac_ros_apriltag_node-x86-5090.json)<br/><br/><br/>2.3 ms @ 30Hz<br/><br/> |
62+
| [AprilTag Graph](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.1/benchmarks/isaac_ros_apriltag_benchmark/scripts/isaac_ros_apriltag_graph.py)<br/><br/> | 720p<br/><br/> | [366 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.1/results/isaac_ros_apriltag_graph-agx_thor.json)<br/><br/><br/>13 ms @ 30Hz<br/><br/> | [596 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.1/results/isaac_ros_apriltag_graph-x86-5090.json)<br/><br/><br/>4.1 ms @ 30Hz<br/><br/> |
6463

6564
---
6665

@@ -80,4 +79,4 @@ Please visit the [Isaac ROS Documentation](https://nvidia-isaac-ros.github.io/re
8079

8180
## Latest
8281

83-
Update 2025-10-24: Use TF2 Transform Broadcaster to publish AprilTag poses, courtesy of StereoLabs
82+
Update 2026-02-02: Support for two new Docker-optional development and deployment modes

isaac_ros_apriltag/package.xml

Lines changed: 2 additions & 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_apriltag</name>
24-
<version>4.0.0</version>
24+
<version>4.1.0</version>
2525
<description>CUDA-accelerated Apriltag detection and pose estimation.</description>
2626

2727
<maintainer email="[email protected]">Isaac ROS Maintainers</maintainer>
@@ -38,6 +38,7 @@
3838
<depend>isaac_ros_managed_nitros</depend>
3939
<depend>isaac_ros_nitros</depend>
4040
<depend>isaac_ros_nitros_image_type</depend>
41+
<depend>isaac_ros_vpi_utils</depend>
4142
<depend>message_filters</depend>
4243
<depend>rclcpp</depend>
4344
<depend>rclcpp_components</depend>

isaac_ros_apriltag/src/apriltag_node.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
#include <utility>
3333

3434
#include "cuAprilTags.h"
35-
#include "isaac_ros_common/vpi_utilities.hpp"
35+
#include "isaac_ros_vpi_utils/vpi_utilities.hpp"
3636

3737
namespace nvidia
3838
{
@@ -195,12 +195,13 @@ struct AprilTagNode::VPIAprilTagImpl : AprilTagNode::AprilTagImpl
195195
AprilTagNode::AprilTagImpl::Initialize(node, nitros_image_view, camera_info);
196196

197197
try {
198-
CHECK_STATUS(vpiStreamCreate(node.backends_ | VPI_BACKEND_CPU | VPI_BACKEND_CUDA, &stream_));
198+
CHECK_VPI_STATUS(vpiStreamCreate(node.backends_ | VPI_BACKEND_CPU | VPI_BACKEND_CUDA,
199+
&stream_));
199200
} catch (std::runtime_error & e) {
200201
RCLCPP_ERROR(node.get_logger(), "Error while initializing: %s", e.what());
201202
}
202203

203-
CHECK_STATUS(vpiInitAprilTagDecodeParams(&params_));
204+
CHECK_VPI_STATUS(vpiInitAprilTagDecodeParams(&params_));
204205

205206
params_.family = tag_family_;
206207

@@ -218,7 +219,7 @@ struct AprilTagNode::VPIAprilTagImpl : AprilTagNode::AprilTagImpl
218219
std::memcpy(&cam_intrinsics_, &cam_intrinsics, sizeof(VPICameraIntrinsic));
219220

220221
// Detector
221-
CHECK_STATUS(
222+
CHECK_VPI_STATUS(
222223
vpiCreateAprilTagDetector(
223224
node.backends_, camera_info->width,
224225
camera_info->height, &params_, &detector_));
@@ -236,7 +237,7 @@ struct AprilTagNode::VPIAprilTagImpl : AprilTagNode::AprilTagImpl
236237
data->buffer.pitch.planes[0].pixelType = VPI_PIXEL_TYPE_DEFAULT;
237238
data->buffer.pitch.planes[0].pitchBytes = nitros_image_view.GetStride();
238239
data->buffer.pitch.planes[0].offsetBytes = 0;
239-
CHECK_STATUS(vpiImageCreateWrapper(data, nullptr, VPI_BACKEND_CUDA, &input_image_));
240+
CHECK_VPI_STATUS(vpiImageCreateWrapper(data, nullptr, VPI_BACKEND_CUDA, &input_image_));
240241

241242
RCLCPP_INFO(
242243
node.get_logger(), "Initialized with input image (%dx%d), encoding=%s, pitch=%d",
@@ -246,7 +247,7 @@ struct AprilTagNode::VPIAprilTagImpl : AprilTagNode::AprilTagImpl
246247
data->buffer.pitch.planes[0].pitchBytes);
247248

248249
// Input monochrome image
249-
CHECK_STATUS(
250+
CHECK_VPI_STATUS(
250251
vpiImageCreate(
251252
camera_info->width, camera_info->height,
252253
VPI_IMAGE_FORMAT_U8, 0, &input_monochrome_image_));
@@ -260,50 +261,51 @@ struct AprilTagNode::VPIAprilTagImpl : AprilTagNode::AprilTagImpl
260261
// Update input image buffer in wrapper
261262
input_image_data_.buffer.pitch.planes[0].pBase =
262263
const_cast<unsigned char *>(nitros_image_view.GetGpuData());
263-
CHECK_STATUS(vpiImageSetWrapper(input_image_, &input_image_data_))
264+
CHECK_VPI_STATUS(vpiImageSetWrapper(input_image_, &input_image_data_))
264265

265266
// Submit image conversion to U8
266267
VPIConvertImageFormatParams convert_params;
267-
CHECK_STATUS(vpiInitConvertImageFormatParams(&convert_params));
268+
CHECK_VPI_STATUS(vpiInitConvertImageFormatParams(&convert_params));
268269

269-
CHECK_STATUS(
270+
CHECK_VPI_STATUS(
270271
vpiSubmitConvertImageFormat(
271272
stream_, VPI_BACKEND_CUDA, input_image_,
272273
input_monochrome_image_, &convert_params));
273274

274275
// Perform AprilTag detection
275276
VPIArray detections_array;
276-
CHECK_STATUS(
277+
CHECK_VPI_STATUS(
277278
vpiArrayCreate(
278279
node.max_tags_, VPI_ARRAY_TYPE_APRILTAG_DETECTION, 0,
279280
&detections_array));
280-
CHECK_STATUS(
281+
CHECK_VPI_STATUS(
281282
vpiSubmitAprilTagDetector(
282283
stream_, node.backends_, detector_, node.max_tags_,
283284
input_monochrome_image_, detections_array));
284285

285286
VPIArray detections_pose_array;
286-
CHECK_STATUS(vpiArrayCreate(node.max_tags_, VPI_ARRAY_TYPE_POSE, 0, &detections_pose_array));
287-
CHECK_STATUS(
287+
CHECK_VPI_STATUS(vpiArrayCreate(node.max_tags_, VPI_ARRAY_TYPE_POSE, 0,
288+
&detections_pose_array));
289+
CHECK_VPI_STATUS(
288290
vpiSubmitAprilTagPoseEstimation(
289291
stream_, VPI_BACKEND_CPU, detections_array,
290292
cam_intrinsics_, node.size_, detections_pose_array));
291293

292-
CHECK_STATUS(vpiStreamSync(stream_));
294+
CHECK_VPI_STATUS(vpiStreamSync(stream_));
293295

294296
int32_t num_detections = 0;
295-
CHECK_STATUS(vpiArrayGetSize(detections_array, &num_detections));
297+
CHECK_VPI_STATUS(vpiArrayGetSize(detections_array, &num_detections));
296298

297299
VPIArrayData detections_data;
298-
CHECK_STATUS(
300+
CHECK_VPI_STATUS(
299301
vpiArrayLockData(
300302
detections_array, VPI_LOCK_READ, VPI_ARRAY_BUFFER_HOST_AOS,
301303
&detections_data));
302304
VPIAprilTagDetection * detections =
303305
reinterpret_cast<VPIAprilTagDetection *>(detections_data.buffer.aos.data);
304306

305307
VPIArrayData detections_pose_data;
306-
CHECK_STATUS(
308+
CHECK_VPI_STATUS(
307309
vpiArrayLockData(
308310
detections_pose_array, VPI_LOCK_READ, VPI_ARRAY_BUFFER_HOST_AOS,
309311
&detections_pose_data));
@@ -356,10 +358,10 @@ struct AprilTagNode::VPIAprilTagImpl : AprilTagNode::AprilTagImpl
356358
node.tf_broadcaster_->sendTransform(tfs.transforms);
357359

358360
// Cleanup
359-
CHECK_STATUS(vpiArrayUnlock(detections_pose_array));
361+
CHECK_VPI_STATUS(vpiArrayUnlock(detections_pose_array));
360362
vpiArrayDestroy(detections_pose_array);
361363

362-
CHECK_STATUS(vpiArrayUnlock(detections_array));
364+
CHECK_VPI_STATUS(vpiArrayUnlock(detections_array));
363365
vpiArrayDestroy(detections_array);
364366
}
365367

@@ -551,7 +553,7 @@ AprilTagNode::AprilTagNode(const rclcpp::NodeOptions & options)
551553
size_(declare_parameter<double>("size", 0.22)),
552554
tile_size_(declare_parameter<uint16_t>("tile_size", 4)),
553555
tag_family_(declare_parameter<std::string>("tag_family", "tag36h11")),
554-
backends_{::isaac_ros::common::DeclareVPIBackendParameter(this, VPI_BACKEND_CUDA)},
556+
backends_{nvidia::isaac_ros::vpi_utils::DeclareVPIBackendParameter(this, VPI_BACKEND_CUDA)},
555557
image_sub_{},
556558
camera_info_sub_{},
557559
camera_image_sync_{ExactPolicy{3}, image_sub_, camera_info_sub_},

0 commit comments

Comments
 (0)