I am trying to model the sensors using Isaac Sim.
LIDAR models supported by Isaac Sim are velodyne and ouster.
The ouster model of Isaac Sim does not provide time and ring information.
I have to use velodyne model for getting time & ring information.
Is there any other way to create time & ring information for ouster model in Isaac Sim?
If I use a velodyne model for time & ring information, can I say that the data is same as ouster model?
same issue here, some lidar localization packages from ros2 requires ring and timestamp field in the pointcloud2 messages. and complete simulation in the loop localization is not possible at the moment.
The Ouster lidar profile in Isaac Sim does provide ring and per-point timestamp
data – but both require an explicit opt-in that isn’t on by default.
A quick note on the Velodyne workaround: using a Velodyne profile to get ring/time
and treating it as Ouster data introduces model error because the beam elevation angles,
azimuth offsets, and fire timing patterns differ between the two sensors. Use the Ouster
profiles with the configuration below to get geometrically correct data.
Why the fields are missing by default
The RTX lidar’s GenericModelOutput buffer has an auxiliary output level that
controls which per-point fields are computed and exposed:
| Level | Fields available |
|---|---|
NONE (default) |
xyz only |
BASIC |
xyz + emitterId, channelId, intensity, per-point timestamp |
FULL |
BASIC + material ID, hit normals, velocities, object ID |
emitterId is the ring/beam index (uint32, 0-based, one entry per emitter in the
sensor config). The Ouster configs in Isaac Sim already have fireTimeNs populated
for every emitter, so per-point timing is available the moment you enable BASIC.
Step 1: Enable auxiliary output when creating the sensor
from isaacsim.sensors.experimental.rtx import Lidar
import numpy as np
lidar = Lidar.create(
path="/World/ouster",
config="Ouster_OS1_REV6_128ch10hz1024res", # or your chosen Ouster profile
aux_output_level="BASIC", # enables emitterId + timestamp
translations=np.array([0.0, 0.0, 0.5]),
orientations=np.array([1.0, 0.0, 0.0, 0.0]),
)
Or, if you already have an existing OmniLidar prim, set the
_replicator:rendervar:GenericModelOutput:channels attribute to ["BASIC"] via
the Array Properties widget in the UI (see the
Auxiliary Output Level docs
for the step-by-step widget workflow).
Step 2: Tell the ROS2 publisher to include the fields
In the ROS2 RTX Lidar Helper OmniGraph node, set selectedMetadata to the
fields you want published:
# If configuring via Python/OGN API:
import omni.graph.core as og
og.Controller.set(
og.Controller.attribute("inputs:selectedMetadata", lidar_helper_node),
["emitterId", "timestamp"],
)
Or, in the OmniGraph editor:
- Add a ROS2 RTX Lidar Point Cloud Config node to the action graph.
- Tick Include Emitter ID and Include Timestamp.
- Connect its
selectedMetadataoutput to theselectedMetadatainput on
the ROS2 RTX Lidar Helper node.
The published sensor_msgs/PointCloud2 will then contain:
| PointCloud2 field | Meaning |
|---|---|
emitter_id |
Ring/beam index (equivalent to ring in Velodyne/Ouster SDK conventions) |
timestamp_0 / timestamp_1 |
64-bit per-point timestamp in ns (split into two uint32 fields) |
Field name note for localization packages
Packages such as LIO-SAM, FAST-LIO2, and LeGO-LOAM expect a field literally named
ring. Isaac Sim publishes it as emitter_id. A one-line remapper node can bridge
this if you cannot configure the package to use a different field name.
Reference
RTX Lidar ROS 2 Tutorial – Exposing Metadata in PointCloud2
Closing this thread as answered. If you run into issues with the specific Ouster
profile or localization package integration after applying the steps above, please
open a new topic and link back to this one for context.