diff --git a/source/isaaclab_tasks/changelog.d/default-newton-locomotion.minor.rst b/source/isaaclab_tasks/changelog.d/default-newton-locomotion.minor.rst new file mode 100644 index 000000000000..2b43b7ed0a7d --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/default-newton-locomotion.minor.rst @@ -0,0 +1,5 @@ +Changed +^^^^^^^ + +* **Breaking:** Changed the Ant, Humanoid, and Velocity task families to use + Newton MJWarp by default. Pass an explicit physics preset to retain Isaac Sim PhysX. diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/ant/ant_direct_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/ant/ant_direct_env_cfg.py index a7f0c1d1e42d..38bc104d929d 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/ant/ant_direct_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/ant/ant_direct_env_cfg.py @@ -33,7 +33,6 @@ class AntPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=45, @@ -50,6 +49,7 @@ class AntPhysicsCfg(PresetCfg): debug_mode=False, use_cuda_graph=True, ) + default = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/ant/ant_manager_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/ant/ant_manager_env_cfg.py index bfdc93912e6a..d628496cf9a3 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/ant/ant_manager_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/ant/ant_manager_env_cfg.py @@ -37,7 +37,6 @@ class AntPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=45, @@ -54,6 +53,7 @@ class AntPhysicsCfg(PresetCfg): debug_mode=False, use_cuda_graph=True, ) + default: NewtonCfg = newton_mjwarp @configclass @@ -143,8 +143,8 @@ def __post_init__(self): class AntObservationsCfg(PresetCfg): physx: ObservationsCfg = ObservationsCfg() isaacsim_physx: ObservationsCfg = physx - default: ObservationsCfg = isaacsim_physx newton_mjwarp: ObservationsCfg = ObservationsCfg() + default: ObservationsCfg = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid/humanoid_direct_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid/humanoid_direct_env_cfg.py index bc0929b86d1e..8fbb51b1c950 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid/humanoid_direct_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid/humanoid_direct_env_cfg.py @@ -29,7 +29,6 @@ class HumanoidPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=80, @@ -42,6 +41,7 @@ class HumanoidPhysicsCfg(PresetCfg): num_substeps=2, debug_mode=False, ) + default = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid/humanoid_manager_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid/humanoid_manager_env_cfg.py index d47422c1ad9a..11a3aa6f16f6 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid/humanoid_manager_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid/humanoid_manager_env_cfg.py @@ -49,7 +49,6 @@ class HumanoidPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=80, @@ -62,6 +61,7 @@ class HumanoidPhysicsCfg(PresetCfg): num_substeps=2, debug_mode=False, ) + default: NewtonCfg = newton_mjwarp ## @@ -147,8 +147,8 @@ def __post_init__(self): class HumanoidObservationsCfg(PresetCfg): physx: ObservationsCfg = ObservationsCfg() isaacsim_physx: ObservationsCfg = physx - default: ObservationsCfg = isaacsim_physx newton_mjwarp: ObservationsCfg = ObservationsCfg() + default: ObservationsCfg = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/anymal_d/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/anymal_d/flat_env_cfg.py index 8b6465f7b449..f2b96e28d0b5 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/anymal_d/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/anymal_d/flat_env_cfg.py @@ -32,7 +32,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx + default = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/cassie/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/cassie/flat_env_cfg.py index 1cf5501abfe1..21ba95740cdb 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/cassie/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/cassie/flat_env_cfg.py @@ -33,7 +33,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx + default = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/flat_env_cfg.py index b40e021d6103..5a53be0c3ee3 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/flat_env_cfg.py @@ -34,7 +34,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx + default = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/go2/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/go2/flat_env_cfg.py index b40781cba880..bcb90551d801 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/go2/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/go2/flat_env_cfg.py @@ -33,7 +33,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx + default = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/h1/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/h1/flat_env_cfg.py index 33b128a80632..1e77fdb16f3f 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/h1/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/h1/flat_env_cfg.py @@ -33,7 +33,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx + default = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/velocity_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/velocity_env_cfg.py index 446f170d9bb4..2f260dbccf2b 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/velocity_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/velocity_env_cfg.py @@ -64,7 +64,7 @@ class RoughPhysicsCfg(PresetCfg): debug_mode=False, default_shape_cfg=NewtonShapeCfg(margin=0.0, ke=160000.0, kd=1100.0), ) - default = isaacsim_physx + default = newton_mjwarp ## diff --git a/source/isaaclab_tasks/test/core/test_environment_determinism.py b/source/isaaclab_tasks/test/core/test_environment_determinism.py index 74c558fcd1ae..5f6b7867a1e2 100644 --- a/source/isaaclab_tasks/test/core/test_environment_determinism.py +++ b/source/isaaclab_tasks/test/core/test_environment_determinism.py @@ -57,8 +57,8 @@ def test_manipulation_env_determinism(task_name, device): ) @pytest.mark.parametrize("device", ["cuda", "cpu"]) def test_locomotion_env_determinism(task_name, device): - """Check deterministic environment creation for locomotion.""" - _test_environment_determinism(task_name, device) + """Check deterministic Isaac Sim PhysX environment creation for locomotion.""" + _test_environment_determinism(task_name, device, physics_preset_name="isaacsim_physx") @pytest.mark.parametrize( diff --git a/source/isaaclab_visualizers/changelog.d/default-newton-locomotion.skip b/source/isaaclab_visualizers/changelog.d/default-newton-locomotion.skip new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/source/isaaclab_visualizers/test/visualizer_golden_utils.py b/source/isaaclab_visualizers/test/visualizer_golden_utils.py index 0c454f0903fe..e7cc7e70a420 100644 --- a/source/isaaclab_visualizers/test/visualizer_golden_utils.py +++ b/source/isaaclab_visualizers/test/visualizer_golden_utils.py @@ -54,6 +54,9 @@ # AnymalD: golden captured warm, first attempt runs cold; observed up to 9.61%. "anymal_d-kit-tiled": 12.0, "anymal_d-kit-viewport": 4.5, + # Newton GL tiled output differs by 0.64% between the L40S CI runner and the golden. + # Keep this narrow 1.0% tolerance paired with an SSIM guard for scene regressions. + "anymal_d-newton-tiled": 1.0, # RTX PRO 6000 Blackwell differs by up to 6.5% while preserving the expected pose. "shadow_hand-kit-tiled": 7.0, "shadow_hand-kit-viewport": 2.0, @@ -78,6 +81,9 @@ # 0.910 lets attempt 1 pass with a large gap above wrong-pose regressions (~0.69). "anymal_d-kit-tiled": 0.910, "anymal_d-kit-viewport": 0.960, + # The L40S comparison reaches SSIM 0.9883; retain a structural threshold well above + # known pose regressions while accepting this cross-GPU rasterization variation. + "anymal_d-newton-tiled": 0.980, # Cross-GPU RTX variation; observed SSIM 0.941 on RTX PRO 6000 Blackwell vs L40S goldens. # Wrong-pose regressions drop SSIM below 0.90. "shadow_hand-kit-tiled": 0.935, diff --git a/source/isaaclab_visualizers/test/visualizer_integration_utils.py b/source/isaaclab_visualizers/test/visualizer_integration_utils.py index 51fb39088096..2b4a46c6c587 100644 --- a/source/isaaclab_visualizers/test/visualizer_integration_utils.py +++ b/source/isaaclab_visualizers/test/visualizer_integration_utils.py @@ -1606,8 +1606,7 @@ def _make_anymal_d_env(visualizer_kind: str | tuple[str, ...], backend_kind: str from isaaclab.envs import ManagerBasedRLEnv env_cfg = copy.deepcopy(AnymalDFlatEnvCfg()) - preset_key = "newton_mjwarp" if backend_kind == "newton" else "default" - env_cfg.sim.physics = getattr(env_cfg.sim.physics, preset_key) + env_cfg = _apply_env_cfg_preset(env_cfg, "newton_mjwarp" if backend_kind == "newton" else "physx") env_cfg.scene.num_envs = ( _ANYMAL_D_TILED_CAMERA_INTEGRATION_NUM_ENVS if tiled_camera else _ANYMAL_D_INTEGRATION_NUM_ENVS )