Hi,
I’m working on an orbital/RPO simulation in Isaac Sim 5.1. The scene uses a full-scale Earth, with two spacecraft at a LEO radius of approximately 6,778,000 m and velocities around 7.7 km/s.
The orbital propagation is performed externally in ROS 2 using double precision. Isaac receives the resulting position and velocity through nav_msgs/Odometry, then applies the velocities to dynamic rigid bodies.
The orbit itself works, but the spacecraft visibly jump when viewed from their onboard cameras. At this coordinate magnitude, PhysX appears to represent positions in increments of approximately 0.5 m. This is particularly noticeable because the spacecraft are only around 50 m apart.
I found this older thread describing essentially the same orbital use case:
Moving the spacecraft into a local frame near the stage origin removes the jitter, but then the visible spacecraft are no longer positioned at LEO relative to the full-scale Earth.
I’m considering implementing a KSP-style floating origin. The idea is to keep the authoritative ECI state in ROS using double precision, while PhysX only receives coordinates relative to a movable origin:
position_local = position_eci - origin_eci
Both spacecraft would continue moving at their orbital velocities inside the local region. Once the chief spacecraft gets around 25–50 km from the local origin, the entire PhysX scene would be shifted back towards zero.
Conceptually, the native code would call:
PxScene::shiftOrigin(const PxVec3& shift);
At the same time, I would update a double-precision global-origin accumulator:
origin_eci += shift
This should keep the global orbit continuous while allowing PhysX to operate close enough to zero for millimetre-level local precision.
I would like to avoid manually calling set_world_pose() on every rigid body because that may invalidate contact caches or cause transient collision responses. PxScene::shiftOrigin() seems more appropriate because it also shifts PhysX’s internal scene data.
My questions are:
- Is
PxScene::shiftOrigin()exposed anywhere in Isaac Sim 5.1? - Can an Omniverse C++ extension obtain the active
PxScene*through a supported Omni PhysX interface? - Is there a recommended callback where the shift can be performed after
fetchResults()and before the next simulation step? - How should the shifted PhysX state be synchronized with USD, Fabric and RTX rendering?
- Is there an existing large-world or floating-origin implementation in Isaac Sim or Isaac Lab that I may have missed?
- Would repeatedly shifting the scene every few seconds cause problems with GPU dynamics, SDF colliders, cameras or ROS-driven rigid bodies?
The scene is relatively small—two primary rigid bodies, their colliders, thrusters and onboard cameras—so the number of objects being shifted would not be large.
Has anyone implemented something similar, or is a native extension that exposes PxScene::shiftOrigin() the expected approach?
Thanks.