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:
- The length of timestamps is about half of the number of emitters I have in the sensor
- Even the first time stamp of the sensor is offset wrt the simulation timestamp
- 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]
}
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:
The script I used is shown below:
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: