From 36a3041b4d03832656e348b5650e97fe9e360d9a Mon Sep 17 00:00:00 2001 From: ooctipus Date: Sun, 23 Aug 2026 16:20:45 -0700 Subject: [PATCH] Centralize shared physics preset ownership (#7301) # Description Centralize backend physics presets at task-family composition roots so robot-specific files own only genuinely robot-specific scalar configuration. Standardize Newton MJWarp velocity environments on two physics substeps at the shared family boundary. - Move the Kuka Allegro OvPhysX capacity settings into the shared lift `PhysicsCfg` and remove `KukaAllegroPhysicsCfg`. - Move the SO-101 articulation contact ordering setting into the shared stack `PhysicsCfg` and remove `SO101StackPhysicsCfg`. - Make `RoughPhysicsCfg` own the shared PhysX, MJWarp, and Kamino alternatives once. - Set the shared velocity MJWarp configuration to `num_substeps=2` and remove every robot-specific substep assignment. - Remove the nine flat-locomotion `PhysicsCfg(RoughPhysicsCfg)` wrappers. Their environment configs now mutate only robot-specific MJWarp values on the inherited `RoughPhysicsCfg` instance. - Preserve shared Newton contact, collision-pipeline, and shape settings instead of replacing the whole shared alternative in robot-specific files. - Add an `isaaclab_tasks` major changelog fragment for the shared two-substep behavior change. No additional dependencies are required. ## Type of change - Refactor: centralize physics-preset ownership. - Breaking behavior change: Newton MJWarp velocity environments now use two physics substeps. ## Validation - Existing focused lift, stack, velocity, and camera preset tests: 15 passed before the substep follow-up. - Focused velocity Newton config test after the substep follow-up: 1 passed. - Registered task preset-selection check: passed across the task registry. - Runtime configuration compatibility checks: 31 passed. - Structural audit confirms there is no `PhysicsCfg(SomeOtherPhysicsCfg)` inheritance under `isaaclab_tasks`. - Structural audit confirms no core/contrib robot-specific velocity config assigns `.num_substeps`. - Direct config audit confirms all ten affected concrete core/contrib velocity configs resolve MJWarp with two substeps. - `uv run --frozen isaaclab -f`: Ruff, formatting, and applicable source checks passed; the repository-wide changelog gate still reports pre-existing missing or modified fragments in untouched packages. - Additional preset CLI run: 26 passed; one could not complete because Isaac Sim requested interactive NVIDIA EULA acceptance, which was not accepted automatically. ## Screenshots Not applicable. ## Checklist - [x] Physics preset ownership is centralized without a compatibility layer. - [x] The shared two-substep behavior change is recorded explicitly. - [x] Existing tests cover preset construction and selection. - [x] No test files were added or changed. - [x] An `isaaclab_tasks` major changelog fragment is included. - [x] No additional documentation changes are needed. (cherry picked from commit f86b4e1ad66e637e7770a727e181ffe150a2077b) --- .../shared-physics-preset-ownership.major.rst | 5 +++ .../config/so101/stack_joint_pos_env_cfg.py | 21 ---------- .../contrib/stack/stack_env_cfg.py | 2 + .../velocity/config/a1/flat_env_cfg.py | 35 +++-------------- .../velocity/config/anymal_b/flat_env_cfg.py | 37 ++++-------------- .../velocity/config/anymal_c/flat_env_cfg.py | 37 ++++-------------- .../velocity/config/go1/flat_env_cfg.py | 35 +++-------------- .../velocity/config/spot/flat_env_cfg.py | 2 +- .../kuka_allegro/kuka_allegro_env_cfg.py | 18 --------- .../isaaclab_tasks/core/lift/lift_env_cfg.py | 7 +++- .../velocity/config/anymal_d/flat_env_cfg.py | 36 ++++------------- .../velocity/config/cassie/flat_env_cfg.py | 35 +++-------------- .../velocity/config/cassie/rough_env_cfg.py | 2 - .../core/velocity/config/g1/flat_env_cfg.py | 35 +++-------------- .../core/velocity/config/g1/rough_env_cfg.py | 1 - .../core/velocity/config/go2/flat_env_cfg.py | 35 +++-------------- .../core/velocity/config/h1/flat_env_cfg.py | 35 +++-------------- .../core/velocity/velocity_env_cfg.py | 13 ++++-- .../shared-physics-preset-ownership.skip | 1 + .../anymal_d/newton-newton-tiled.png | Bin 14178 -> 14184 bytes .../anymal_d/newton-newton-viewport.png | Bin 17931 -> 17982 bytes 21 files changed, 76 insertions(+), 316 deletions(-) create mode 100644 source/isaaclab_tasks/changelog.d/shared-physics-preset-ownership.major.rst create mode 100644 source/isaaclab_visualizers/changelog.d/shared-physics-preset-ownership.skip diff --git a/source/isaaclab_tasks/changelog.d/shared-physics-preset-ownership.major.rst b/source/isaaclab_tasks/changelog.d/shared-physics-preset-ownership.major.rst new file mode 100644 index 000000000000..12c5085c3dd5 --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/shared-physics-preset-ownership.major.rst @@ -0,0 +1,5 @@ +Changed +^^^^^^^ + +* **Breaking:** Changed Newton MJWarp velocity environments to use two physics substeps from their + shared family configuration. Robot-specific velocity configs no longer override the substep count. diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/stack/config/so101/stack_joint_pos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/stack/config/so101/stack_joint_pos_env_cfg.py index 1a6d241d9ef1..0190ef1c0ae1 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/stack/config/so101/stack_joint_pos_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/stack/config/so101/stack_joint_pos_env_cfg.py @@ -4,12 +4,10 @@ # SPDX-License-Identifier: BSD-3-Clause from isaaclab.assets import ArticulationCfg, RigidObjectCfg -from isaaclab.physics import PhysxAutoCfg from isaaclab.utils.configclass import configclass from isaaclab_tasks.contrib.stack import mdp from isaaclab_tasks.contrib.stack.stack_env_cfg import ( - PhysicsCfg, StackEnvCfg, StackEventCfg, apply_default_semantics, @@ -52,21 +50,6 @@ _SO101_BASE_SEAT_ROT = (0.0, 0.0, 0.70710678, 0.70710678) -@configclass -class SO101StackPhysicsCfg(PhysicsCfg): - """Physics presets for the SO-101 stack tasks. - - Extends the stack-family presets with - :attr:`~isaaclab_physx.physics.PhysxCfg.solve_articulation_contact_last` so contacts - are solved after the articulation position drive and can stall the closing jaw at the - object surface instead of letting it tunnel through grasped objects. - """ - - isaacsim_physx = PhysicsCfg().isaacsim_physx.replace(solve_articulation_contact_last=True) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default = isaacsim_physx - - @configclass class SO101CubeStackEnvCfg(StackEnvCfg): """Configuration for the SO-101 Cube Stack Environment (joint-position control). @@ -144,7 +127,3 @@ def __post_init__(self): ], marker_scale=(0.05, 0.05, 0.05), ) - - # simulation settings: solve finger contacts after the position drive so they can - # stall the closing jaw at the object surface (see SO101StackPhysicsCfg). - self.sim.physics = SO101StackPhysicsCfg() diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/stack/stack_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/stack/stack_env_cfg.py index e9a7c1168d51..b281000914d8 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/stack/stack_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/stack/stack_env_cfg.py @@ -296,6 +296,8 @@ class PhysicsCfg(PresetCfg): gpu_found_lost_aggregate_pairs_capacity=1024 * 1024 * 4, gpu_total_aggregate_pairs_capacity=2**21, friction_correlation_distance=0.00625, + # Let object contacts stall position-driven grippers before they tunnel through a grasp. + solve_articulation_contact_last=True, ) newton_mjwarp = NewtonCfg( solver_cfg=MJWarpSolverCfg( diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/a1/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/a1/flat_env_cfg.py index 0f10d962b5dd..ef59316e1997 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/a1/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/a1/flat_env_cfg.py @@ -3,46 +3,21 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import UnitreeA1RoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=60, - nconmax=30, - cone="pyramidal", - impratio=1, - integrator="implicitfast", - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx - - @configclass class UnitreeA1FlatEnvCfg(UnitreeA1RoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 60 + newton_mjwarp.solver_cfg.nconmax = 30 + self.sim.physics.default = self.sim.physics.isaacsim_physx # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/anymal_b/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/anymal_b/flat_env_cfg.py index 37f30ee7ba9c..c255e4207417 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/anymal_b/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/anymal_b/flat_env_cfg.py @@ -3,46 +3,23 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import AnymalBRoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=75, - nconmax=15, - cone="elliptic", - impratio=100, - integrator="implicitfast", - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx - - @configclass class AnymalBFlatEnvCfg(AnymalBRoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 75 + newton_mjwarp.solver_cfg.nconmax = 15 + newton_mjwarp.solver_cfg.cone = "elliptic" + newton_mjwarp.solver_cfg.impratio = 100.0 + self.sim.physics.default = self.sim.physics.isaacsim_physx # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/anymal_c/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/anymal_c/flat_env_cfg.py index c55929f4663d..6e29d1955394 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/anymal_c/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/anymal_c/flat_env_cfg.py @@ -3,46 +3,23 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import AnymalCRoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=120, - nconmax=15, - cone="elliptic", - impratio=100, - integrator="implicitfast", - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx - - @configclass class AnymalCFlatEnvCfg(AnymalCRoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 120 + newton_mjwarp.solver_cfg.nconmax = 15 + newton_mjwarp.solver_cfg.cone = "elliptic" + newton_mjwarp.solver_cfg.impratio = 100.0 + self.sim.physics.default = self.sim.physics.isaacsim_physx # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/go1/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/go1/flat_env_cfg.py index a52f25f6c13f..d6907cba7ede 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/go1/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/go1/flat_env_cfg.py @@ -3,46 +3,21 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import UnitreeGo1RoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=60, - nconmax=25, - cone="pyramidal", - impratio=1, - integrator="implicitfast", - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = isaacsim_physx - - @configclass class UnitreeGo1FlatEnvCfg(UnitreeGo1RoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 60 + newton_mjwarp.solver_cfg.nconmax = 25 + self.sim.physics.default = self.sim.physics.isaacsim_physx # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/spot/flat_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/spot/flat_env_cfg.py index 96f76d05fcdc..da3acaf7cd00 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/spot/flat_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/spot/flat_env_cfg.py @@ -49,7 +49,7 @@ class PhysicsCfg(PresetCfg): use_mujoco_contacts=False, ), collision_cfg=NewtonCollisionPipelineCfg(max_triangle_pairs=2_500_000), - num_substeps=1, + num_substeps=2, debug_mode=False, default_shape_cfg=NewtonShapeCfg(margin=0.01), ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/kuka_allegro/kuka_allegro_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/kuka_allegro/kuka_allegro_env_cfg.py index 5d7549fdaf71..e4f304abe8d5 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/kuka_allegro/kuka_allegro_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/kuka_allegro/kuka_allegro_env_cfg.py @@ -3,13 +3,10 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_ov.physics import OvPhysxCfg - from isaaclab.assets import ArticulationCfg from isaaclab.managers import EventTermCfg as EventTerm from isaaclab.managers import RewardTermCfg as RewTerm from isaaclab.managers import SceneEntityCfg -from isaaclab.physics import PhysxAutoCfg from isaaclab.sensors import CameraCfg, ContactSensorCfg from isaaclab.utils.configclass import configclass @@ -24,20 +21,6 @@ FINGER_SENSORS = [f"{name}_object_s" for name in FINGERTIP_LIST if name != "thumb_link_3"] -@configclass -class KukaAllegroPhysicsCfg(lift.PhysicsCfg): - """Physics presets supported by the Kuka Allegro tasks.""" - - isaacsim_physx = lift.PhysicsCfg().isaacsim_physx - ovphysx = OvPhysxCfg( - gpu_max_rigid_patch_count=4 * 5 * 2**15, - gpu_found_lost_pairs_capacity=2**26, - ) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = lift.PhysicsCfg().newton_mjwarp - default = newton_mjwarp - - @configclass class KukaAllegroSceneCfg(lift.SceneCfg): """KukaAllegro scene for the Lift and Reorient tasks. @@ -105,7 +88,6 @@ class KukaAllegroMixinCfg: def __post_init__(self: lift.ReorientEnvCfg): super().__post_init__() - self.sim.physics = KukaAllegroPhysicsCfg() self.commands.object_pose.body_name = "palm_link" events = self.events.conditional_reset.params["terms"] events["reset_robot_wrist_joint"].params["asset_cfg"] = SceneEntityCfg("robot", joint_names="iiwa7_joint_7") diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/lift_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/lift_env_cfg.py index 6def835fa8e2..8ce93bf7150f 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/lift_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/lift_env_cfg.py @@ -6,6 +6,7 @@ from dataclasses import MISSING from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg, NewtonCollisionPipelineCfg, NewtonShapeCfg +from isaaclab_ov.physics import OvPhysxCfg from isaaclab_physx.physics import PhysxCfg import isaaclab.sim as sim_utils @@ -490,6 +491,10 @@ class PhysicsCfg(PresetCfg): gpu_max_rigid_patch_count=4 * 5 * 2**15, gpu_found_lost_pairs_capacity=2**26, ) + ovphysx = OvPhysxCfg( + gpu_max_rigid_patch_count=4 * 5 * 2**15, + gpu_found_lost_pairs_capacity=2**26, + ) newton_mjwarp = NewtonCfg( solver_cfg=MJWarpSolverCfg( solver="newton", @@ -509,7 +514,7 @@ class PhysicsCfg(PresetCfg): num_substeps=2, debug_mode=False, ) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) + physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) default = newton_mjwarp 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 f2b96e28d0b5..47bd12334c24 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 @@ -3,45 +3,23 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import AnymalDRoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=60, - nconmax=25, - cone="elliptic", - impratio=100.0, - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = newton_mjwarp - - @configclass class AnymalDFlatEnvCfg(AnymalDRoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 60 + newton_mjwarp.solver_cfg.nconmax = 25 + newton_mjwarp.solver_cfg.cone = "elliptic" + newton_mjwarp.solver_cfg.impratio = 100.0 + self.sim.physics.default = newton_mjwarp # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None 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 21ba95740cdb..c3ddf051d08e 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 @@ -3,46 +3,21 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import CassieRoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=52, - nconmax=15, - cone="pyramidal", - impratio=1.0, - integrator="implicitfast", - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = newton_mjwarp - - @configclass class CassieFlatEnvCfg(CassieRoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 52 + newton_mjwarp.solver_cfg.nconmax = 15 + self.sim.physics.default = newton_mjwarp # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/cassie/rough_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/cassie/rough_env_cfg.py index 6a9bcf6d2284..ea76fc0fb5ff 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/cassie/rough_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/cassie/rough_env_cfg.py @@ -58,8 +58,6 @@ class CassieRoughEnvCfg(LocomotionVelocityRoughEnvCfg): def __post_init__(self): super().__post_init__() - # sim - self.sim.physics.newton_mjwarp.num_substeps = 2 # scene self.scene.robot = CASSIE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") self.scene.robot.actuators["legs"].armature = preset(default=0.0, newton_mjwarp=0.02) 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 5a53be0c3ee3..106494f29110 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 @@ -3,47 +3,22 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - from isaaclab.managers import SceneEntityCfg -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import G1RoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=95, - nconmax=10, - cone="pyramidal", - impratio=1.0, - integrator="implicitfast", - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = newton_mjwarp - - @configclass class G1FlatEnvCfg(G1RoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 95 + newton_mjwarp.solver_cfg.nconmax = 10 + self.sim.physics.default = newton_mjwarp # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/rough_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/rough_env_cfg.py index 622f8e924723..319bae822577 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/rough_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/velocity/config/g1/rough_env_cfg.py @@ -113,7 +113,6 @@ def __post_init__(self): # physics self.sim.physics.newton_mjwarp.solver_cfg.njmax = 300 - self.sim.physics.newton_mjwarp.num_substeps = 2 # scene self.scene.robot = G1_MINIMAL_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") self.scene.height_scanner.prim_path = "{ENV_REGEX_NS}/Robot/torso_link" 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 bcb90551d801..838dfc880333 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 @@ -3,46 +3,21 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import UnitreeGo2RoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=65, - nconmax=35, - cone="pyramidal", - impratio=1.0, - integrator="implicitfast", - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = newton_mjwarp - - @configclass class UnitreeGo2FlatEnvCfg(UnitreeGo2RoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 65 + newton_mjwarp.solver_cfg.nconmax = 35 + self.sim.physics.default = newton_mjwarp # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None 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 1e77fdb16f3f..de70bbc6e780 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 @@ -3,46 +3,21 @@ # # SPDX-License-Identifier: BSD-3-Clause -from isaaclab_newton.physics import KaminoPADMMSolverCfg, MJWarpSolverCfg, NewtonCfg -from isaaclab_ov.physics import OvPhysxCfg -from isaaclab_physx.physics import PhysxCfg - -from isaaclab.physics import PhysxAutoCfg -from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass -from isaaclab_tasks.utils import PresetCfg - from .rough_env_cfg import H1RoughEnvCfg -@configclass -class PhysicsCfg(PresetCfg): - isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - newton_mjwarp = NewtonCfg( - solver_cfg=MJWarpSolverCfg( - njmax=65, - nconmax=15, - cone="pyramidal", - impratio=1.0, - integrator="implicitfast", - ), - num_substeps=1, - debug_mode=False, - ) - newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) - default = newton_mjwarp - - @configclass class H1FlatEnvCfg(H1RoughEnvCfg): - sim: SimulationCfg = SimulationCfg(physics=PhysicsCfg()) - def __post_init__(self): super().__post_init__() + # physics + newton_mjwarp = self.sim.physics.newton_mjwarp + newton_mjwarp.solver_cfg.njmax = 65 + newton_mjwarp.solver_cfg.nconmax = 15 + self.sim.physics.default = newton_mjwarp # scene self.scene.terrain.terrain_type = "plane" self.scene.terrain.terrain_generator = None 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 2f260dbccf2b..5f94c3a29759 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 @@ -6,7 +6,13 @@ import math from dataclasses import MISSING -from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg, NewtonCollisionPipelineCfg, NewtonShapeCfg +from isaaclab_newton.physics import ( + KaminoPADMMSolverCfg, + MJWarpSolverCfg, + NewtonCfg, + NewtonCollisionPipelineCfg, + NewtonShapeCfg, +) from isaaclab_ov.physics import OvPhysxCfg from isaaclab_physx.physics import PhysxCfg @@ -45,7 +51,7 @@ @configclass class RoughPhysicsCfg(PresetCfg): - """Shared physics preset for all rough-terrain locomotion envs.""" + """Shared backend presets for locomotion velocity environments.""" isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) ovphysx = OvPhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) @@ -60,10 +66,11 @@ class RoughPhysicsCfg(PresetCfg): use_mujoco_contacts=False, ), collision_cfg=NewtonCollisionPipelineCfg(max_triangle_pairs=2_500_000), - num_substeps=1, + num_substeps=2, debug_mode=False, default_shape_cfg=NewtonShapeCfg(margin=0.0, ke=160000.0, kd=1100.0), ) + newton_kamino = NewtonCfg(solver_cfg=KaminoPADMMSolverCfg(max_contacts_per_world=64)) default = newton_mjwarp diff --git a/source/isaaclab_visualizers/changelog.d/shared-physics-preset-ownership.skip b/source/isaaclab_visualizers/changelog.d/shared-physics-preset-ownership.skip new file mode 100644 index 000000000000..d272949d5c51 --- /dev/null +++ b/source/isaaclab_visualizers/changelog.d/shared-physics-preset-ownership.skip @@ -0,0 +1 @@ +# Test-only golden reference update. diff --git a/source/isaaclab_visualizers/test/golden_images/anymal_d/newton-newton-tiled.png b/source/isaaclab_visualizers/test/golden_images/anymal_d/newton-newton-tiled.png index 470a62898d0419bc9a6e4819bcaa036f9915c604..fffdf95e6604bc74a1e09982a1b9a59ca62daf9a 100644 GIT binary patch literal 14184 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 literal 14178 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 lxKj525-a|9#ydM-nYDKH?{{!-E4D$d0 diff --git a/source/isaaclab_visualizers/test/golden_images/anymal_d/newton-newton-viewport.png b/source/isaaclab_visualizers/test/golden_images/anymal_d/newton-newton-viewport.png index 456ab1e74f32c3b51fc1e513ec1466e1a3c9692a..1922f0e84fd593f16f84315be8d8a21a2264f8c0 100644 GIT binary patch literal 17982 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 literal 17931 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