Skip to content

Dissonance between AnnotatorRegistry timestamp and Simulation time #672

@vik-lid-sim

Description

@vik-lid-sim

Description

I have a usda file for RTX Lidar sensor and a wall as target. I am testing the validity of the timestamps by applying motion to the wall while recording the lidar data. I noticed a couple of issues:

  1. The length of timestamps is about half of the number of emitters I have in the sensor
  2. Even the first time stamp of the sensor is offset wrt the simulation timestamp
  3. After accounting for the initial offset the sensor timestamp lags the simulation time by about 2 frames.

The script I used is shown below:

./python.sh dynamic_data_collector.py     --lidar-usda test_5_emitters_20260609.usda --target-usda notched_wall.usda --target-pos 5 0 0 --lidar-pos 0 0 10  --target-velocity 1 0 0 --frames 500 --output wall_dynamic_data.csv 

Is this expected behavior? Am I doing something wrong here?

dynamic_data_collector.py

Isaac Sim version

5.1.1

Operating System (OS)

Ubuntu 22.04

GPU Name

NVIDIA RTX PRO 5000 Blacwell

GPU Driver and CUDA versions

Driver Version: 580.159.03, CUDA Version: 13.0

Logs

No response

Additional information

USDA file for target:

#usda 1.0
(
    defaultPrim = "SingleBeamFMCW"
    upAxis = "Z"
    metersPerUnit = 1.0
)

# =============================================================================
# Solid-state FMCW lidar with a serpentine (boustrophedon) step-scan pattern.
# Generated by gen_step_scan_lidar.py -- do not hand-edit the emitter arrays.
#
# h_fov=0.0 deg, v_fov=0.0 deg
# delta_chirp=10000 ns
# active scan span = 10k ns
# scan period      = 10000000 ns (10.000 ms) at 100 Hz
# =============================================================================

def OmniLidar "SingleBeamFMCW" (
    prepend apiSchemas = ["OmniSensorGenericLidarCoreAPI"]
)
{
    double3 xformOp:translate = (0, 0, 0)
    quatd xformOp:orient = (1, 0, 0, 0)
    double3 xformOp:scale = (1, 1, 1)
    uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"]

    # ----- Scan topology --------------------------------------------------
    token   omni:sensor:Core:scanType              = "SOLID_STATE"
    uint    omni:sensor:Core:numberOfEmitters      = 5
    uint    omni:sensor:Core:numberOfChannels      = 5
    uint    omni:sensor:Core:numLines              = 1
    uint[]  omni:sensor:Core:numRaysPerLine        = [5]
    uint    omni:sensor:Core:scanRateBaseHz        = 100
    uint    omni:sensor:Core:reportRateBaseHz      = 100
    uint    omni:sensor:Core:stateResolutionStep   = 1
    token   omni:sensor:Core:rotationDirection     = "CW"
    token   omni:sensor:Core:rayType               = "IDEALIZED"
    float   omni:sensor:Core:beamWaistHorM         = 0.002
    float   omni:sensor:Core:beamWaistVerM         = 0.002

    # ----- Range ----------------------------------------------------------
    float   omni:sensor:Core:nearRangeM            = 0.5
    float   omni:sensor:Core:farRangeM             = 200.0
    float   omni:sensor:Core:rangeResolutionM      = 0.000001
    float   omni:sensor:Core:rangeAccuracyM        = 0.00
    uint    omni:sensor:Core:maxReturns            = 1
    uint    omni:sensor:Core:rangeCount            = 0
    float[] omni:sensor:Core:rangesMinM            = []
    float[] omni:sensor:Core:rangesMaxM            = []

    # ----- FMCW optical ---------------------------------------------------
    float   omni:sensor:Core:avgPowerW             = 1000
    float   omni:sensor:Core:waveLengthNm          = 1550.0
    uint    omni:sensor:Core:pulseTimeNs           = 1
    float   omni:sensor:Core:Msquared              = 1.1
    float   omni:sensor:Core:divergenceHorDeg      = 0.03
    float   omni:sensor:Core:divergenceVerDeg      = 0.03
    float   omni:sensor:Core:minReflectance        = 0.1
    float   omni:sensor:Core:minReflectionRangeM   = 250.0
    float   omni:sensor:Core:effectiveApertureSizeM = 0.1
    float   omni:sensor:Core:focusDistM            = 10000.0
    float   omni:sensor:Core:quantumEfficiency     = 1.0

    # ----- Angular noise (deterministic) ----------------------------------
    float   omni:sensor:Core:azimuthErrorMean      = 0.0
    float   omni:sensor:Core:azimuthErrorStd       = 0.0
    float   omni:sensor:Core:elevationErrorMean    = 0.0
    float   omni:sensor:Core:elevationErrorStd     = 0.0

    # ----- Intensity processing ------------------------------------------
    token   omni:sensor:Core:intensityProcessing   = "RAW"
    token   omni:sensor:Core:intensityMappingType  = "LINEAR"

    # ----- Output enables ------------------------------------------------
    token   omni:sensor:Core:auxOutputType         = "FULL"
    token   omni:sensor:Core:outputFrameOfReference = "SENSOR"
    # skipDroppingInvalidPoints=true keeps every emitter occupying its own
    # slot in the scan buffer (with distance=0 for misses). With false the
    # lidar plugin drops missed rays and pads the buffer with duplicates of
    # the first valid rows, which breaks 1:1 emitter -> buffer-slot mapping.
    bool    omni:sensor:Core:skipDroppingInvalidPoints = true

    # ----- Emitter pattern (generated) -----------------------------------
    float[] omni:sensor:Core:emitterState:s001:azimuthDeg   = [0.0, 0.0, 0.0, 0.0, 0.0]
    float[] omni:sensor:Core:emitterState:s001:elevationDeg = [0.0, 0.0, 0.0, 0.0, 0.0]
    uint[]  omni:sensor:Core:emitterState:s001:fireTimeNs   = [0, 10000, 20000, 30000, 40000]
    uint[]  omni:sensor:Core:emitterState:s001:channelId    = [1, 2, 3, 4, 5]
    uint[]  omni:sensor:Core:emitterState:s001:bank         = [0, 0, 0, 0, 0]
}

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions