Replies: 1 comment
|
Thanks for the write-up — the source references made this straightforward to check, and I want to confirm up front that all six of your technical points are accurate on 6.0.1. Specifically:
I also measured what happens if an application tries to close the gap itself, because your point 5/6 argument is the crux of the request. I published
So your concern is valid — a partial offset is strictly worse than the 1970 baseline, and it fails exactly the way you predicted. I went one step further and tried to reach the SDG path. The writer registry is patchable: rewriting the time template in I am filing this internally as a feature request with the analysis attached. In the meantime, my suggestion is to not offset inside the graph. Record as-is and apply a single uniform offset downstream, rewriting both the bag's receive timestamps and the in-message header stamps. That keeps Internal ticket: IREQ-472 |
Uh oh!
There was an error while loading. Please reload this page.
Summary
Isaac Sim's simulation time is hardcoded to begin at
0.0, and there is no supported API to set a start time or apply an offset. For ROS 2 users this means/clockand every sensor message stamp begin at the Unix epoch (1970), so recorded rosbags carry timestamps that cannot be correlated with real-world events or external logs.Use case
We run a standalone Isaac Sim application publishing ROS 2 sensor data (
/clock, joint states, IMU, lidar, GNSS, cameras) to downstream nodes running withuse_sim_time=true, and record it to rosbag for later analysis. Because simulated recordings start in 1970 while everything else we compare them against carries true wall-clock time:Real wall-clock stamps (
useSystemTime) are not a substitute: those stop agreeing with/clockwhenever real-time factor != 1, which breaks everyuse_sim_timeconsumer. What is missing is the ability for the existing coherent simulation timebase to simply start at a chosen epoch.Why this is not achievable today
1. Simulation time is derived from a PhysX-owned step counter with no setter.
PluginInterface.cpp:696-698:getSimulationStepCountis the only accessor; there is no corresponding setter.2.
ISimulationManagerexposes no offset or start-time control.All time-related Python bindings are read-only (
get_simulation_time,get_simulation_time_monotonic,get_simulation_time_at_time,get_current_time). The only mutators arereset,set_callback_iter, and the notice-handler toggles.resetOnStop=Falseyields monotonic-across-restart time, but still starting from zero.3. Zero is re-applied unconditionally at several lifecycle points.
g_simulationTime = 0appears inonStop,onAttach, plugin initialisation, and the reset path, so the origin is cleared on every stage attach or stop.4.
IsaacReadSimulationTime'sreferenceTimeNumerator/referenceTimeDenominatorinputs are not an offset.They act as a rational-time lookup key into
TimeSampleStorage(getSimulationTimeAtTime) for multi-tick render alignment.5. The clock is wired independently into each sensor and ROS OGN node, so there is no single place where an origin could take effect.
Simulation time reaches ROS as a
timeStampinput consumed separately by each publisher —ROS2PublishClock,ROS2PublishJointState,ROS2PublishImu,ROS2PublishTransformTree,ROS2PublishImage,ROS2PublishCameraInfo, and any additional application-side publishers. Each is a distinct graph connection toIsaacReadSimulationTime. Since correctness requires that/clockand all sensor stamps share exactly one timebase, an origin has to hold across every one of those connections simultaneously — a value applying to some publishers but not others places one topic ~56 years from the rest, causing TF extrapolation failures andmessage_filterssynchronisation that never fires.6. The camera path is handled specially and does not go through the application's graph at all.
Camera publishing is driven by the SDG / Replicator writer registry rather than user-authored action-graph nodes. At writer-attach time,
isaacsim.ros2.nodes/python/impl/extension.py:207hardwires its own time source into the connection template, per render product:This time node is created internally by the extension, is separate from the one in the user's graph, and is not exposed as a configuration point. Camera stamps and the latched
CameraInfotherefore originate from a time source structurally outside the reach of anything an application can configure — which is why the origin needs to be a platform-level concept rather than a per-graph one.Request
A supported way to set the simulation-time origin, applied centrally within Isaac Sim so that every consumer of simulation time — the OGN ROS publishers and the SDG camera /
CameraInfopath alike — inherits the same origin automatically, keeping/clockand all sensor stamps coherent by construction. Ideally settable beforeplay(), preserved across attach/stop/reset, readable back for reproducible replay, and defaulting to the current zero-based behaviour so existing setups are unaffected.Version: Isaac Sim 6.0.1 (Kit 110)
All reactions