[isaacsim.ros2.nodes] ROS 2 Nodes#

Version: 1.22.7

Overview#

The isaacsim.ros2.nodes extension provides OmniGraph nodes that enable ROS 2 communication within Isaac Sim. This extension bridges robotics simulation with ROS 2 systems by offering nodes for publishing, subscribing, and handling services that can be connected in Action Graphs. It relies on isaacsim.ros2.core for the underlying ROS 2 functionality and integrates sensor data from camera and physics sensors into the ROS 2 ecosystem.

Functionality#

The extension registers OmniGraph nodes that handle ROS 2 message passing, services, and ros2_control setup. These nodes can be placed in Action Graphs to stream sensor data, receive commands, interact with ROS 2 topics and services, and configure an in-process ros2_control ControllerManager. The nodes inherit ROS distribution and core settings from isaacsim.ros2.core, which centralizes all ROS 2 Bridge configuration under /exts/isaacsim.ros2.bridge/*. This allows the nodes to automatically align with the configured ROS 2 environment at runtime without requiring separate configuration.

TF publishers aggregate compatible transform submissions by default so ROS 2 consumers receive one coherent transform snapshot per simulation tick. Publisher nodes that share the same ROS domain, topic, static or dynamic mode, and Quality of Service (QoS) profile contribute to one merged tf2_msgs/msg/TFMessage after OmniGraph evaluation instead of publishing one message per node. This avoids partial TF trees from multi-node graphs and reduces ROS 2 publisher and message overhead. Disable this behavior for debugging with /exts/isaacsim.ros2.nodes/tfAggregation/enabled=false.

Integration#

The extension depends on isaacsim.ros2.core for the ROS 2 backend, isaacsim.ros2.control for ControllerManager integration, isaacsim.sensors.experimental.physics for sensor data access, isaacsim.sensors.physics.nodes for physics sensor OmniGraph nodes, and omni.graph for the OmniGraph framework. It uses isaacsim.core.experimental.utils for stage and prim utilities, isaacsim.core.experimental.objects and isaacsim.core.experimental.prims for scene object creation in tests, and isaacsim.core.rendering_manager and isaacsim.core.simulation_manager for viewport and physics management. C++ publisher implementations for images and point clouds provide optimized data transfer for high-bandwidth sensor streams.

Enable Extension#

The extension can be enabled (if not already) in one of the following ways:

Define the next entry as an application argument from a terminal.

APP_SCRIPT.(sh|bat) --enable isaacsim.ros2.nodes

Define the next entry under [dependencies] in an experience (.kit) file or an extension configuration (extension.toml) file.

[dependencies]
"isaacsim.ros2.nodes" = {}

Open the Window > Extensions menu in a running application instance and search for isaacsim.ros2.nodes. Then, toggle the enable control button if it is not already active.

Extension: {{ extension_version }}

Documentation Generated: Sep 10, 2026

Settings#

Settings Provided by the Extension#

exts.”isaacsim.ros2.nodes”.tfAggregation.enabled#
  • Default Value: true

  • Description: Whether ROS 2 TF publisher nodes aggregate submissions and publish once per topic after OmniGraph evaluation.

Python API#

Internal interface that is automatically called when the extension is loaded so that Omnigraph nodes are registered.

Example

# import isaacsim.ros2.nodes.bindings._ros2_nodes as _ros2_nodes

# Acquire the interface interface = _ros2_nodes.acquire_interface()

# Use the interface # …

# Release the interface _ros2_nodes.release_interface(interface)

class IRos2Nodes
acquire_interface(
plugin_name: str = None,
library_path: str = None,
) isaacsim.ros2.nodes.bindings._ros2_nodes.IRos2Nodes
create_camera_info_publisher_capsule(
topic_name: str,
frame_id: str,
node_namespace: str,
queue_size: int,
qos_profile: str,
width: int,
height: int,
distortion_model: str,
k: List[float],
r: List[float],
p: List[float],
d: List[float],
) capsule

Create a ROS 2 CameraInfo publisher and return a PyCapsule wrapping the C-ABI callback descriptor.

The capsule is named “SrtxFrameCallbackDescriptor” and is intended to be passed to omni.replicator.srtx’s register_frame_callback().

create_image_publisher_capsule(
topic_name: str,
frame_id: str,
node_namespace: str,
queue_size: int,
qos_profile: str = '',
) capsule

Create a ROS 2 Image publisher and return a PyCapsule wrapping the C-ABI callback descriptor.

The capsule is named “SrtxFrameCallbackDescriptor” and is intended to be passed to omni.replicator.srtx’s register_frame_callback().

Parameters:
  • topic_name – ROS 2 topic name to publish on.

  • frame_id – TF frame_id for the published message header.

  • node_namespace – ROS 2 node namespace.

  • queue_size – Publisher queue depth.

  • qos_profile – JSON-encoded QoS profile (empty string for defaults).

Returns:

PyCapsule containing the callback descriptor.

create_laser_scan_publisher_capsule(
topic_name: str,
frame_id: str,
node_namespace: str,
queue_size: int,
qos_profile: str = '',
azimuth_range_start: float = -180.0,
azimuth_range_end: float = 180.0,
depth_range_min: float = 0.0,
depth_range_max: float = 100.0,
rotation_rate: float = 20.0,
horizontal_resolution: float = 1.0,
horizontal_fov: float = 360.0,
) capsule

Create a ROS 2 LaserScan publisher and return a PyCapsule wrapping the C-ABI callback descriptor.

The capsule is named “SrtxFrameCallbackDescriptor” and is intended to be passed to omni.replicator.srtx’s register_frame_callback().

Parameters:
  • topic_name – ROS 2 topic name to publish on.

  • frame_id – TF frame_id for the published message header.

  • node_namespace – ROS 2 node namespace.

  • queue_size – Publisher queue depth.

  • qos_profile – JSON-encoded QoS profile (empty string for defaults).

  • azimuth_range_start – Scan start angle in degrees.

  • azimuth_range_end – Scan end angle in degrees.

  • depth_range_min – Minimum range in meters.

  • depth_range_max – Maximum range in meters.

  • rotation_rate – Scan frequency in Hz.

  • horizontal_resolution – Angular resolution in degrees.

  • horizontal_fov – Horizontal field of view in degrees.

Returns:

PyCapsule containing the callback descriptor.

create_lidar_publisher_capsule(
topic_name: str,
frame_id: str,
node_namespace: str,
queue_size: int,
qos_profile: str = '',
) capsule

Create a ROS 2 PointCloud2 (lidar) publisher and return a PyCapsule wrapping the C-ABI callback descriptor.

The capsule is named “SrtxFrameCallbackDescriptor” and is intended to be passed to omni.replicator.srtx’s register_frame_callback().

Parameters:
  • topic_name – ROS 2 topic name to publish on.

  • frame_id – TF frame_id for the published message header.

  • node_namespace – ROS 2 node namespace.

  • queue_size – Publisher queue depth.

  • qos_profile – JSON-encoded QoS profile (empty string for defaults).

Returns:

PyCapsule containing the callback descriptor.

fill_point_cloud_buffer(
destination: buffer,
xyz: buffer,
fields: List[Tuple[buffer, int]] = [],
point_step: int = 12,
) int

Interleave xyz positions and per-point fields into a PointCloud2-style buffer.

Gathers separate per-field host arrays into the packed point_step layout expected by sensor_msgs/PointCloud2.data: each point occupies point_step bytes, the first 12 bytes are the xyz position (3 consecutive float32), and each extra field is written at its byte offset within the point. The interleave runs in parallel and the GIL is released while it does.

Parameters:
  • destination – Writable, C-contiguous host buffer of at least num_points * point_step bytes (e.g. a numpy.ndarray of uint8 or an array.array('B') used as a ROS 2 message data field).

  • xyz – C-contiguous float32 buffer of the point positions, num_points * 3 elements (any shape). Defines the number of points.

  • fields – Extra per-point fields as (source, offset) pairs. Each source is a C-contiguous buffer whose total size is a per-point size times num_points; offset is the field’s byte offset within a point and must lie in [12, point_step - per_point_size].

  • point_step – Bytes per point in the destination layout. Defaults to 12 (xyz only). Destination bytes not covered by xyz or a field (padding) are left untouched.

Returns:

The number of points interleaved.

Raises:

ValueError – If a buffer is not C-contiguous, the destination is too small, xyz is not native-endian float32 or not a multiple of 3 elements, a field’s size or offset is inconsistent with point_step, or a source buffer overlaps the destination.

release_interface(
arg0: isaacsim.ros2.nodes.bindings._ros2_nodes.IRos2Nodes,
) None

Omnigraph Nodes#

The extension exposes the following Omnigraph nodes: