Important: Isaac Sim support
Note: For Isaac Sim support, the community is gradually transitioning from this forum to the Isaac Sim GitHub repository so that questions and issues can be tracked, searched, and resolved more efficiently in one place. Whenever possible, please create a GitHub Discussion or Issue there instead of starting a new forum topic.
Note: For any Isaac Lab topics, please submit your topic to its GitHub repo ( GitHub - isaac-sim/IsaacLab: Unified framework for robot learning built on NVIDIA Isaac Sim · GitHub ) following the instructions provided on Isaac Lab’s Contributing Guidelines ( Contribution Guidelines — Isaac Lab Documentation ).
Please provide all relevant details below before submitting your post. This will help the community provide more accurate and timely assistance. After submitting, you can check the appropriate boxes. Remember, you can always edit your post later to include additional information if needed.
6.0.0
5.1.0
[ ] 5.0.0
4.5.0
4.2.0
4.1.0
4.0.0
4.5.0
2023.1.1
2023.1.0-hotfix.1
Other (please specify):
Operating System
Ubuntu 24.04
Ubuntu 22.04
Ubuntu 20.04
[ ] Windows 11
Windows 10
Other (please specify):
I’m working on a reinforcement learning project for precision linear stage positioning using Isaac Sim. My goal is to achieve sub-100nm positioning accuracy through RL-based PID gain scheduling.
The original setup:
- A linear stage model (mass ~6.1 kg) moving along one axis
- Target displacement: 0.3 m (300 mm)
- Physics dt: 1/32000 s
- PID force control via
add_force_torque()in Newtons - Position read from
ComputeLocalToWorldTransform().ExtractTranslation() - Velocity read from
RigidBodyAPI.GetVelocityAttr()
The problem:
With the default Meters Per Unit = 1.0 (meters), when position error gets down to the nanometer range (1e-9), I’m concerned that PhysX’s single/double precision floating point may not resolve such small differences relative to the absolute position (~0.3). This would make it impossible for my RL agent to learn fine corrections at the nano-scale.
My approach:
I scaled the entire USD scene by 1000x and changed Meters Per Unit from 1.0 (m) to 0.001 (mm). So:
- Geometry is now 1000x larger in USD coordinates
- Target position in stage coordinates: 300 (instead of 0.3)
- All physics properties (mass, inertia, joint parameters) have been rescaled accordingly
- I verified physics correctness: a 1 kg cube with 1 N force gives exactly 1 m/s² acceleration
What I observed after scaling:
ExtractTranslation()returns values in stage coordinates (mm-scale, e.g. ~300)GetVelocityAttr()still returns values in m/sadd_force_torque()still accepts Newtons
I handle the unit mismatch by converting position from mm back to m in my Python code before sending to MATLAB for RL training.
My questions:
-
Does this 1000x scaling actually improve the numerical resolution of PhysX internally? Specifically, does PhysX compute collision/dynamics in stage coordinates (where I now have more significant digits for small displacements), or does it convert everything to SI internally regardless of Meters Per Unit?
-
Is there a known lower bound on positional precision that PhysX can reliably resolve? For example, can I expect meaningful physics at the 1e-5 stage-unit level (which would correspond to 10 nm in my scaled scene)?
-
Is there a better approach to achieve nanometer-scale precision in Isaac Sim? For instance:
- Using double-precision PhysX (if available)?
- A different scaling strategy?
- Custom physics stepping?
-
Are there any pitfalls with this scaling approach that I should be aware of (e.g. solver stability, contact behavior, gravity scaling)?
Any insights from the Isaac Sim / PhysX team or community members who have worked on precision positioning would be greatly appreciated.
Thank you!