Ouster lidar modeling with time & ring information in Isaac Sim

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:

  1. Add a ROS2 RTX Lidar Point Cloud Config node to the action graph.
  2. Tick Include Emitter ID and Include Timestamp.
  3. Connect its selectedMetadata output to the selectedMetadata input 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.