From 985c4f8715b4776d7e4a708bafac25c6a8125213 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 1 Aug 2026 22:40:43 -0700 Subject: [PATCH 1/8] Fix backend defaults and install guidance Make suffixless task configurations select concrete Isaac Sim PhysX while preserving the explicit automatic physx selector. Update optional backend and visualizer errors and documentation to lead with runnable uv commands. --- docs/source/features/hydra.rst | 16 ++-- .../migration/migrating_to_isaaclab_3-0.rst | 21 ++-- .../multi_backend_architecture.rst | 27 +++++- .../core-concepts/physical-backends/index.rst | 20 ++-- .../physical-backends/physx/installation.rst | 6 +- .../physx/supported-features.rst | 10 +- docs/source/overview/environments.rst | 17 ++-- .../augmented_imitation.rst | 11 ++- .../imitation-learning/teleop_imitation.rst | 14 +-- .../rl_existing_scripts.rst | 96 ++++++++----------- docs/source/refs/troubleshooting.rst | 3 +- docs/source/setup/quickstart_details.rst | 11 ++- skills/user/use-presets/examples.md | 11 ++- skills/user/use-presets/reference.md | 12 ++- .../changelog.d/fix-install-hints.rst | 4 + .../isaaclab/sim/converters/_converter_cli.py | 6 +- .../isaaclab/sim/simulation_context.py | 18 ++-- .../isaaclab/visualizers/visualizer_cfg.py | 15 +-- .../changelog.d/fix-install-hints.rst | 5 + .../isaaclab_ov/renderers/ovrtx_renderer.py | 7 +- .../test/test_ovrtx_renderer_contract.py | 2 +- .../changelog.d/fix-ovphysx-install-hint.rst | 5 + .../isaaclab_ovphysx/_runtime.py | 3 +- .../default-isaacsim-physx.major.rst | 6 ++ .../contrib/dr_legs/hold_pose_env_cfg.py | 6 +- .../contrib/dr_legs/walk_env_cfg.py | 4 +- .../agibot/place_toy2box_rmp_rel_env_cfg.py | 2 +- .../config/so101/stack_joint_pos_env_cfg.py | 2 +- .../contrib/stack/stack_env_cfg.py | 2 +- .../velocity/config/a1/flat_env_cfg.py | 2 +- .../velocity/config/anymal_b/flat_env_cfg.py | 2 +- .../velocity/config/anymal_c/flat_env_cfg.py | 2 +- .../velocity/config/digit/rough_env_cfg.py | 2 +- .../velocity/config/go1/flat_env_cfg.py | 2 +- .../velocity/config/spot/flat_env_cfg.py | 8 +- .../core/cabinet/cabinet_direct_env_cfg.py | 2 +- .../core/cabinet/cabinet_env_cfg.py | 4 +- .../core/cartpole/cartpole_direct_env_cfg.py | 2 +- .../core/cartpole/cartpole_manager_env_cfg.py | 2 +- .../dexsuite_kuka_allegro_env_cfg.py | 5 +- .../core/dexsuite/dexsuite_env_cfg.py | 2 +- .../core/handover/handover_env_cfg.py | 6 +- .../config/franka_soft/franka_soft_env_cfg.py | 8 +- .../core/locomotion/ant/ant_direct_env_cfg.py | 2 +- .../locomotion/ant/ant_manager_env_cfg.py | 4 +- .../humanoid/humanoid_direct_env_cfg.py | 2 +- .../humanoid/humanoid_manager_env_cfg.py | 4 +- .../core/reach/reach_env_cfg.py | 2 +- .../allegro_hand/allegro_hand_common.py | 4 +- .../config/shadow_hand/shadow_hand_common.py | 8 +- .../shadow_hand_direct_camera_env_cfg.py | 2 +- .../shadow_hand/shadow_hand_direct_env_cfg.py | 2 +- .../velocity/config/anymal_d/flat_env_cfg.py | 2 +- .../velocity/config/cassie/flat_env_cfg.py | 2 +- .../core/velocity/config/g1/flat_env_cfg.py | 2 +- .../core/velocity/config/go2/flat_env_cfg.py | 2 +- .../core/velocity/config/h1/flat_env_cfg.py | 2 +- .../core/velocity/velocity_env_cfg.py | 2 +- .../stack/test_so101_stack_physics_cfg.py | 2 +- .../test/core/test_dr_legs_physics_presets.py | 4 +- .../test/core/test_preset_kit_decision.py | 30 +++--- .../test/core/test_reach_franka_presets.py | 6 +- .../test/core/test_runtime_compatibility.py | 24 ++--- 63 files changed, 298 insertions(+), 221 deletions(-) create mode 100644 source/isaaclab/changelog.d/fix-install-hints.rst create mode 100644 source/isaaclab_ov/changelog.d/fix-install-hints.rst create mode 100644 source/isaaclab_ovphysx/changelog.d/fix-ovphysx-install-hint.rst create mode 100644 source/isaaclab_tasks/changelog.d/default-isaacsim-physx.major.rst diff --git a/docs/source/features/hydra.rst b/docs/source/features/hydra.rst index 703a531bf26e..57f28fd6b28c 100644 --- a/docs/source/features/hydra.rst +++ b/docs/source/features/hydra.rst @@ -252,7 +252,7 @@ override is given: class PhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default: PhysxAutoCfg = physx + default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg() @configclass @@ -264,11 +264,13 @@ override is given: # Use Newton physics backend python train.py --task=Isaac-Reach-Franka env.physics=newton_mjwarp -For tasks that expose automatic PhysX-family selection, ``physics=physx`` is -resolved at launch time: Isaac Sim PhysX is used when a Kit renderer or Kit viewer -is requested. For fully kit-less runs, OvPhysX is used when the task configures -an OvPhysX alternative; otherwise selection falls back to Isaac Sim PhysX and -requires Kit. Use ``physics=isaacsim_physx`` to force Isaac Sim PhysX. +Tasks that support Isaac Sim PhysX use the concrete ``isaacsim_physx`` variant +by default. The explicit ``physics=physx`` selector opts into automatic +PhysX-family selection at launch time: Isaac Sim PhysX is used when a Kit +renderer or Kit viewer is requested. For fully kit-less runs, OvPhysX is used +when the task configures an OvPhysX alternative; otherwise selection falls back +to Isaac Sim PhysX and requires Kit. This matches renderer selection, where +``isaacsim_rtx`` is the concrete default and ``renderer=rtx`` is automatic. The ``default`` field can be set to ``None`` to make an optional feature that is disabled unless explicitly selected: @@ -321,7 +323,7 @@ Physics backend selection uses the same preset system. A task can define a isaacsim_physx=isaacsim_physx, ovphysx=ovphysx, ) - default = physx + default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg(njmax=5, nconmax=3), num_substeps=1, diff --git a/docs/source/migration/migrating_to_isaaclab_3-0.rst b/docs/source/migration/migrating_to_isaaclab_3-0.rst index f59106d8ebd5..561f60b4ad4f 100644 --- a/docs/source/migration/migrating_to_isaaclab_3-0.rst +++ b/docs/source/migration/migrating_to_isaaclab_3-0.rst @@ -652,20 +652,23 @@ when no CLI override is given. Other fields are named presets selectable with .. code-block:: python - from isaaclab_tasks.utils import PresetCfg + from isaaclab.physics import PhysxAutoCfg from isaaclab.utils.configclass import configclass + from isaaclab_tasks.utils import PresetCfg @configclass class MyPhysicsCfg(PresetCfg): - default: PhysxCfg = PhysxCfg(...) # used when no override is given - physx: PhysxCfg = PhysxCfg(...) # selected by physics=physx + isaacsim_physx: PhysxCfg = PhysxCfg(...) + physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) + default: PhysxCfg = isaacsim_physx # used when no override is given newton_mjwarp: NewtonCfg = NewtonCfg(...) # selected by physics=newton_mjwarp Selecting a preset at launch ----------------------------- -Pass ``physics=newton_mjwarp`` (or ``physics=physx``) on the CLI to swap the entire config section. -The legacy ``presets=NAME`` form still works for the same values. +Pass ``physics=newton_mjwarp`` on the CLI to swap the entire config section. +Use ``physics=physx`` to opt into automatic PhysX-family selection. The legacy +``presets=NAME`` form still works for the same values. .. code-block:: bash @@ -673,7 +676,7 @@ The legacy ``presets=NAME`` form still works for the same values. uv run --extra isaacsim isaaclab train --rl_library rsl_rl \ --task Isaac-Open-Drawer-Franka-Direct physics=newton_mjwarp - # Run with default (PhysX) backend + # Run with default (concrete Isaac Sim PhysX) backend uv run --extra isaacsim isaaclab train --rl_library rsl_rl \ --task Isaac-Open-Drawer-Franka-Direct @@ -697,14 +700,16 @@ subclass that carries both a PhysX and a Newton variant. .. code-block:: python + from isaaclab.physics import PhysxAutoCfg from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg from isaaclab_physx.physics import PhysxCfg from isaaclab_tasks.utils import PresetCfg @configclass class ReachPhysicsCfg(PresetCfg): - default: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) - physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) + isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) + physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) + default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=20, nconmax=20, ls_iterations=20, diff --git a/docs/source/overview/core-concepts/multi_backend_architecture.rst b/docs/source/overview/core-concepts/multi_backend_architecture.rst index 5dc4a02400e1..fd4035cc9bcc 100644 --- a/docs/source/overview/core-concepts/multi_backend_architecture.rst +++ b/docs/source/overview/core-concepts/multi_backend_architecture.rst @@ -171,6 +171,7 @@ below shows only the physics-related fields: .. code-block:: python from isaaclab.envs import DirectRLEnvCfg + from isaaclab.physics import PhysxAutoCfg from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg @@ -180,12 +181,16 @@ below shows only the physics-related fields: @configclass class CartpolePhysicsCfg(PresetCfg): - default: PhysxCfg = PhysxCfg() - physx: PhysxCfg = PhysxCfg() + isaacsim_physx: PhysxCfg = PhysxCfg() + ovphysx: OvPhysxCfg = OvPhysxCfg() + physx: PhysxAutoCfg = PhysxAutoCfg( + isaacsim_physx=isaacsim_physx, + ovphysx=ovphysx, + ) + default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg(njmax=5, nconmax=3) ) - ovphysx: OvPhysxCfg = OvPhysxCfg() @configclass class CartpoleEnvCfg(DirectRLEnvCfg): @@ -199,9 +204,12 @@ Users then select a physics backend at the command line: .. code-block:: bash - # Default (PhysX) + # Default (concrete Isaac Sim PhysX) uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Direct + # Automatic PhysX-family selection + uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Direct physics=physx + # MJWarp (Newton backend) uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Direct physics=newton_mjwarp @@ -212,15 +220,24 @@ Users then select a physics backend at the command line: .. code-block:: bash - # Default (PhysX) + # Default (concrete Isaac Sim PhysX) ./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct + # Automatic PhysX-family selection + ./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct physics=physx + # MJWarp (Newton backend) ./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct physics=newton_mjwarp # OvPhysX backend ./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct physics=ovphysx +When a task supports Isaac Sim PhysX, its ``default`` variant is the concrete +``isaacsim_physx`` configuration. The ``physics=physx`` selector is opt-in and +chooses between Isaac Sim PhysX and OvPhysX at launch time according to whether +the resolved runtime requires Kit. This mirrors renderer presets: the default is +concrete ``isaacsim_rtx``, while ``renderer=rtx`` opts into automatic selection. + The Physics Manager ------------------- diff --git a/docs/source/overview/core-concepts/physical-backends/index.rst b/docs/source/overview/core-concepts/physical-backends/index.rst index 5923861bb9a3..54b1946d6e48 100644 --- a/docs/source/overview/core-concepts/physical-backends/index.rst +++ b/docs/source/overview/core-concepts/physical-backends/index.rst @@ -131,17 +131,23 @@ declares all three backends side by side: .. code-block:: python - from isaaclab_physx.physics import PhysxCfg + from isaaclab.physics import PhysxAutoCfg from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg from isaaclab_ovphysx.physics import OvPhysxCfg + from isaaclab_physx.physics import PhysxCfg @configclass class CartpolePhysicsCfg(PresetCfg): - default: PhysxCfg = PhysxCfg() - physx: PhysxCfg = PhysxCfg() - newton_mjwarp: NewtonCfg = NewtonCfg(solver_cfg=MJWarpSolverCfg()) + isaacsim_physx: PhysxCfg = PhysxCfg() ovphysx: OvPhysxCfg = OvPhysxCfg() + physx: PhysxAutoCfg = PhysxAutoCfg( + isaacsim_physx=isaacsim_physx, + ovphysx=ovphysx, + ) + default: PhysxCfg = isaacsim_physx + newton_mjwarp: NewtonCfg = NewtonCfg(solver_cfg=MJWarpSolverCfg()) -Users then select the backend at the command line via ``presets=`` or by -overriding the physics field directly. See :ref:`hydra-backend-solver-presets` for -the full Hydra interaction. +With no selector, the task uses concrete Isaac Sim PhysX. Users can select a +backend with ``physics=``; ``physics=physx`` explicitly opts into automatic +selection between the configured PhysX-family implementations. See +:ref:`hydra-backend-solver-presets` for the full Hydra interaction. diff --git a/docs/source/overview/core-concepts/physical-backends/physx/installation.rst b/docs/source/overview/core-concepts/physical-backends/physx/installation.rst index d56027cc34ad..ac49feca0371 100644 --- a/docs/source/overview/core-concepts/physical-backends/physx/installation.rst +++ b/docs/source/overview/core-concepts/physical-backends/physx/installation.rst @@ -37,5 +37,7 @@ default preset: ./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Cartpole --num_envs 128 -The ``default`` preset on most tasks resolves to PhysX. You can also pass -``physics=physx`` explicitly on tasks that declare multi-backend physics presets. +Environments that support Isaac Sim PhysX use the concrete ``isaacsim_physx`` +variant by default. Pass ``physics=physx`` explicitly to opt into automatic +PhysX-family selection between Isaac Sim PhysX and OvPhysX on tasks that support +both. diff --git a/docs/source/overview/core-concepts/physical-backends/physx/supported-features.rst b/docs/source/overview/core-concepts/physical-backends/physx/supported-features.rst index 760fb279fea2..43be758eab87 100644 --- a/docs/source/overview/core-concepts/physical-backends/physx/supported-features.rst +++ b/docs/source/overview/core-concepts/physical-backends/physx/supported-features.rst @@ -3,8 +3,8 @@ Supported Features PhysX is the broadest backend in Isaac Lab. It is the reference for behaviour parity and supports every public asset, sensor, and renderer surface in the -framework. Tasks built before Isaac Lab 3.0 ran on PhysX, and the bulk of the -shipped tasks still default to the PhysX preset. +framework. Tasks built before Isaac Lab 3.0 ran on PhysX. Environments that +support Isaac Sim PhysX use its concrete ``isaacsim_physx`` preset by default. The summary below is intentionally coarse; consult each component's API documentation for fine-grained capability details. @@ -51,8 +51,10 @@ Tasks and Workflows ------------------- * Direct and Manager-based workflows -* All ``isaaclab_tasks`` environments default to the PhysX preset unless the - task explicitly opts in to a different backend +* ``isaaclab_tasks`` environments default to concrete Isaac Sim PhysX whenever + they support it. Backend-specific environments without an Isaac Sim PhysX + implementation, such as closed-loop or cloth tasks, retain their supported + backend as the default. * Imitation learning and motion-generation pipelines (Mimic, motion generators) diff --git a/docs/source/overview/environments.rst b/docs/source/overview/environments.rst index 055651964bd6..30c910d2c603 100644 --- a/docs/source/overview/environments.rst +++ b/docs/source/overview/environments.rst @@ -90,13 +90,16 @@ modes. The **Presets** column in each table below is divided into three labeled * **physics=** — physics-backend name passed as ``physics=NAME`` (e.g. ``physx``, ``isaacsim_physx``, ``newton_mjwarp``, - ``newton_kamino``, ``ovphysx``, ``newton_mjwarp_vbd_proxy``). On tasks that - expose automatic PhysX-family selection, ``physx`` uses Isaac Sim PhysX when - Kit is required and OvPhysX otherwise when the task supports it. Tasks - without an OvPhysX alternative fall back to Isaac Sim PhysX; use - ``isaacsim_physx`` to force Isaac Sim PhysX directly. + ``newton_kamino``, ``ovphysx``, ``newton_mjwarp_vbd_proxy``). Environments + that support Isaac Sim PhysX use the concrete ``isaacsim_physx`` variant by + default. Select ``physics=physx`` to opt into automatic PhysX-family + selection: it uses Isaac Sim PhysX when Kit is required and OvPhysX otherwise + when the task supports it. Tasks without an OvPhysX alternative fall back to + Isaac Sim PhysX. * **renderer=** — renderer-backend name passed as ``renderer=NAME`` - (e.g. ``isaacsim_rtx``, ``newton_renderer``, ``ovrtx``, ``rtx``) + (e.g. ``isaacsim_rtx``, ``newton_renderer``, ``ovrtx``, ``rtx``). Cameras + using the multi-backend renderer config default to concrete ``isaacsim_rtx``; + select ``renderer=rtx`` to opt into automatic RTX-family selection. * **presets=** — environment-specific (domain) preset name passed as ``presets=NAME[,NAME,...]`` (e.g. ``rgb``, ``depth``, ``single_camera``, ``duo_camera``) @@ -109,7 +112,7 @@ supported and causes configuration validation to fail. Pass ``--task= --help`` to a training script to see all available preset names grouped by selector type at the command line, or run -``./isaaclab.sh -p scripts/environments/list_envs.py --show_presets`` +``uv run python scripts/environments/list_envs.py --show_presets`` to list presets for every registered environment. See the :doc:`Hydra preset system documentation ` diff --git a/docs/source/overview/imitation-learning/augmented_imitation.rst b/docs/source/overview/imitation-learning/augmented_imitation.rst index 363f655c9aab..8ebba1e0d95c 100644 --- a/docs/source/overview/imitation-learning/augmented_imitation.rst +++ b/docs/source/overview/imitation-learning/augmented_imitation.rst @@ -311,8 +311,11 @@ To install the robomimic framework, use the following commands: # install the dependencies sudo apt install cmake build-essential - # install python module (for robomimic) - ./isaaclab.sh -i robomimic + # resolve and verify Robomimic in the uv-managed environment + uv run --extra mimic python -c "import robomimic" + +For a legacy environment, install the same dependencies with +``./isaaclab.sh -i mimic``. Training an agent ^^^^^^^^^^^^^^^^^ @@ -325,7 +328,7 @@ Using the generated data, we can now train a visuomotor BC agent for ``IsaacCont .. code:: bash - uv run python scripts/imitation_learning/robomimic/train.py \ + uv run --extra mimic python scripts/imitation_learning/robomimic/train.py \ --task IsaacContrib-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos --algo bc \ --dataset ./datasets/mimic_cosmos_dataset.hdf5 \ --name bc_rnn_image_franka_stack_mimic_cosmos @@ -417,7 +420,7 @@ Example usage for the cube stacking task: .. code:: bash - uv run python scripts/imitation_learning/robomimic/robust_eval.py \ + uv run --extra mimic python scripts/imitation_learning/robomimic/robust_eval.py \ --task IsaacContrib-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos \ --input_dir logs/robomimic/IsaacContrib-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos/bc_rnn_image_franka_stack_mimic_cosmos/*/models \ --log_dir robust_results/bc_rnn_image_franka_stack_mimic_cosmos \ diff --git a/docs/source/overview/imitation-learning/teleop_imitation.rst b/docs/source/overview/imitation-learning/teleop_imitation.rst index 958f38f15f19..0011baecbfc3 100644 --- a/docs/source/overview/imitation-learning/teleop_imitation.rst +++ b/docs/source/overview/imitation-learning/teleop_imitation.rst @@ -459,9 +459,11 @@ Install the Robomimic framework using the following command: # install the dependencies sudo apt install cmake build-essential - # install python module (for robomimic) - ./isaaclab.sh -i robomimic + # resolve and verify Robomimic in the uv-managed environment + uv run --extra mimic python -c "import robomimic" +For a legacy environment, install the same dependencies with +``./isaaclab.sh -i mimic``. Train an Agent @@ -479,7 +481,7 @@ Using the Isaac Lab Mimic generated data we can now train a state-based BC RNN a .. code:: bash - uv run python scripts/imitation_learning/robomimic/train.py \ + uv run --extra mimic python scripts/imitation_learning/robomimic/train.py \ --task IsaacContrib-Stack-Cube-Franka-IK-Rel \ --algo bc \ --dataset ./datasets/generated_dataset.hdf5 @@ -489,7 +491,7 @@ Using the Isaac Lab Mimic generated data we can now train a state-based BC RNN a .. code:: bash - uv run python scripts/imitation_learning/robomimic/train.py \ + uv run --extra mimic python scripts/imitation_learning/robomimic/train.py \ --task IsaacContrib-Stack-Cube-Franka-IK-Rel-Visuomotor \ --algo bc \ --dataset ./datasets/generated_dataset.hdf5 @@ -512,7 +514,7 @@ Run the trained policy to visualize the results: .. code:: bash - uv run python scripts/imitation_learning/robomimic/play.py \ + uv run --extra mimic python scripts/imitation_learning/robomimic/play.py \ --task IsaacContrib-Stack-Cube-Franka-IK-Rel \ --viz kit \ --num_rollouts 50 \ @@ -523,7 +525,7 @@ Run the trained policy to visualize the results: .. code:: bash - uv run python scripts/imitation_learning/robomimic/play.py \ + uv run --extra mimic python scripts/imitation_learning/robomimic/play.py \ --task IsaacContrib-Stack-Cube-Franka-IK-Rel-Visuomotor \ --viz kit \ --num_rollouts 50 \ diff --git a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst index d3b99cb3d186..4d16a9b9efc7 100644 --- a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst +++ b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst @@ -180,23 +180,21 @@ RL-Games .. code:: bash - # install python module (for rl-games) - ./isaaclab.sh -i rl_games # run command for training - uv run isaaclab train --rl_library rl_games --task Isaac-Ant + uv run --extra rl-games isaaclab train --rl_library rl_games --task Isaac-Ant # run command for training with Newton backend - uv run isaaclab train --rl_library rl_games --task Isaac-Ant physics=newton_mjwarp + uv run --extra rl-games isaaclab train --rl_library rl_games --task Isaac-Ant physics=newton_mjwarp # run command for playing with 32 environments - uv run isaaclab play --rl_library rl_games --task Isaac-Ant --num_envs 32 --checkpoint /PATH/TO/model.pth + uv run --extra rl-games isaaclab play --rl_library rl_games --task Isaac-Ant --num_envs 32 --checkpoint /PATH/TO/model.pth # run command for recording video of a trained agent - uv run --extra video isaaclab play --rl_library rl_games --task Isaac-Ant --video --video_length 200 + uv run --extra rl-games --extra video isaaclab play --rl_library rl_games --task Isaac-Ant --video --video_length 200 .. tab-item:: isaaclab.sh / isaaclab.bat .. code:: bash # install python module (for rl-games) - ./isaaclab.sh -i rl_games + ./isaaclab.sh -i 'rl[rl-games]' # run command for training ./isaaclab.sh train --rl_library rl_games --task Isaac-Ant # run command for training with Newton backend @@ -212,7 +210,7 @@ RL-Games .. code:: batch :: install python module (for rl-games) - isaaclab.bat -i rl_games + isaaclab.bat -i "rl[rl-games]" :: run command for training isaaclab.bat train --rl_library rl_games --task Isaac-Ant :: run command for training with Newton backend @@ -240,23 +238,21 @@ RSL-RL .. code:: bash - # install python module (for rsl-rl) - ./isaaclab.sh -i rsl_rl # run command for training - uv run isaaclab train --rl_library rsl_rl --task Isaac-Reach-Franka + uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Reach-Franka # run command for training with Newton backend - uv run isaaclab train --rl_library rsl_rl --task Isaac-Reach-Franka physics=newton_mjwarp + uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Reach-Franka physics=newton_mjwarp # run command for playing with 32 environments - uv run isaaclab play --rl_library rsl_rl --task Isaac-Reach-Franka --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt + uv run --extra rsl-rl isaaclab play --rl_library rsl_rl --task Isaac-Reach-Franka --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt # run command for recording video of a trained agent - uv run --extra video isaaclab play --rl_library rsl_rl --task Isaac-Reach-Franka --video --video_length 200 + uv run --extra rsl-rl --extra video isaaclab play --rl_library rsl_rl --task Isaac-Reach-Franka --video --video_length 200 .. tab-item:: isaaclab.sh / isaaclab.bat .. code:: bash # install python module (for rsl-rl) - ./isaaclab.sh -i rsl_rl + ./isaaclab.sh -i 'rl[rsl-rl]' # run command for training ./isaaclab.sh train --rl_library rsl_rl --task Isaac-Reach-Franka # run command for training with Newton backend @@ -272,7 +268,7 @@ RSL-RL .. code:: batch :: install python module (for rsl-rl) - isaaclab.bat -i rsl_rl + isaaclab.bat -i "rl[rsl-rl]" :: run command for training isaaclab.bat train --rl_library rsl_rl --task Isaac-Reach-Franka :: run command for training with Newton backend @@ -297,23 +293,21 @@ RSL-RL .. code:: bash - # install python module (for rsl-rl) - ./isaaclab.sh -i rsl_rl # run command for rl training of the teacher agent - uv run isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD + uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD # run command for rl training of the teacher agent with Newton backend - uv run isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD physics=newton_mjwarp + uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD physics=newton_mjwarp # run command for distilling the teacher agent into a student agent - uv run isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name + uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name # run command for playing the student with 64 environments - uv run isaaclab play --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point + uv run --extra rsl-rl isaaclab play --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point .. tab-item:: isaaclab.sh / isaaclab.bat .. code:: bash # install python module (for rsl-rl) - ./isaaclab.sh -i rsl_rl + ./isaaclab.sh -i 'rl[rsl-rl]' # run command for rl training of the teacher agent ./isaaclab.sh train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD # run command for rl training of the teacher agent with Newton backend @@ -329,7 +323,7 @@ RSL-RL .. code:: batch :: install python module (for rsl-rl) - isaaclab.bat -i rsl_rl + isaaclab.bat -i "rl[rsl-rl]" :: run command for rl training of the teacher agent isaaclab.bat train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD :: run command for rl training of the teacher agent with Newton backend @@ -361,23 +355,21 @@ SKRL .. code:: bash - # install python module (for skrl) - ./isaaclab.sh -i skrl # run command for training - uv run isaaclab train --rl_library skrl --task Isaac-Reach-Franka + uv run --extra skrl isaaclab train --rl_library skrl --task Isaac-Reach-Franka # run command for training with Newton backend - uv run isaaclab train --rl_library skrl --task Isaac-Reach-Franka physics=newton_mjwarp + uv run --extra skrl isaaclab train --rl_library skrl --task Isaac-Reach-Franka physics=newton_mjwarp # run command for playing with 32 environments - uv run isaaclab play --rl_library skrl --task Isaac-Reach-Franka --num_envs 32 --checkpoint /PATH/TO/model.pt + uv run --extra skrl isaaclab play --rl_library skrl --task Isaac-Reach-Franka --num_envs 32 --checkpoint /PATH/TO/model.pt # run command for recording video of a trained agent - uv run --extra video isaaclab play --rl_library skrl --task Isaac-Reach-Franka --video --video_length 200 + uv run --extra skrl --extra video isaaclab play --rl_library skrl --task Isaac-Reach-Franka --video --video_length 200 .. tab-item:: isaaclab.sh / isaaclab.bat .. code:: bash # install python module (for skrl) - ./isaaclab.sh -i skrl + ./isaaclab.sh -i 'rl[skrl]' # run command for training ./isaaclab.sh train --rl_library skrl --task Isaac-Reach-Franka # run command for training with Newton backend @@ -393,7 +385,7 @@ SKRL .. code:: batch :: install python module (for skrl) - isaaclab.bat -i skrl + isaaclab.bat -i "rl[skrl]" :: run command for training isaaclab.bat train --rl_library skrl --task Isaac-Reach-Franka :: run command for training with Newton backend @@ -432,7 +424,7 @@ SKRL .. code:: bash # install python module (for skrl) - ./isaaclab.sh -i skrl + uv run --extra skrl python -c "import skrl" # install JAX for CUDA 12 uv pip install -U "jax[cuda12]" # install skrl dependencies for JAX @@ -443,7 +435,7 @@ SKRL .. code:: bash # install python module (for skrl) - ./isaaclab.sh -i skrl + ./isaaclab.sh -i 'rl[skrl]' # install JAX for CUDA 12 ./isaaclab.sh -p -m pip install -U "jax[cuda12]" # install skrl dependencies for JAX @@ -459,7 +451,7 @@ SKRL .. code:: bash # install python module (for skrl) - ./isaaclab.sh -i skrl + uv run --extra skrl python -c "import skrl" # install JAX for CUDA 13 uv pip install -U "jax[cuda13]" # install skrl dependencies for JAX @@ -470,7 +462,7 @@ SKRL .. code:: bash # install python module (for skrl) - ./isaaclab.sh -i skrl + ./isaaclab.sh -i 'rl[skrl]' # install JAX for CUDA 13 ./isaaclab.sh -p -m pip install -U "jax[cuda13]" # install skrl dependencies for JAX @@ -483,13 +475,13 @@ SKRL .. code:: bash # run command for training - uv run isaaclab train --rl_library skrl --task Isaac-Reach-Franka --ml_framework jax + uv run --extra skrl isaaclab train --rl_library skrl --task Isaac-Reach-Franka --ml_framework jax # run command for training with Newton backend - uv run isaaclab train --rl_library skrl --task Isaac-Reach-Franka --ml_framework jax presets=newton_mjwarp + uv run --extra skrl isaaclab train --rl_library skrl --task Isaac-Reach-Franka --ml_framework jax presets=newton_mjwarp # run command for playing with 32 environments - uv run isaaclab play --rl_library skrl --task Isaac-Reach-Franka --num_envs 32 --ml_framework jax --checkpoint /PATH/TO/model.pt + uv run --extra skrl isaaclab play --rl_library skrl --task Isaac-Reach-Franka --num_envs 32 --ml_framework jax --checkpoint /PATH/TO/model.pt # run command for recording video of a trained agent - uv run --extra video isaaclab play --rl_library skrl --task Isaac-Reach-Franka --ml_framework jax --video --video_length 200 + uv run --extra skrl --extra video isaaclab play --rl_library skrl --task Isaac-Reach-Franka --ml_framework jax --video --video_length 200 .. tab-item:: isaaclab.sh / isaaclab.bat @@ -518,19 +510,17 @@ SKRL .. code:: bash - # install python module (for skrl) - ./isaaclab.sh -i skrl # run command for training with the MAPPO algorithm (IPPO is also supported) - uv run isaaclab train --rl_library skrl --task Isaac-Shadow-Handover-Direct --algorithm MAPPO + uv run --extra skrl isaaclab train --rl_library skrl --task Isaac-Shadow-Handover-Direct --algorithm MAPPO # run command for playing with 32 environments with the MAPPO algorithm (IPPO is also supported) - uv run isaaclab play --rl_library skrl --task Isaac-Shadow-Handover-Direct --num_envs 32 --algorithm MAPPO --checkpoint /PATH/TO/model.pt + uv run --extra skrl isaaclab play --rl_library skrl --task Isaac-Shadow-Handover-Direct --num_envs 32 --algorithm MAPPO --checkpoint /PATH/TO/model.pt .. tab-item:: isaaclab.sh / isaaclab.bat .. code:: bash # install python module (for skrl) - ./isaaclab.sh -i skrl + ./isaaclab.sh -i 'rl[skrl]' # run command for training with the MAPPO algorithm (IPPO is also supported) ./isaaclab.sh train --rl_library skrl --task Isaac-Shadow-Handover-Direct --algorithm MAPPO # run command for playing with 32 environments with the MAPPO algorithm (IPPO is also supported) @@ -542,7 +532,7 @@ SKRL .. code:: batch :: install python module (for skrl) - isaaclab.bat -i skrl + isaaclab.bat -i "rl[skrl]" :: run command for training with the MAPPO algorithm (IPPO is also supported) isaaclab.bat train --rl_library skrl --task Isaac-Shadow-Handover-Direct --algorithm MAPPO :: run command for playing with 32 environments with the MAPPO algorithm (IPPO is also supported) @@ -567,23 +557,21 @@ Stable-Baselines3 .. code:: bash - # install python module (for stable-baselines3) - ./isaaclab.sh -i sb3 # run command for training - uv run isaaclab train --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 + uv run --extra sb3 isaaclab train --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 # run command for training with Newton backend - uv run isaaclab train --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 physics=newton_mjwarp + uv run --extra sb3 isaaclab train --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 physics=newton_mjwarp # run command for playing with 32 environments - uv run isaaclab play --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 --num_envs 32 --checkpoint /PATH/TO/model.zip + uv run --extra sb3 isaaclab play --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 --num_envs 32 --checkpoint /PATH/TO/model.zip # run command for recording video of a trained agent - uv run --extra video isaaclab play --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 --video --video_length 200 + uv run --extra sb3 --extra video isaaclab play --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 --video --video_length 200 .. tab-item:: isaaclab.sh / isaaclab.bat .. code:: bash # install python module (for stable-baselines3) - ./isaaclab.sh -i sb3 + ./isaaclab.sh -i 'rl[sb3]' # run command for training ./isaaclab.sh train --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 # run command for training with Newton backend @@ -599,7 +587,7 @@ Stable-Baselines3 .. code:: batch :: install python module (for stable-baselines3) - isaaclab.bat -i sb3 + isaaclab.bat -i "rl[sb3]" :: run command for training isaaclab.bat train --rl_library sb3 --task IsaacContrib-Velocity-Flat-UnitreeA1 :: run command for training with Newton backend diff --git a/docs/source/refs/troubleshooting.rst b/docs/source/refs/troubleshooting.rst index 6b466b0b0c2a..8511d2086e68 100644 --- a/docs/source/refs/troubleshooting.rst +++ b/docs/source/refs/troubleshooting.rst @@ -93,7 +93,8 @@ Isaac Sim version before installing Isaac Lab. ``ModuleNotFoundError: No module named 'rsl_rl'`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Include the RL framework: ``./isaaclab.sh -i rsl_rl``, or use +Run the command with the RSL-RL extra: ``uv run --extra rsl-rl ``. For +the legacy installer, use ``./isaaclab.sh -i 'rl[rsl-rl]'`` or ``./isaaclab.sh -i`` to install all frameworks. Crash in ``libusd_tf`` / USD Symbol Collision with OVRTX diff --git a/docs/source/setup/quickstart_details.rst b/docs/source/setup/quickstart_details.rst index ad4cc9663d3f..d9dc2f9400c5 100644 --- a/docs/source/setup/quickstart_details.rst +++ b/docs/source/setup/quickstart_details.rst @@ -32,6 +32,11 @@ options (observation modes, camera configs, etc.). They fold into Hydra override .. code-block:: bash + # Default: concrete Isaac Sim PhysX + uv run isaaclab train --rl_library rsl_rl \ + --task=Isaac-Cartpole-Direct \ + --num_envs=4096 + # Kit-less: Newton MJWarp + Newton visualizer uv run isaaclab train --rl_library rsl_rl \ --task=Isaac-Cartpole-Direct \ @@ -80,18 +85,18 @@ Available Presets **Physics backends** (``physics=NAME``): +- ``isaacsim_physx`` — concrete PhysX via Isaac Sim / Kit; this is the default for environments that support it - ``physx`` — automatic PhysX-family selection: Isaac Sim PhysX when Kit is required, otherwise OvPhysX when the task supports it; tasks without OvPhysX support fall back to Isaac Sim PhysX -- ``isaacsim_physx`` — force PhysX via Isaac Sim / Kit - ``newton_mjwarp`` — Newton with the MuJoCo-Warp solver - ``newton_kamino`` — Newton with the Kamino solver (beta, limited tasks) - ``ovphysx`` — OV PhysX (kit-less; incompatible with ``--visualizer kit``) **Renderer backends** (``renderer=NAME``): -- ``isaacsim_rtx`` — Isaac Sim RTX (default with Isaac Sim) +- ``isaacsim_rtx`` — concrete Isaac Sim RTX; this is the default for cameras that use the multi-backend renderer config - ``newton_renderer`` — Newton Warp renderer - ``ovrtx`` — OV RTX renderer (kit-less) -- ``rtx`` — Automatic RTX renderer selection +- ``rtx`` — automatic RTX renderer selection Automatic RTX selection is available only when the camera exposes the renderer choices with :class:`~isaaclab_tasks.utils.presets.MultiBackendRendererCfg`: diff --git a/skills/user/use-presets/examples.md b/skills/user/use-presets/examples.md index 6e584647aafa..1490cdaa6884 100644 --- a/skills/user/use-presets/examples.md +++ b/skills/user/use-presets/examples.md @@ -28,17 +28,21 @@ This is enough when the task only supports PhysX and there are no renderer, sens Use `PresetCfg` when the same task supports multiple physics backends. ```python +from isaaclab.physics import PhysxAutoCfg from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg +from isaaclab_ovphysx.physics import OvPhysxCfg from isaaclab_physx.physics import PhysxCfg from isaaclab_tasks.utils import PresetCfg @configclass class PhysicsCfg(PresetCfg): - default = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) - physx = default + isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) + ovphysx = OvPhysxCfg() + physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) + default = isaacsim_physx newton_mjwarp = NewtonCfg( solver_cfg=MJWarpSolverCfg(njmax=120, nconmax=15), num_substeps=1, @@ -53,6 +57,7 @@ class MyMultiBackendEnvCfg: Command examples: ```bash +uv run python scripts/environments/random_agent.py --task Isaac-Ant --num_envs 4 uv run python scripts/environments/random_agent.py --task Isaac-Ant --num_envs 4 physics=physx uv run python scripts/environments/random_agent.py --task Isaac-Ant --num_envs 4 physics=newton_mjwarp ``` @@ -90,7 +95,7 @@ uv run python scripts/environments/random_agent.py --task Isaac-Cartpole-Camera- For camera tasks that expose physics, renderer, and data-type variants, combine selectors: ```bash -uv run python scripts/environments/random_agent.py --task Isaac-Cartpole-Camera-Direct --num_envs 4 physics=physx renderer=isaacsim_rtx_renderer presets=rgb +uv run python scripts/environments/random_agent.py --task Isaac-Cartpole-Camera-Direct --num_envs 4 physics=isaacsim_physx renderer=isaacsim_rtx presets=rgb uv run python scripts/environments/random_agent.py --task Isaac-Cartpole-Camera-Direct --num_envs 4 physics=newton_mjwarp renderer=newton_renderer presets=depth ``` diff --git a/skills/user/use-presets/reference.md b/skills/user/use-presets/reference.md index 1ec8871dcd19..f2e4bb97600e 100644 --- a/skills/user/use-presets/reference.md +++ b/skills/user/use-presets/reference.md @@ -49,9 +49,11 @@ From the Isaac Lab checkout, use `uv run python scripts/environments/list_envs.p Import paths: ```python +from isaaclab.physics import PhysxAutoCfg from isaaclab.sim import SimulationCfg from isaaclab.utils.configclass import configclass from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg +from isaaclab_ovphysx.physics import OvPhysxCfg from isaaclab_physx.physics import PhysxCfg from isaaclab_tasks.utils import PresetCfg ``` @@ -61,8 +63,10 @@ Pattern: ```python @configclass class PhysicsCfg(PresetCfg): - default = PhysxCfg() - physx = default + isaacsim_physx = PhysxCfg() + ovphysx = OvPhysxCfg() + physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) + default = isaacsim_physx newton_mjwarp = NewtonCfg(solver_cfg=MJWarpSolverCfg()) @@ -73,11 +77,13 @@ class MyEnvCfg: For multi-backend tasks, keep backend-specific solver values in the preset wrapper. Do not branch on backend names inside step, reward, or reset logic unless behavior truly cannot be represented as config. +When a task supports Isaac Sim PhysX, make `default` alias `isaacsim_physx`. Keep `physx` as the explicit automatic selector through `PhysxAutoCfg`, matching the renderer convention where `isaacsim_rtx` is concrete and `rtx` is automatic. + For schema presets, import universal fragments and base cfgs from `isaaclab.sim.schemas`, PhysX-specific cfgs from `isaaclab_physx.sim.schemas`, and Newton or MuJoCo cfgs from `isaaclab_newton.sim.schemas`. ## Validation Checklist -- The `default` variant is valid. +- The `default` variant aliases `isaacsim_physx` when the task supports Isaac Sim PhysX. - Every named variant is tested. - Selector names match existing conventions such as `physx`, `newton_mjwarp`, `newton_kamino`, `ovphysx`, `rgb`, and `depth`. - A small random-agent rollout succeeds for each variant. diff --git a/source/isaaclab/changelog.d/fix-install-hints.rst b/source/isaaclab/changelog.d/fix-install-hints.rst new file mode 100644 index 000000000000..f090ccdf20d7 --- /dev/null +++ b/source/isaaclab/changelog.d/fix-install-hints.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Fixed visualizer runtime errors to recommend valid uv-managed commands. diff --git a/source/isaaclab/isaaclab/sim/converters/_converter_cli.py b/source/isaaclab/isaaclab/sim/converters/_converter_cli.py index c1fa4ae1b059..986720c5924d 100644 --- a/source/isaaclab/isaaclab/sim/converters/_converter_cli.py +++ b/source/isaaclab/isaaclab/sim/converters/_converter_cli.py @@ -167,6 +167,7 @@ def _preview_kitless(cls, usd_path: str, visualizer: str) -> None: import isaaclab.sim as sim_utils # noqa: PLC0415 from isaaclab.app import launch_simulation # noqa: PLC0415 from isaaclab.physics import PhysicsCfg # noqa: PLC0415 + from isaaclab.visualizers.visualizer_cfg import _get_visualizer_install_hint # noqa: PLC0415 # Request the chosen kitless visualizer on the Newton backend; ``launch_simulation`` reads # the keys it needs and falls back to the launcher defaults for the rest. The default @@ -188,10 +189,9 @@ def _preview_kitless(cls, usd_path: str, visualizer: str) -> None: # nothing to display if no visualizer backend was created (e.g. package not installed) if not sim.visualizers: logger.warning( - "No '%s' visualizer available for preview (is 'isaaclab_visualizers[%s]' installed?)." - " Skipping viewport preview.", - visualizer, + "No '%s' visualizer available for preview. Skipping viewport preview. %s", visualizer, + _get_visualizer_install_hint(visualizer), ) return diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 4aa215aba237..84cce2f15a2d 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -33,6 +33,7 @@ from isaaclab.utils.string import clear_resolve_matching_names_cache from isaaclab.utils.version import has_kit from isaaclab.visualizers.base_visualizer import BaseVisualizer +from isaaclab.visualizers.visualizer_cfg import _get_visualizer_install_hint if TYPE_CHECKING: from pxr import Usd @@ -376,10 +377,9 @@ def _create_default_visualizer_configs(self, requested_visualizers: list[str]) - # isaaclab_visualizers is optional; log once at warning level if "isaaclab_visualizers" in str(exc): logger.warning( - "[SimulationContext] Visualizer '%s' skipped: isaaclab_visualizers is not installed. " - "Install with: pip install isaaclab_visualizers[%s]", - viz_type, + "[SimulationContext] Visualizer '%s' skipped: isaaclab_visualizers is not installed. %s", viz_type, + _get_visualizer_install_hint(viz_type), ) else: logger.error( @@ -493,11 +493,15 @@ def _resolve_visualizer_cfgs(self) -> list[Any]: resolved_types = {getattr(cfg, "visualizer_type", None) for cfg in resolved} missing = [t for t in cli_requested if t not in resolved_types] if missing: + install_hints = " ".join( + _get_visualizer_install_hint(visualizer_type) + for visualizer_type in missing + if visualizer_type in _VISUALIZER_TYPES + ) raise RuntimeError( f"Explicitly requested visualizer(s) {missing} could not be configured. " f"Valid types: {', '.join(repr(t) for t in _VISUALIZER_TYPES)}. " - "Ensure the required package is installed " - "(e.g., pip install isaaclab_visualizers[])." + f"{install_hints}" ) # XR auto-start: auto-inject a KitVisualizer when XR is active and no @@ -517,9 +521,9 @@ def _resolve_visualizer_cfgs(self) -> list[Any]: logger.info("[SimulationContext] Auto-injecting KitVisualizer for XR app-update pumping.") except (ImportError, ModuleNotFoundError, AttributeError) as exc: logger.warning( - "[SimulationContext] XR mode could not auto-inject a KitVisualizer: %s. " - "Install isaaclab_visualizers[kit] or pass --visualizer kit.", + "[SimulationContext] XR mode could not auto-inject a KitVisualizer: %s. %s", exc, + _get_visualizer_install_hint("kit"), ) return resolved diff --git a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py index 76d0ea70df50..c63d1cfdfdc7 100644 --- a/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py +++ b/source/isaaclab/isaaclab/visualizers/visualizer_cfg.py @@ -22,6 +22,14 @@ } +def _get_visualizer_install_hint(visualizer_type: str) -> str: + """Return the uv command needed to run a visualizer backend.""" + extra = _VISUALIZER_EXTRAS.get(visualizer_type) + if extra is None: + return "Run your command with: uv run ." + return f"Run your command with: uv run --extra {extra} ." + + @configclass class VisualizerCfg: """Base configuration for all visualizer backends. @@ -141,13 +149,8 @@ def create_visualizer(self) -> BaseVisualizer: return Visualizer(self) except (ValueError, ImportError, ModuleNotFoundError) as exc: if self.visualizer_type in ("newton", "rerun", "viser", "kit"): - extra = _VISUALIZER_EXTRAS.get(self.visualizer_type) - if extra is None: - install_hint = "Synchronize the project environment with: uv sync." - else: - install_hint = f"Run your command with: uv run --extra {extra} ." raise ImportError( f"Could not import visualizer '{self.visualizer_type}' from isaaclab_visualizers. " - f"{install_hint}\nOriginal error: {exc}" + f"{_get_visualizer_install_hint(self.visualizer_type)}\nOriginal error: {exc}" ) from exc raise diff --git a/source/isaaclab_ov/changelog.d/fix-install-hints.rst b/source/isaaclab_ov/changelog.d/fix-install-hints.rst new file mode 100644 index 000000000000..8aa48738e655 --- /dev/null +++ b/source/isaaclab_ov/changelog.d/fix-install-hints.rst @@ -0,0 +1,5 @@ +Fixed +^^^^^ + +* Fixed OVRTX missing-runtime errors to recommend supported uv-managed and + direct-wheel commands. diff --git a/source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer.py b/source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer.py index 6af04ee8359d..14de1a819a7a 100644 --- a/source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer.py +++ b/source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer.py @@ -70,7 +70,8 @@ raise ModuleNotFoundError( "The OVRTX renderer requires the optional 'ovrtx' runtime wheel, which is not installed. " "Run your command with: uv run --extra ovrtx " - "(or, manually: pip install --extra-index-url https://pypi.nvidia.com -e 'source/isaaclab_ov[ovrtx]')." + "(or, manually: python -m pip install --extra-index-url https://pypi.nvidia.com " + "'ovrtx>=0.4.0,<0.5.0')." ) from exc from isaaclab.cloner.clone_plan import ClonePlan @@ -178,7 +179,9 @@ def ovrtx_use_ovstage_enabled() -> bool: if value == "1" and not _OVSTAGE_AVAILABLE: raise RuntimeError( f"`{_USE_OVSTAGE_ENV}=1` requests the ovstage scene-ownership path, but the 'ovstage' " - "package is not installed. Install it with: ./isaaclab.sh -i 'ov[ovstage]' " + "package is not installed. Run your command with: uv run --extra ovrtx " + "(or, manually: python -m pip install --extra-index-url https://pypi.nvidia.com " + "'ovstage>=0.1.0,<0.2.0')." ) return value == "1" diff --git a/source/isaaclab_ov/test/test_ovrtx_renderer_contract.py b/source/isaaclab_ov/test/test_ovrtx_renderer_contract.py index 7ccb5402fc54..ac6b64313607 100644 --- a/source/isaaclab_ov/test/test_ovrtx_renderer_contract.py +++ b/source/isaaclab_ov/test/test_ovrtx_renderer_contract.py @@ -353,7 +353,7 @@ def test_ovrtx_use_ovstage_raises_when_requested_but_unavailable(monkeypatch): monkeypatch.setenv("ISAAC_LAB_OVRTX_USE_OVSTAGE", "1") monkeypatch.setattr(ovrtx_renderer_module, "_OVSTAGE_AVAILABLE", False) - with pytest.raises(RuntimeError, match="ov\\[ovstage\\]"): + with pytest.raises(RuntimeError, match="uv run --extra ovrtx"): ovrtx_use_ovstage_enabled() diff --git a/source/isaaclab_ovphysx/changelog.d/fix-ovphysx-install-hint.rst b/source/isaaclab_ovphysx/changelog.d/fix-ovphysx-install-hint.rst new file mode 100644 index 000000000000..22809e04bb69 --- /dev/null +++ b/source/isaaclab_ovphysx/changelog.d/fix-ovphysx-install-hint.rst @@ -0,0 +1,5 @@ +Fixed +^^^^^ + +* Fixed the OvPhysX missing-runtime error to recommend installing the supported + ``ovphysx`` wheel instead of a nonexistent source-package extra. diff --git a/source/isaaclab_ovphysx/isaaclab_ovphysx/_runtime.py b/source/isaaclab_ovphysx/isaaclab_ovphysx/_runtime.py index 38bbff1015a1..acbd236b760d 100644 --- a/source/isaaclab_ovphysx/isaaclab_ovphysx/_runtime.py +++ b/source/isaaclab_ovphysx/isaaclab_ovphysx/_runtime.py @@ -13,8 +13,7 @@ _OVPHYSX_INSTALL_MESSAGE = ( "The OvPhysX backend requires the optional 'ovphysx' runtime wheel, which is not installed. " "Run your command with: uv run --extra ovphysx " - "(or, manually: pip install --extra-index-url https://pypi.nvidia.com " - "-e 'source/isaaclab_ovphysx[ovphysx]')." + "(or, manually: python -m pip install --extra-index-url https://pypi.nvidia.com ovphysx)." ) diff --git a/source/isaaclab_tasks/changelog.d/default-isaacsim-physx.major.rst b/source/isaaclab_tasks/changelog.d/default-isaacsim-physx.major.rst new file mode 100644 index 000000000000..1a4cf3fcb225 --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/default-isaacsim-physx.major.rst @@ -0,0 +1,6 @@ +Changed +^^^^^^^ + +* **Breaking:** Changed environments that support Isaac Sim PhysX to use + ``isaacsim_physx`` by default. Select ``physics=physx`` to retain automatic + PhysX-family resolution between Isaac Sim PhysX and OvPhysX. diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/hold_pose_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/hold_pose_env_cfg.py index ebaed5d4b330..0de250896748 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/hold_pose_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/hold_pose_env_cfg.py @@ -80,10 +80,10 @@ def _kamino_newton_cfg() -> NewtonCfg: class DrLegsPhysicsCfg(PresetCfg): """Physics backend presets for DR Legs.""" - default: NewtonCfg = _kamino_newton_cfg() newton_kamino: NewtonCfg = _kamino_newton_cfg() isaacsim_physx: PhysxCfg = PhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) + default: PhysxCfg = isaacsim_physx ## @@ -133,10 +133,10 @@ def _physx_actions_cfg() -> ActionsCfg: class DrLegsActionsCfg(PresetCfg): """Backend-specific DR Legs action presets.""" - default: ActionsCfg = ActionsCfg() newton_kamino: ActionsCfg = ActionsCfg() physx: ActionsCfg = _physx_actions_cfg() isaacsim_physx: ActionsCfg = physx + default: ActionsCfg = isaacsim_physx @configclass @@ -254,10 +254,10 @@ def _physx_event_cfg() -> EventCfg: class DrLegsEventCfg(PresetCfg): """Backend-specific DR Legs event presets.""" - default: EventCfg = EventCfg() newton_kamino: EventCfg = EventCfg() physx: EventCfg = _physx_event_cfg() isaacsim_physx: EventCfg = physx + default: EventCfg = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/walk_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/walk_env_cfg.py index b43a5186ca22..7cdb7d53c1c9 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/walk_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/walk_env_cfg.py @@ -45,18 +45,18 @@ class DrLegsContactSensorCfg(PresetCfg): """Backend-specific foot contact sensor configuration.""" - default = NewtonContactSensorCfg( + newton_kamino = NewtonContactSensorCfg( prim_path="{ENV_REGEX_NS}/Robot/foot_.*", history_length=3, track_air_time=True, ) - newton_kamino = default physx = PhysXContactSensorCfg( prim_path="{ENV_REGEX_NS}/Robot/foot_.*", history_length=3, track_air_time=True, ) isaacsim_physx = physx + default = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/place/config/agibot/place_toy2box_rmp_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/place/config/agibot/place_toy2box_rmp_rel_env_cfg.py index 24eae22f7071..4adab0ecffd5 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/place/config/agibot/place_toy2box_rmp_rel_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/place/config/agibot/place_toy2box_rmp_rel_env_cfg.py @@ -204,7 +204,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default = physx + default = isaacsim_physx # Robot USD assets whose gripper revolute joints are authored with reversed 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 9105def1b2ed..1a6d241d9ef1 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 @@ -64,7 +64,7 @@ class SO101StackPhysicsCfg(PhysicsCfg): isaacsim_physx = PhysicsCfg().isaacsim_physx.replace(solve_articulation_contact_last=True) physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default = physx + default = isaacsim_physx @configclass 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 b9303ead168e..2534a6fe8a1b 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 @@ -318,7 +318,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default = physx + default = isaacsim_physx def raise_if_surface_gripper_on_newton(env_cfg) -> None: 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 9bcb41b9144b..523117be4cdf 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 @@ -33,7 +33,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @configclass 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 c47a0e4b76c0..a88b960e50ec 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 @@ -33,7 +33,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @configclass 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 6c41bccb3590..7f100e452a58 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 @@ -33,7 +33,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/digit/rough_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/digit/rough_env_cfg.py index c1e8b7d99bac..2284d162e340 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/digit/rough_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/velocity/config/digit/rough_env_cfg.py @@ -31,7 +31,7 @@ class DigitPhysicsCfg(PresetCfg): gpu_total_aggregate_pairs_capacity=2**23, ) physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default = physx + default = isaacsim_physx @configclass 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 2c9cb9575bd7..f239a431f3f7 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 @@ -33,7 +33,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) newton_kamino = NewtonCfg(solver_cfg=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @configclass 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 14cdf9d258cb..81b7a35999a7 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 @@ -38,7 +38,7 @@ class PhysicsCfg(PresetCfg): isaacsim_physx = PhysxCfg(gpu_max_rigid_patch_count=10 * 2**15) physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default = physx + default = isaacsim_physx newton_mjwarp = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=130, @@ -231,10 +231,10 @@ class SpotPhysxEventCfg(SpotNewtonEventCfg, SpotStartupEventCfg): @configclass class SpotEventCfg(PresetCfg): - default = SpotPhysxEventCfg() - newton_mjwarp = SpotNewtonEventCfg() - physx = default + physx = SpotPhysxEventCfg() isaacsim_physx = physx + default = isaacsim_physx + newton_mjwarp = SpotNewtonEventCfg() newton_kamino = newton_mjwarp diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/cabinet/cabinet_direct_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/cabinet/cabinet_direct_env_cfg.py index 8498fdc946e7..ee409c63d2b0 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/cabinet/cabinet_direct_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/cabinet/cabinet_direct_env_cfg.py @@ -36,7 +36,7 @@ class CabinetDirectPhysicsCfg(PresetCfg): ), num_substeps=1, ) - default = physx + default = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/cabinet/cabinet_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/cabinet/cabinet_env_cfg.py index 7800d12fc7ff..6acdc084b92a 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/cabinet/cabinet_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/cabinet/cabinet_env_cfg.py @@ -55,7 +55,7 @@ class CabinetSimCfg(PresetCfg): physics=PhysxCfg(bounce_threshold_velocity=0.01, friction_correlation_distance=0.00625), ) physx: SimulationCfg = isaacsim_physx.replace(physics=PhysxAutoCfg(isaacsim_physx=isaacsim_physx.physics)) - default: SimulationCfg = physx + default: SimulationCfg = isaacsim_physx newton_mjwarp: SimulationCfg = SimulationCfg( dt=1 / 600, render_interval=1, @@ -261,9 +261,9 @@ class _CabinetNewtonEventCfg: @configclass class CabinetEventCfg(PresetCfg): - default: EventCfg = EventCfg() physx: EventCfg = EventCfg() isaacsim_physx: EventCfg = physx + default: EventCfg = isaacsim_physx newton_mjwarp: _CabinetNewtonEventCfg = _CabinetNewtonEventCfg() diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/cartpole/cartpole_direct_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/cartpole/cartpole_direct_env_cfg.py index 2333bc85e286..4185d7b85536 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/cartpole/cartpole_direct_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/cartpole/cartpole_direct_env_cfg.py @@ -28,7 +28,7 @@ class CartpolePhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg() ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = physx + default = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=5, diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/cartpole/cartpole_manager_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/cartpole/cartpole_manager_env_cfg.py index cf7e3601fc82..d8c4fa12483e 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/cartpole/cartpole_manager_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/cartpole/cartpole_manager_env_cfg.py @@ -38,7 +38,7 @@ class CartpolePhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg() ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default: PhysxAutoCfg = physx + default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=5, diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/config/kuka_allegro/dexsuite_kuka_allegro_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/config/kuka_allegro/dexsuite_kuka_allegro_env_cfg.py index 94b24163671d..4cab10c42361 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/config/kuka_allegro/dexsuite_kuka_allegro_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/config/kuka_allegro/dexsuite_kuka_allegro_env_cfg.py @@ -37,12 +37,13 @@ class KukaAllegroObjectCfg(dexsuite.ObjectCfg): class KukaAllegroPhysicsCfg(dexsuite.PhysicsCfg): """Physics presets supported by the Kuka Allegro tasks.""" + isaacsim_physx = dexsuite.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=dexsuite.PhysicsCfg().isaacsim_physx, ovphysx=ovphysx) - default = physx + physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) + default = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/dexsuite_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/dexsuite_env_cfg.py index 4666efde1a33..72bb32da73e8 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/dexsuite_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/dexsuite/dexsuite_env_cfg.py @@ -492,7 +492,7 @@ class PhysicsCfg(PresetCfg): debug_mode=False, ) physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default = physx + default = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/handover/handover_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/handover/handover_env_cfg.py index 53aa2d740159..4cfb0ee371cd 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/handover/handover_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/handover/handover_env_cfg.py @@ -175,7 +175,7 @@ def _shadow_hand_cfg( init_state=SHADOW_HAND_CFG.init_state.replace(pos=init_pos, rot=init_rot), ) return preset( - default=newton_mjwarp_cfg, + default=physx_cfg, physx=physx_cfg, isaacsim_physx=physx_cfg, newton_mjwarp=newton_mjwarp_cfg, @@ -246,7 +246,7 @@ class ObjectCfg(PresetCfg): ) ovphysx = physx isaacsim_physx = physx - default = newton_mjwarp + default = isaacsim_physx @configclass @@ -282,7 +282,7 @@ class PhysicsCfg(PresetCfg): ) ovphysx = OvPhysxCfg() physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = newton_mjwarp + default = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py index 610ca1bae507..7bd5db22e371 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py @@ -123,7 +123,7 @@ class DeformableCfg(PresetCfg): ovphysx: DeformableObjectCfg = physx - default = newton_mjwarp_vbd_proxy + default = isaacsim_physx @configclass @@ -173,7 +173,7 @@ class PhysicsCfg(PresetCfg): ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = newton_mjwarp_vbd_proxy + default = isaacsim_physx ## @@ -490,7 +490,7 @@ class FrankaSoftSceneCfg(PresetCfg): ovphysx: _FrankaSoftSceneCfg = _FrankaSoftSceneCfg(num_envs=128, env_spacing=2.5, replicate_physics=True) - default = newton_mjwarp_vbd_proxy + default = isaacsim_physx @configclass @@ -502,7 +502,7 @@ class FrankaSoftCameraSceneCfg(PresetCfg): ) physx: _FrankaSoftCameraSceneCfg = _FrankaSoftCameraSceneCfg(num_envs=128, env_spacing=2.5, replicate_physics=False) isaacsim_physx = physx - default = newton_mjwarp_vbd_proxy + default = isaacsim_physx @configclass 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 84a7a5f9abb0..c6c89bbe8820 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 @@ -28,7 +28,7 @@ class AntPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg() ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = physx + default = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=45, 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 d40b4d6c68c7..d438a86dd0e0 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 @@ -34,7 +34,7 @@ class AntPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default: PhysxAutoCfg = physx + default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=38, @@ -153,9 +153,9 @@ def __post_init__(self): @configclass class AntObservationsCfg(PresetCfg): - default: ObservationsCfg = ObservationsCfg() physx: ObservationsCfg = ObservationsCfg() isaacsim_physx: ObservationsCfg = physx + default: ObservationsCfg = isaacsim_physx newton_mjwarp: ObservationsCfg = ObservationsCfg() 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 9fa34ccc5edc..34c0b8ba8e97 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 @@ -28,7 +28,7 @@ class HumanoidPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg() ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = physx + default = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=80, 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 ab774c3d3f43..6725ce8da6e6 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 @@ -31,7 +31,7 @@ class HumanoidPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default: PhysxAutoCfg = physx + default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( njmax=80, @@ -137,9 +137,9 @@ def __post_init__(self): @configclass class HumanoidObservationsCfg(PresetCfg): - default: ObservationsCfg = ObservationsCfg() physx: ObservationsCfg = ObservationsCfg() isaacsim_physx: ObservationsCfg = physx + default: ObservationsCfg = isaacsim_physx newton_mjwarp: ObservationsCfg = ObservationsCfg() diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reach/reach_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/reach/reach_env_cfg.py index 233ef02f9a82..c86e04b59912 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reach/reach_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reach/reach_env_cfg.py @@ -55,7 +55,7 @@ class ReachPhysicsCfg(PresetCfg): newton_kamino: NewtonCfg = NewtonCfg( solver_cfg=KaminoSolverCfg(max_contacts_per_world=32), ) - default: NewtonCfg = newton_mjwarp + default: PhysxCfg = isaacsim_physx ## diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_common.py b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_common.py index 2605d401c76e..171eb05d9a19 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_common.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_common.py @@ -79,7 +79,7 @@ class ObjectCfg(PresetCfg): init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, -0.17, 0.56), rot=(0.0, 0.0, 0.0, 1.0)), ) isaacsim_physx = physx - default = newton_mjwarp + default = isaacsim_physx @configclass @@ -100,7 +100,7 @@ class PhysicsCfg(PresetCfg): ) ovphysx = OvPhysxCfg() physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = newton_mjwarp + default = isaacsim_physx # Scene pieces shared verbatim by the manager-based variant. diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py index fa0d6c3fbe02..da02bdbec873 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py @@ -143,7 +143,7 @@ class ShadowHandEventCfg(PresetCfg): isaacsim_physx = physx newton_mjwarp = NewtonEventCfg() ovphysx = physx # OvPhysX is PhysX-based; reuse the PhysX randomization terms - default = newton_mjwarp + default = isaacsim_physx newton_kamino = newton_mjwarp @@ -171,7 +171,7 @@ class ShadowHandRobotCfg(PresetCfg): joint_pos={".*": 0.0}, ), ) - default = newton_mjwarp + default = isaacsim_physx newton_kamino = newton_mjwarp @@ -213,7 +213,7 @@ class ObjectCfg(PresetCfg): articulation_root_prim_path="", ) ovphysx = physx # OvPhysX is PhysX-based; use the rigid-body cube, not Newton's articulation - default = newton_mjwarp + default = isaacsim_physx newton_kamino = newton_mjwarp @@ -237,7 +237,7 @@ class PhysicsCfg(PresetCfg): ) ovphysx = OvPhysxCfg() physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = newton_mjwarp + default = isaacsim_physx newton_kamino = NewtonCfg(solver_cfg=KaminoSolverCfg(max_contacts_per_world=128)) diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_camera_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_camera_env_cfg.py index 19292a97429f..bbc5a11c3f51 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_camera_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_camera_env_cfg.py @@ -131,7 +131,7 @@ def __post_init__(self): # for the depth-only Newton-warp-renderer benchmark path (``presets=newton_renderer``). super().__post_init__() for backend_cfg in (self.sim.physics, self.robot_cfg, self.object_cfg): - backend_cfg.default = backend_cfg.physx + backend_cfg.default = backend_cfg.isaacsim_physx def validate_config(self): """Check renderer/data-type and feature-extractor compatibility.""" diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py index a7a8c4830be7..f89b91abd7c7 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py @@ -71,7 +71,7 @@ class ShadowHandEnvCfg(DirectRLEnvCfg): goal_object_cfg: VisualizationMarkersCfg = GOAL_OBJECT_CFG # scene — clone_in_fabric is the only backend-varying field (Newton cannot use Fabric cloning) scene: InteractiveSceneCfg = preset( - default=ShadowHandSceneCfg(clone_in_fabric=False), + default=ShadowHandSceneCfg(clone_in_fabric=True), physx=ShadowHandSceneCfg(clone_in_fabric=True), isaacsim_physx=ShadowHandSceneCfg(clone_in_fabric=True), ovphysx=ShadowHandSceneCfg(clone_in_fabric=True), 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 7bbf9ff3b052..c53b1d32bfeb 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=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @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 e6293b9995ca..e64feb5fff75 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=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @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 d2b40ac55134..bcc3f7139f4a 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=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @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 5b78264b7114..6a9883bf5e20 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=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @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 0be27558d27f..d78ec6098966 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=KaminoSolverCfg(max_contacts_per_world=64)) - default = physx + default = isaacsim_physx @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 fb89db49208a..6e9dd535159c 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 @@ -67,7 +67,7 @@ class RoughPhysicsCfg(PresetCfg): # on triangle-mesh terrain. See isaaclab_newton 0.5.22 changelog. default_shape_cfg=NewtonShapeCfg(margin=0.01), ) - default = physx + default = isaacsim_physx ## diff --git a/source/isaaclab_tasks/test/contrib/stack/test_so101_stack_physics_cfg.py b/source/isaaclab_tasks/test/contrib/stack/test_so101_stack_physics_cfg.py index aa640d9f0aad..ba66ecf22ca0 100644 --- a/source/isaaclab_tasks/test/contrib/stack/test_so101_stack_physics_cfg.py +++ b/source/isaaclab_tasks/test/contrib/stack/test_so101_stack_physics_cfg.py @@ -25,7 +25,7 @@ def test_preset_enables_contact_last_and_keeps_stack_tuning(): preset = SO101StackPhysicsCfg() - assert preset.default == preset.physx + assert preset.default == preset.isaacsim_physx for physx in (preset.isaacsim_physx, preset.physx.isaacsim_physx): assert physx.solve_articulation_contact_last is True assert physx.bounce_threshold_velocity == 0.01 diff --git a/source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py b/source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py index 920fef311327..b5f17d7f0fc1 100644 --- a/source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py +++ b/source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py @@ -5,7 +5,7 @@ """Tests for the DR Legs physics presets.""" -from isaaclab_newton.physics import KaminoSolverCfg, NewtonCfg +from isaaclab_newton.physics import KaminoSolverCfg from isaaclab_physx.physics import PhysxCfg from isaaclab_physx.sensors import ContactSensorCfg as PhysXContactSensorCfg @@ -41,7 +41,7 @@ def test_dr_legs_kamino_presets_remain_unchanged() -> None: physics = DrLegsPhysicsCfg() env_cfg = resolve_presets(DrLegsHoldPoseEnvCfg(), selected=("newton_kamino",)) - assert isinstance(physics.default, NewtonCfg) + assert isinstance(physics.default, PhysxCfg) assert isinstance(physics.newton_kamino.solver_cfg, KaminoSolverCfg) assert env_cfg.events.reset_base.params["pose_range"]["x"] == (-0.05, 0.05) assert env_cfg.events.reset_robot_joints.params["position_range"] == (-0.1, 0.1) diff --git a/source/isaaclab_tasks/test/core/test_preset_kit_decision.py b/source/isaaclab_tasks/test/core/test_preset_kit_decision.py index 3a9ae2280534..8c19cc2ecbd8 100644 --- a/source/isaaclab_tasks/test/core/test_preset_kit_decision.py +++ b/source/isaaclab_tasks/test/core/test_preset_kit_decision.py @@ -87,8 +87,8 @@ def test_isaacsim_physx_is_physics_selector(): assert "isaacsim_physx" in preset_map[PresetTarget.PHYSICS] -def test_registered_task_physx_presets_use_explicit_auto_cfg(): - """Every task with Isaac Sim PhysX exposes automatic and concrete presets.""" +def test_registered_task_physx_presets_default_to_isaac_sim_and_expose_auto_cfg(): + """Every task with Isaac Sim PhysX defaults to it and exposes automatic PhysX.""" for task_id, task_spec in gym.registry.items(): if not task_id.startswith(("Isaac-", "IsaacContrib-")) or "env_cfg_entry_point" not in task_spec.kwargs: @@ -102,12 +102,16 @@ def test_registered_task_physx_presets_use_explicit_auto_cfg(): if any(isinstance(value, PhysxCfg) for value in physics_fields.values()): auto_cfg = physics_fields.get("physx") isaacsim_cfg = physics_fields.get("isaacsim_physx") + default_cfg = physics_fields.get("default") assert isinstance(auto_cfg, PhysxAutoCfg), location assert isinstance(isaacsim_cfg, PhysxCfg), location + assert isinstance(default_cfg, PhysxCfg), location + assert default_cfg == isaacsim_cfg, location assert auto_cfg.isaacsim_physx == isaacsim_cfg, location assert auto_cfg.ovphysx == physics_fields.get("ovphysx"), location elif has_auto_physx and "physx" in fields: assert fields.get("isaacsim_physx") == fields["physx"], location + assert fields.get("default") == fields.get("isaacsim_physx"), location def test_auto_physx_without_ovphysx_falls_back_to_isaac_sim(): @@ -133,24 +137,24 @@ def test_preset_mjwarp_ovrtx_does_not_need_kit(): assert needs_kit is False -def test_preset_rtx_resolves_to_ovphysx_and_ovrtx_without_kit(): - """The RTX preset uses kitless PhysX-family backends when no Kit runtime is requested.""" +def test_preset_rtx_with_default_physx_resolves_to_isaac_sim_backends(): + """Automatic RTX follows the default concrete Isaac Sim PhysX backend.""" env_cfg = _resolve_with_presets("rtx") config_scan = _resolve_runtime_renderer(env_cfg) - assert isinstance(env_cfg.sim.physics, OvPhysxCfg) - assert isinstance(env_cfg.tiled_camera.renderer_cfg, OVRTXRendererCfg) - assert config_scan.needs_kit is False + assert isinstance(env_cfg.sim.physics, PhysxCfg) + assert isinstance(env_cfg.tiled_camera.renderer_cfg, IsaacRtxRendererCfg) + assert config_scan.needs_kit is True -def test_renderer_selector_rtx_resolves_to_ovphysx_and_ovrtx_without_kit(): - """The RTX renderer selector uses kitless PhysX-family backends without Kit signals.""" +def test_renderer_selector_rtx_with_default_physx_resolves_to_isaac_sim_backends(): + """The RTX selector follows the default concrete Isaac Sim PhysX backend.""" env_cfg = _resolve_with_args("renderer=rtx") config_scan = _resolve_runtime_renderer(env_cfg) - assert isinstance(env_cfg.sim.physics, OvPhysxCfg) - assert isinstance(env_cfg.tiled_camera.renderer_cfg, OVRTXRendererCfg) - assert config_scan.needs_kit is False + assert isinstance(env_cfg.sim.physics, PhysxCfg) + assert isinstance(env_cfg.tiled_camera.renderer_cfg, IsaacRtxRendererCfg) + assert config_scan.needs_kit is True def test_renderer_selector_physx_rtx_resolves_to_ovphysx_without_kit(): @@ -233,7 +237,7 @@ def test_preset_physx_with_default_kit_camera_resolves_to_physx(): def test_preset_default_needs_kit(): - """Default automatic PhysX plus Isaac RTX requires Kit.""" + """Default concrete Isaac Sim PhysX plus Isaac RTX requires Kit.""" env_cfg = _resolve_with_presets("default") needs_kit = scan(env_cfg).needs_kit assert needs_kit is True diff --git a/source/isaaclab_tasks/test/core/test_reach_franka_presets.py b/source/isaaclab_tasks/test/core/test_reach_franka_presets.py index 097bc659018c..662bad4fbb03 100644 --- a/source/isaaclab_tasks/test/core/test_reach_franka_presets.py +++ b/source/isaaclab_tasks/test/core/test_reach_franka_presets.py @@ -59,11 +59,11 @@ def test_reach_diffik_abs_legacy_task_is_a_deprecated_alias(): @pytest.mark.parametrize( ("presets", "action_type", "physics_type"), [ - ((), "JointPositionActionCfg", "NewtonCfg"), + ((), "JointPositionActionCfg", "PhysxCfg"), (("isaacsim_physx",), "JointPositionActionCfg", "PhysxCfg"), (("newton_mjwarp",), "JointPositionActionCfg", "NewtonCfg"), (("ovphysx",), "JointPositionActionCfg", "OvPhysxCfg"), - (("diffik",), "DifferentialInverseKinematicsActionCfg", "NewtonCfg"), + (("diffik",), "DifferentialInverseKinematicsActionCfg", "PhysxCfg"), (("diffik", "isaacsim_physx"), "DifferentialInverseKinematicsActionCfg", "PhysxCfg"), (("diffik", "newton_mjwarp"), "DifferentialInverseKinematicsActionCfg", "NewtonCfg"), (("diffik_abs", "isaacsim_physx"), "DifferentialInverseKinematicsActionCfg", "PhysxCfg"), @@ -89,7 +89,7 @@ def test_reach_action_presets_change_only_the_action_configuration(): diffik_newton = _load_env_cfg("diffik", "newton_mjwarp") newton_ik = _load_env_cfg("newton_ik", "newton_mjwarp") - assert _load_env_cfg().actions.arm_action.to_dict() == joint_pos_newton.actions.arm_action.to_dict() + assert _load_env_cfg().actions.arm_action.to_dict() == joint_pos_physx.actions.arm_action.to_dict() assert _without_actions(joint_pos_physx) == _without_actions(diffik_physx) assert _without_actions(joint_pos_newton) == _without_actions(diffik_newton) assert _without_actions(joint_pos_newton) == _without_actions(newton_ik) diff --git a/source/isaaclab_tasks/test/core/test_runtime_compatibility.py b/source/isaaclab_tasks/test/core/test_runtime_compatibility.py index fb3f25e1cc77..10573906fbd7 100644 --- a/source/isaaclab_tasks/test/core/test_runtime_compatibility.py +++ b/source/isaaclab_tasks/test/core/test_runtime_compatibility.py @@ -226,17 +226,13 @@ def test_newton_plus_ovrtx_is_valid(): validate_runtime_compatibility(env_cfg) -def test_default_auto_physx_plus_ovrtx_resolves_to_ovphysx(): - """Default automatic PhysX uses OvPhysX when OVRTX is the only renderer signal.""" +def test_default_isaacsim_physx_plus_ovrtx_raises(): + """The concrete default Isaac Sim PhysX backend is incompatible with OVRTX.""" env_cfg = _resolve_with_presets("ovrtx") - assert isinstance(env_cfg.sim.physics, PhysxAutoCfg) - - config_scan = validate_runtime_compatibility(env_cfg) - - assert isinstance(env_cfg.sim.physics, OvPhysxCfg) - assert isinstance(env_cfg.tiled_camera.renderer_cfg, OVRTXRendererCfg) - assert config_scan.needs_kit is False + assert isinstance(env_cfg.sim.physics, PhysxCfg) + with pytest.raises(ValueError, match="PhysxCfg"): + validate_runtime_compatibility(env_cfg) def test_explicit_auto_physx_plus_ovrtx_resolves_to_ovphysx(): @@ -306,14 +302,14 @@ def test_default_preset_is_valid(): validate_runtime_compatibility(env_cfg) -def test_rtx_with_default_physx_is_valid_and_resolves_to_ovphysx_and_ovrtx(): - """The RTX preset chooses kitless PhysX-family backends when no Kit runtime is needed.""" +def test_rtx_with_default_physx_is_valid_and_resolves_to_isaac_sim_backends(): + """The RTX selector follows the default concrete Isaac Sim PhysX backend.""" env_cfg = _resolve_with_presets("rtx") config_scan = validate_runtime_compatibility(env_cfg) - assert isinstance(env_cfg.sim.physics, OvPhysxCfg) - assert isinstance(env_cfg.tiled_camera.renderer_cfg, OVRTXRendererCfg) - assert config_scan.needs_kit is False + assert isinstance(env_cfg.sim.physics, PhysxCfg) + assert isinstance(env_cfg.tiled_camera.renderer_cfg, IsaacRtxRendererCfg) + assert config_scan.needs_kit is True def test_renderer_selector_physx_rtx_is_valid_and_resolves_to_ovphysx_and_ovrtx(): From 78706ab489bf295a5bb3792dbb60e6f1ac2a6a33 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 1 Aug 2026 22:54:00 -0700 Subject: [PATCH 2/8] Document OvPhysX preset configuration --- docs/source/migration/migrating_to_isaaclab_3-0.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/source/migration/migrating_to_isaaclab_3-0.rst b/docs/source/migration/migrating_to_isaaclab_3-0.rst index 561f60b4ad4f..27579be9aaaf 100644 --- a/docs/source/migration/migrating_to_isaaclab_3-0.rst +++ b/docs/source/migration/migrating_to_isaaclab_3-0.rst @@ -654,12 +654,14 @@ when no CLI override is given. Other fields are named presets selectable with from isaaclab.physics import PhysxAutoCfg from isaaclab.utils.configclass import configclass + from isaaclab_ovphysx.physics import OvPhysxCfg from isaaclab_tasks.utils import PresetCfg @configclass class MyPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg(...) - physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) + ovphysx: OvPhysxCfg = OvPhysxCfg() + physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) default: PhysxCfg = isaacsim_physx # used when no override is given newton_mjwarp: NewtonCfg = NewtonCfg(...) # selected by physics=newton_mjwarp @@ -702,13 +704,15 @@ subclass that carries both a PhysX and a Newton variant. from isaaclab.physics import PhysxAutoCfg from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg + from isaaclab_ovphysx.physics import OvPhysxCfg from isaaclab_physx.physics import PhysxCfg from isaaclab_tasks.utils import PresetCfg @configclass class ReachPhysicsCfg(PresetCfg): isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2) - physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) + ovphysx: OvPhysxCfg = OvPhysxCfg() + physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) default: PhysxCfg = isaacsim_physx newton_mjwarp: NewtonCfg = NewtonCfg( solver_cfg=MJWarpSolverCfg( From ef483509d6621b614668d32104771e88ca5113e2 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 1 Aug 2026 23:07:34 -0700 Subject: [PATCH 3/8] Preserve explicit Newton task defaults Limit the concrete Isaac Sim PhysX default change to tasks that previously used automatic PhysX selection. Keep established Newton defaults and document the distinction. --- docs/source/features/hydra.rst | 16 +++++++++------- .../migration/migrating_to_isaaclab_3-0.rst | 2 +- .../core-concepts/multi_backend_architecture.rst | 12 +++++++----- .../physical-backends/physx/installation.rst | 9 +++++---- .../physx/supported-features.rst | 13 +++++++------ docs/source/overview/environments.rst | 11 ++++++----- docs/source/setup/quickstart_details.rst | 2 +- skills/user/use-presets/examples.md | 2 ++ skills/user/use-presets/reference.md | 4 ++-- .../changelog.d/default-isaacsim-physx.major.rst | 8 +++++--- .../contrib/dr_legs/hold_pose_env_cfg.py | 6 +++--- .../contrib/dr_legs/walk_env_cfg.py | 4 ++-- .../core/handover/handover_env_cfg.py | 6 +++--- .../config/franka_soft/franka_soft_env_cfg.py | 8 ++++---- .../isaaclab_tasks/core/reach/reach_env_cfg.py | 2 +- .../config/allegro_hand/allegro_hand_common.py | 4 ++-- .../config/shadow_hand/shadow_hand_common.py | 8 ++++---- .../shadow_hand/shadow_hand_direct_env_cfg.py | 2 +- .../test/core/test_dr_legs_physics_presets.py | 4 ++-- .../test/core/test_preset_kit_decision.py | 10 +++++----- .../test/core/test_reach_franka_presets.py | 6 +++--- 21 files changed, 75 insertions(+), 64 deletions(-) diff --git a/docs/source/features/hydra.rst b/docs/source/features/hydra.rst index 57f28fd6b28c..ca3f491b67ec 100644 --- a/docs/source/features/hydra.rst +++ b/docs/source/features/hydra.rst @@ -264,13 +264,15 @@ override is given: # Use Newton physics backend python train.py --task=Isaac-Reach-Franka env.physics=newton_mjwarp -Tasks that support Isaac Sim PhysX use the concrete ``isaacsim_physx`` variant -by default. The explicit ``physics=physx`` selector opts into automatic -PhysX-family selection at launch time: Isaac Sim PhysX is used when a Kit -renderer or Kit viewer is requested. For fully kit-less runs, OvPhysX is used -when the task configures an OvPhysX alternative; otherwise selection falls back -to Isaac Sim PhysX and requires Kit. This matches renderer selection, where -``isaacsim_rtx`` is the concrete default and ``renderer=rtx`` is automatic. +Tasks that previously used automatic ``PhysxAutoCfg`` selection by default now +use the concrete ``isaacsim_physx`` variant by default. Existing explicit +defaults, such as Newton, remain unchanged. The explicit ``physics=physx`` +selector opts into automatic PhysX-family selection at launch time: Isaac Sim +PhysX is used when a Kit renderer or Kit viewer is requested. For fully kit-less +runs, OvPhysX is used when the task configures an OvPhysX alternative; otherwise +selection falls back to Isaac Sim PhysX and requires Kit. This matches renderer +selection, where ``isaacsim_rtx`` is the concrete default and ``renderer=rtx`` +is automatic. The ``default`` field can be set to ``None`` to make an optional feature that is disabled unless explicitly selected: diff --git a/docs/source/migration/migrating_to_isaaclab_3-0.rst b/docs/source/migration/migrating_to_isaaclab_3-0.rst index 27579be9aaaf..281fe30a9911 100644 --- a/docs/source/migration/migrating_to_isaaclab_3-0.rst +++ b/docs/source/migration/migrating_to_isaaclab_3-0.rst @@ -713,7 +713,6 @@ subclass that carries both a PhysX and a Newton variant. 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=20, nconmax=20, ls_iterations=20, @@ -723,6 +722,7 @@ subclass that carries both a PhysX and a Newton variant. num_substeps=1, debug_mode=False, ) + default: NewtonCfg = newton_mjwarp # In the env cfg __post_init__: def __post_init__(self): diff --git a/docs/source/overview/core-concepts/multi_backend_architecture.rst b/docs/source/overview/core-concepts/multi_backend_architecture.rst index fd4035cc9bcc..ececcaea4f6e 100644 --- a/docs/source/overview/core-concepts/multi_backend_architecture.rst +++ b/docs/source/overview/core-concepts/multi_backend_architecture.rst @@ -232,11 +232,13 @@ Users then select a physics backend at the command line: # OvPhysX backend ./isaaclab.sh train --rl_library rsl_rl --task Isaac-Cartpole-Direct physics=ovphysx -When a task supports Isaac Sim PhysX, its ``default`` variant is the concrete -``isaacsim_physx`` configuration. The ``physics=physx`` selector is opt-in and -chooses between Isaac Sim PhysX and OvPhysX at launch time according to whether -the resolved runtime requires Kit. This mirrors renderer presets: the default is -concrete ``isaacsim_rtx``, while ``renderer=rtx`` opts into automatic selection. +When a task's default would otherwise be automatic ``PhysxAutoCfg`` selection, +its ``default`` variant is the concrete ``isaacsim_physx`` configuration. +Explicit defaults such as Newton remain unchanged. The ``physics=physx`` +selector is opt-in and chooses between Isaac Sim PhysX and OvPhysX at launch +time according to whether the resolved runtime requires Kit. This mirrors +renderer presets: the default is concrete ``isaacsim_rtx``, while +``renderer=rtx`` opts into automatic selection. The Physics Manager ------------------- diff --git a/docs/source/overview/core-concepts/physical-backends/physx/installation.rst b/docs/source/overview/core-concepts/physical-backends/physx/installation.rst index ac49feca0371..c3fbbf912e69 100644 --- a/docs/source/overview/core-concepts/physical-backends/physx/installation.rst +++ b/docs/source/overview/core-concepts/physical-backends/physx/installation.rst @@ -37,7 +37,8 @@ default preset: ./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Cartpole --num_envs 128 -Environments that support Isaac Sim PhysX use the concrete ``isaacsim_physx`` -variant by default. Pass ``physics=physx`` explicitly to opt into automatic -PhysX-family selection between Isaac Sim PhysX and OvPhysX on tasks that support -both. +Environments whose previous default was automatic PhysX selection now use the +concrete ``isaacsim_physx`` variant by default. Existing explicit defaults, such +as Newton, remain unchanged. Pass ``physics=physx`` explicitly to opt into +automatic PhysX-family selection between Isaac Sim PhysX and OvPhysX on tasks +that support both. diff --git a/docs/source/overview/core-concepts/physical-backends/physx/supported-features.rst b/docs/source/overview/core-concepts/physical-backends/physx/supported-features.rst index 43be758eab87..45d2e1056a98 100644 --- a/docs/source/overview/core-concepts/physical-backends/physx/supported-features.rst +++ b/docs/source/overview/core-concepts/physical-backends/physx/supported-features.rst @@ -3,8 +3,10 @@ Supported Features PhysX is the broadest backend in Isaac Lab. It is the reference for behaviour parity and supports every public asset, sensor, and renderer surface in the -framework. Tasks built before Isaac Lab 3.0 ran on PhysX. Environments that -support Isaac Sim PhysX use its concrete ``isaacsim_physx`` preset by default. +framework. Tasks built before Isaac Lab 3.0 ran on PhysX. Environments whose +previous default was automatic PhysX selection now use the concrete +``isaacsim_physx`` preset by default; explicit backend defaults remain +unchanged. The summary below is intentionally coarse; consult each component's API documentation for fine-grained capability details. @@ -51,10 +53,9 @@ Tasks and Workflows ------------------- * Direct and Manager-based workflows -* ``isaaclab_tasks`` environments default to concrete Isaac Sim PhysX whenever - they support it. Backend-specific environments without an Isaac Sim PhysX - implementation, such as closed-loop or cloth tasks, retain their supported - backend as the default. +* ``isaaclab_tasks`` environments that previously defaulted to automatic PhysX + selection now default to concrete Isaac Sim PhysX. Environments with an + explicit backend default, including Newton tasks, retain that default. * Imitation learning and motion-generation pipelines (Mimic, motion generators) diff --git a/docs/source/overview/environments.rst b/docs/source/overview/environments.rst index 30c910d2c603..4958b969b017 100644 --- a/docs/source/overview/environments.rst +++ b/docs/source/overview/environments.rst @@ -91,11 +91,12 @@ modes. The **Presets** column in each table below is divided into three labeled * **physics=** — physics-backend name passed as ``physics=NAME`` (e.g. ``physx``, ``isaacsim_physx``, ``newton_mjwarp``, ``newton_kamino``, ``ovphysx``, ``newton_mjwarp_vbd_proxy``). Environments - that support Isaac Sim PhysX use the concrete ``isaacsim_physx`` variant by - default. Select ``physics=physx`` to opt into automatic PhysX-family - selection: it uses Isaac Sim PhysX when Kit is required and OvPhysX otherwise - when the task supports it. Tasks without an OvPhysX alternative fall back to - Isaac Sim PhysX. + whose previous default was automatic PhysX selection use the concrete + ``isaacsim_physx`` variant by default; explicit backend defaults such as + Newton remain unchanged. Select ``physics=physx`` to opt into automatic + PhysX-family selection: it uses Isaac Sim PhysX when Kit is required and + OvPhysX otherwise when the task supports it. Tasks without an OvPhysX + alternative fall back to Isaac Sim PhysX. * **renderer=** — renderer-backend name passed as ``renderer=NAME`` (e.g. ``isaacsim_rtx``, ``newton_renderer``, ``ovrtx``, ``rtx``). Cameras using the multi-backend renderer config default to concrete ``isaacsim_rtx``; diff --git a/docs/source/setup/quickstart_details.rst b/docs/source/setup/quickstart_details.rst index d9dc2f9400c5..cfc7f59156df 100644 --- a/docs/source/setup/quickstart_details.rst +++ b/docs/source/setup/quickstart_details.rst @@ -85,7 +85,7 @@ Available Presets **Physics backends** (``physics=NAME``): -- ``isaacsim_physx`` — concrete PhysX via Isaac Sim / Kit; this is the default for environments that support it +- ``isaacsim_physx`` — concrete PhysX via Isaac Sim / Kit; this is the default when an environment would otherwise default to automatic PhysX selection - ``physx`` — automatic PhysX-family selection: Isaac Sim PhysX when Kit is required, otherwise OvPhysX when the task supports it; tasks without OvPhysX support fall back to Isaac Sim PhysX - ``newton_mjwarp`` — Newton with the MuJoCo-Warp solver - ``newton_kamino`` — Newton with the Kamino solver (beta, limited tasks) diff --git a/skills/user/use-presets/examples.md b/skills/user/use-presets/examples.md index 1490cdaa6884..825683a45a74 100644 --- a/skills/user/use-presets/examples.md +++ b/skills/user/use-presets/examples.md @@ -26,6 +26,8 @@ This is enough when the task only supports PhysX and there are no renderer, sens ## Physics Presets Use `PresetCfg` when the same task supports multiple physics backends. +The example below applies when the task's established default is PhysX. Preserve +an explicit Newton or other backend default when adding more variants. ```python from isaaclab.physics import PhysxAutoCfg diff --git a/skills/user/use-presets/reference.md b/skills/user/use-presets/reference.md index f2e4bb97600e..feac0cf3bcfd 100644 --- a/skills/user/use-presets/reference.md +++ b/skills/user/use-presets/reference.md @@ -77,13 +77,13 @@ class MyEnvCfg: For multi-backend tasks, keep backend-specific solver values in the preset wrapper. Do not branch on backend names inside step, reward, or reset logic unless behavior truly cannot be represented as config. -When a task supports Isaac Sim PhysX, make `default` alias `isaacsim_physx`. Keep `physx` as the explicit automatic selector through `PhysxAutoCfg`, matching the renderer convention where `isaacsim_rtx` is concrete and `rtx` is automatic. +When a task currently defaults to `PhysxAutoCfg`, replace that default with the concrete `isaacsim_physx` variant. Preserve explicit Newton and other backend defaults. Keep `physx` as the explicit automatic selector through `PhysxAutoCfg`, matching the renderer convention where `isaacsim_rtx` is concrete and `rtx` is automatic. For schema presets, import universal fragments and base cfgs from `isaaclab.sim.schemas`, PhysX-specific cfgs from `isaaclab_physx.sim.schemas`, and Newton or MuJoCo cfgs from `isaaclab_newton.sim.schemas`. ## Validation Checklist -- The `default` variant aliases `isaacsim_physx` when the task supports Isaac Sim PhysX. +- A default that previously aliased `PhysxAutoCfg` now aliases `isaacsim_physx`; explicit backend defaults remain unchanged. - Every named variant is tested. - Selector names match existing conventions such as `physx`, `newton_mjwarp`, `newton_kamino`, `ovphysx`, `rgb`, and `depth`. - A small random-agent rollout succeeds for each variant. diff --git a/source/isaaclab_tasks/changelog.d/default-isaacsim-physx.major.rst b/source/isaaclab_tasks/changelog.d/default-isaacsim-physx.major.rst index 1a4cf3fcb225..4931a1e698fc 100644 --- a/source/isaaclab_tasks/changelog.d/default-isaacsim-physx.major.rst +++ b/source/isaaclab_tasks/changelog.d/default-isaacsim-physx.major.rst @@ -1,6 +1,8 @@ Changed ^^^^^^^ -* **Breaking:** Changed environments that support Isaac Sim PhysX to use - ``isaacsim_physx`` by default. Select ``physics=physx`` to retain automatic - PhysX-family resolution between Isaac Sim PhysX and OvPhysX. +* **Breaking:** Changed environments whose default physics preset was automatic + ``physx`` to use concrete ``isaacsim_physx``. Environments with explicit + backend defaults, including Newton, remain unchanged. Select + ``physics=physx`` to retain automatic PhysX-family resolution between Isaac + Sim PhysX and OvPhysX. diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/hold_pose_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/hold_pose_env_cfg.py index 0de250896748..ebaed5d4b330 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/hold_pose_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/hold_pose_env_cfg.py @@ -80,10 +80,10 @@ def _kamino_newton_cfg() -> NewtonCfg: class DrLegsPhysicsCfg(PresetCfg): """Physics backend presets for DR Legs.""" + default: NewtonCfg = _kamino_newton_cfg() newton_kamino: NewtonCfg = _kamino_newton_cfg() isaacsim_physx: PhysxCfg = PhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) - default: PhysxCfg = isaacsim_physx ## @@ -133,10 +133,10 @@ def _physx_actions_cfg() -> ActionsCfg: class DrLegsActionsCfg(PresetCfg): """Backend-specific DR Legs action presets.""" + default: ActionsCfg = ActionsCfg() newton_kamino: ActionsCfg = ActionsCfg() physx: ActionsCfg = _physx_actions_cfg() isaacsim_physx: ActionsCfg = physx - default: ActionsCfg = isaacsim_physx @configclass @@ -254,10 +254,10 @@ def _physx_event_cfg() -> EventCfg: class DrLegsEventCfg(PresetCfg): """Backend-specific DR Legs event presets.""" + default: EventCfg = EventCfg() newton_kamino: EventCfg = EventCfg() physx: EventCfg = _physx_event_cfg() isaacsim_physx: EventCfg = physx - default: EventCfg = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/walk_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/walk_env_cfg.py index 7cdb7d53c1c9..b43a5186ca22 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/walk_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/dr_legs/walk_env_cfg.py @@ -45,18 +45,18 @@ class DrLegsContactSensorCfg(PresetCfg): """Backend-specific foot contact sensor configuration.""" - newton_kamino = NewtonContactSensorCfg( + default = NewtonContactSensorCfg( prim_path="{ENV_REGEX_NS}/Robot/foot_.*", history_length=3, track_air_time=True, ) + newton_kamino = default physx = PhysXContactSensorCfg( prim_path="{ENV_REGEX_NS}/Robot/foot_.*", history_length=3, track_air_time=True, ) isaacsim_physx = physx - default = isaacsim_physx @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/handover/handover_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/handover/handover_env_cfg.py index 4cfb0ee371cd..53aa2d740159 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/handover/handover_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/handover/handover_env_cfg.py @@ -175,7 +175,7 @@ def _shadow_hand_cfg( init_state=SHADOW_HAND_CFG.init_state.replace(pos=init_pos, rot=init_rot), ) return preset( - default=physx_cfg, + default=newton_mjwarp_cfg, physx=physx_cfg, isaacsim_physx=physx_cfg, newton_mjwarp=newton_mjwarp_cfg, @@ -246,7 +246,7 @@ class ObjectCfg(PresetCfg): ) ovphysx = physx isaacsim_physx = physx - default = isaacsim_physx + default = newton_mjwarp @configclass @@ -282,7 +282,7 @@ class PhysicsCfg(PresetCfg): ) ovphysx = OvPhysxCfg() physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = isaacsim_physx + default = newton_mjwarp @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py index 7bd5db22e371..610ca1bae507 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py @@ -123,7 +123,7 @@ class DeformableCfg(PresetCfg): ovphysx: DeformableObjectCfg = physx - default = isaacsim_physx + default = newton_mjwarp_vbd_proxy @configclass @@ -173,7 +173,7 @@ class PhysicsCfg(PresetCfg): ovphysx: OvPhysxCfg = OvPhysxCfg() physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = isaacsim_physx + default = newton_mjwarp_vbd_proxy ## @@ -490,7 +490,7 @@ class FrankaSoftSceneCfg(PresetCfg): ovphysx: _FrankaSoftSceneCfg = _FrankaSoftSceneCfg(num_envs=128, env_spacing=2.5, replicate_physics=True) - default = isaacsim_physx + default = newton_mjwarp_vbd_proxy @configclass @@ -502,7 +502,7 @@ class FrankaSoftCameraSceneCfg(PresetCfg): ) physx: _FrankaSoftCameraSceneCfg = _FrankaSoftCameraSceneCfg(num_envs=128, env_spacing=2.5, replicate_physics=False) isaacsim_physx = physx - default = isaacsim_physx + default = newton_mjwarp_vbd_proxy @configclass diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reach/reach_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/reach/reach_env_cfg.py index c86e04b59912..233ef02f9a82 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reach/reach_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reach/reach_env_cfg.py @@ -55,7 +55,7 @@ class ReachPhysicsCfg(PresetCfg): newton_kamino: NewtonCfg = NewtonCfg( solver_cfg=KaminoSolverCfg(max_contacts_per_world=32), ) - default: PhysxCfg = isaacsim_physx + default: NewtonCfg = newton_mjwarp ## diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_common.py b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_common.py index 171eb05d9a19..2605d401c76e 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_common.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_common.py @@ -79,7 +79,7 @@ class ObjectCfg(PresetCfg): init_state=RigidObjectCfg.InitialStateCfg(pos=(0.0, -0.17, 0.56), rot=(0.0, 0.0, 0.0, 1.0)), ) isaacsim_physx = physx - default = isaacsim_physx + default = newton_mjwarp @configclass @@ -100,7 +100,7 @@ class PhysicsCfg(PresetCfg): ) ovphysx = OvPhysxCfg() physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = isaacsim_physx + default = newton_mjwarp # Scene pieces shared verbatim by the manager-based variant. diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py index da02bdbec873..fa0d6c3fbe02 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py @@ -143,7 +143,7 @@ class ShadowHandEventCfg(PresetCfg): isaacsim_physx = physx newton_mjwarp = NewtonEventCfg() ovphysx = physx # OvPhysX is PhysX-based; reuse the PhysX randomization terms - default = isaacsim_physx + default = newton_mjwarp newton_kamino = newton_mjwarp @@ -171,7 +171,7 @@ class ShadowHandRobotCfg(PresetCfg): joint_pos={".*": 0.0}, ), ) - default = isaacsim_physx + default = newton_mjwarp newton_kamino = newton_mjwarp @@ -213,7 +213,7 @@ class ObjectCfg(PresetCfg): articulation_root_prim_path="", ) ovphysx = physx # OvPhysX is PhysX-based; use the rigid-body cube, not Newton's articulation - default = isaacsim_physx + default = newton_mjwarp newton_kamino = newton_mjwarp @@ -237,7 +237,7 @@ class PhysicsCfg(PresetCfg): ) ovphysx = OvPhysxCfg() physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) - default = isaacsim_physx + default = newton_mjwarp newton_kamino = NewtonCfg(solver_cfg=KaminoSolverCfg(max_contacts_per_world=128)) diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py index f89b91abd7c7..a7a8c4830be7 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py @@ -71,7 +71,7 @@ class ShadowHandEnvCfg(DirectRLEnvCfg): goal_object_cfg: VisualizationMarkersCfg = GOAL_OBJECT_CFG # scene — clone_in_fabric is the only backend-varying field (Newton cannot use Fabric cloning) scene: InteractiveSceneCfg = preset( - default=ShadowHandSceneCfg(clone_in_fabric=True), + default=ShadowHandSceneCfg(clone_in_fabric=False), physx=ShadowHandSceneCfg(clone_in_fabric=True), isaacsim_physx=ShadowHandSceneCfg(clone_in_fabric=True), ovphysx=ShadowHandSceneCfg(clone_in_fabric=True), diff --git a/source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py b/source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py index b5f17d7f0fc1..920fef311327 100644 --- a/source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py +++ b/source/isaaclab_tasks/test/core/test_dr_legs_physics_presets.py @@ -5,7 +5,7 @@ """Tests for the DR Legs physics presets.""" -from isaaclab_newton.physics import KaminoSolverCfg +from isaaclab_newton.physics import KaminoSolverCfg, NewtonCfg from isaaclab_physx.physics import PhysxCfg from isaaclab_physx.sensors import ContactSensorCfg as PhysXContactSensorCfg @@ -41,7 +41,7 @@ def test_dr_legs_kamino_presets_remain_unchanged() -> None: physics = DrLegsPhysicsCfg() env_cfg = resolve_presets(DrLegsHoldPoseEnvCfg(), selected=("newton_kamino",)) - assert isinstance(physics.default, PhysxCfg) + assert isinstance(physics.default, NewtonCfg) assert isinstance(physics.newton_kamino.solver_cfg, KaminoSolverCfg) assert env_cfg.events.reset_base.params["pose_range"]["x"] == (-0.05, 0.05) assert env_cfg.events.reset_robot_joints.params["position_range"] == (-0.1, 0.1) diff --git a/source/isaaclab_tasks/test/core/test_preset_kit_decision.py b/source/isaaclab_tasks/test/core/test_preset_kit_decision.py index 8c19cc2ecbd8..337678d04af2 100644 --- a/source/isaaclab_tasks/test/core/test_preset_kit_decision.py +++ b/source/isaaclab_tasks/test/core/test_preset_kit_decision.py @@ -87,8 +87,8 @@ def test_isaacsim_physx_is_physics_selector(): assert "isaacsim_physx" in preset_map[PresetTarget.PHYSICS] -def test_registered_task_physx_presets_default_to_isaac_sim_and_expose_auto_cfg(): - """Every task with Isaac Sim PhysX defaults to it and exposes automatic PhysX.""" +def test_registered_task_physx_presets_keep_auto_selection_explicit(): + """PhysX defaults are concrete while ``physx`` remains the automatic selector.""" for task_id, task_spec in gym.registry.items(): if not task_id.startswith(("Isaac-", "IsaacContrib-")) or "env_cfg_entry_point" not in task_spec.kwargs: @@ -105,13 +105,13 @@ def test_registered_task_physx_presets_default_to_isaac_sim_and_expose_auto_cfg( default_cfg = physics_fields.get("default") assert isinstance(auto_cfg, PhysxAutoCfg), location assert isinstance(isaacsim_cfg, PhysxCfg), location - assert isinstance(default_cfg, PhysxCfg), location - assert default_cfg == isaacsim_cfg, location + assert not isinstance(default_cfg, PhysxAutoCfg), location + if isinstance(default_cfg, PhysxCfg): + assert default_cfg == isaacsim_cfg, location assert auto_cfg.isaacsim_physx == isaacsim_cfg, location assert auto_cfg.ovphysx == physics_fields.get("ovphysx"), location elif has_auto_physx and "physx" in fields: assert fields.get("isaacsim_physx") == fields["physx"], location - assert fields.get("default") == fields.get("isaacsim_physx"), location def test_auto_physx_without_ovphysx_falls_back_to_isaac_sim(): diff --git a/source/isaaclab_tasks/test/core/test_reach_franka_presets.py b/source/isaaclab_tasks/test/core/test_reach_franka_presets.py index 662bad4fbb03..097bc659018c 100644 --- a/source/isaaclab_tasks/test/core/test_reach_franka_presets.py +++ b/source/isaaclab_tasks/test/core/test_reach_franka_presets.py @@ -59,11 +59,11 @@ def test_reach_diffik_abs_legacy_task_is_a_deprecated_alias(): @pytest.mark.parametrize( ("presets", "action_type", "physics_type"), [ - ((), "JointPositionActionCfg", "PhysxCfg"), + ((), "JointPositionActionCfg", "NewtonCfg"), (("isaacsim_physx",), "JointPositionActionCfg", "PhysxCfg"), (("newton_mjwarp",), "JointPositionActionCfg", "NewtonCfg"), (("ovphysx",), "JointPositionActionCfg", "OvPhysxCfg"), - (("diffik",), "DifferentialInverseKinematicsActionCfg", "PhysxCfg"), + (("diffik",), "DifferentialInverseKinematicsActionCfg", "NewtonCfg"), (("diffik", "isaacsim_physx"), "DifferentialInverseKinematicsActionCfg", "PhysxCfg"), (("diffik", "newton_mjwarp"), "DifferentialInverseKinematicsActionCfg", "NewtonCfg"), (("diffik_abs", "isaacsim_physx"), "DifferentialInverseKinematicsActionCfg", "PhysxCfg"), @@ -89,7 +89,7 @@ def test_reach_action_presets_change_only_the_action_configuration(): diffik_newton = _load_env_cfg("diffik", "newton_mjwarp") newton_ik = _load_env_cfg("newton_ik", "newton_mjwarp") - assert _load_env_cfg().actions.arm_action.to_dict() == joint_pos_physx.actions.arm_action.to_dict() + assert _load_env_cfg().actions.arm_action.to_dict() == joint_pos_newton.actions.arm_action.to_dict() assert _without_actions(joint_pos_physx) == _without_actions(diffik_physx) assert _without_actions(joint_pos_newton) == _without_actions(diffik_newton) assert _without_actions(joint_pos_newton) == _without_actions(newton_ik) From 3c5745bd19593d44fb3e9118793821832bc5582c Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 1 Aug 2026 23:16:22 -0700 Subject: [PATCH 4/8] Correct RL framework extra guidance Keep RSL-RL commands on the default uv environment while selecting extras for optional RL frameworks. Document the separate RLinf installation workflow and correct RSL-RL troubleshooting. --- .../rl_existing_scripts.rst | 23 ++++++++++++------- docs/source/refs/troubleshooting.rst | 7 +++--- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst index 4d16a9b9efc7..5d6487736e48 100644 --- a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst +++ b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst @@ -155,6 +155,13 @@ The contributed Cartpole showcase tasks likewise pair each non-default configs, such as RSL-RL symmetry or recurrent policies and skrl's AMP/IPPO/MAPPO algorithms, are algorithm choices rather than preset requirements. +.. note:: + + RSL-RL is included in the default uv environment. RL-Games, SKRL, and + Stable-Baselines3 are optional, so their uv commands below select the + corresponding extra. RLinf commands assume the dedicated installation in + :ref:`rlinf-post-training` has been completed. + RL-Games -------- @@ -239,13 +246,13 @@ RSL-RL .. code:: bash # run command for training - uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Reach-Franka + uv run isaaclab train --rl_library rsl_rl --task Isaac-Reach-Franka # run command for training with Newton backend - uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Reach-Franka physics=newton_mjwarp + uv run isaaclab train --rl_library rsl_rl --task Isaac-Reach-Franka physics=newton_mjwarp # run command for playing with 32 environments - uv run --extra rsl-rl isaaclab play --rl_library rsl_rl --task Isaac-Reach-Franka --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt + uv run isaaclab play --rl_library rsl_rl --task Isaac-Reach-Franka --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt # run command for recording video of a trained agent - uv run --extra rsl-rl --extra video isaaclab play --rl_library rsl_rl --task Isaac-Reach-Franka --video --video_length 200 + uv run --extra video isaaclab play --rl_library rsl_rl --task Isaac-Reach-Franka --video --video_length 200 .. tab-item:: isaaclab.sh / isaaclab.bat @@ -294,13 +301,13 @@ RSL-RL .. code:: bash # run command for rl training of the teacher agent - uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD + uv run isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD # run command for rl training of the teacher agent with Newton backend - uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD physics=newton_mjwarp + uv run isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD physics=newton_mjwarp # run command for distilling the teacher agent into a student agent - uv run --extra rsl-rl isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name + uv run isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name # run command for playing the student with 64 environments - uv run --extra rsl-rl isaaclab play --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point + uv run isaaclab play --rl_library rsl_rl --task Isaac-Velocity-Flat-AnymalD --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point .. tab-item:: isaaclab.sh / isaaclab.bat diff --git a/docs/source/refs/troubleshooting.rst b/docs/source/refs/troubleshooting.rst index 8511d2086e68..b58f35c42e97 100644 --- a/docs/source/refs/troubleshooting.rst +++ b/docs/source/refs/troubleshooting.rst @@ -93,9 +93,10 @@ Isaac Sim version before installing Isaac Lab. ``ModuleNotFoundError: No module named 'rsl_rl'`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Run the command with the RSL-RL extra: ``uv run --extra rsl-rl ``. For -the legacy installer, use ``./isaaclab.sh -i 'rl[rsl-rl]'`` or -``./isaaclab.sh -i`` to install all frameworks. +RSL-RL is included in the default uv environment. Run ``uv sync`` and retry the +command with ``uv run``. For the legacy installer, use +``./isaaclab.sh -i 'rl[rsl-rl]'`` or ``./isaaclab.sh -i`` to install all +frameworks. Crash in ``libusd_tf`` / USD Symbol Collision with OVRTX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 2fe507a8169a5c3015d53752a701d887685b6604 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 1 Aug 2026 23:34:22 -0700 Subject: [PATCH 5/8] Fix concrete PhysX guard guidance Point Newton incompatibility diagnostics to the concrete Isaac Sim PhysX default instead of the opt-in automatic PhysX selector. --- .../place/config/agibot/place_toy2box_rmp_rel_env_cfg.py | 2 +- .../isaaclab_tasks/contrib/stack/stack_env_cfg.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/place/config/agibot/place_toy2box_rmp_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/place/config/agibot/place_toy2box_rmp_rel_env_cfg.py index 4adab0ecffd5..4d82e25ea065 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/place/config/agibot/place_toy2box_rmp_rel_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/place/config/agibot/place_toy2box_rmp_rel_env_cfg.py @@ -232,7 +232,7 @@ def raise_if_reversed_joints_on_newton(env_cfg) -> None: raise ValueError( "This task's robot has gripper joints authored with reversed body0/body1 ordering, " "which the Newton backend's USD parser does not support ('Reversed joints are not " - "supported'). Re-run this task with physics=physx (the default)." + "supported'). Re-run this task with physics=isaacsim_physx (the default)." ) 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 2534a6fe8a1b..e9a7c1168d51 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 @@ -336,7 +336,7 @@ def raise_if_surface_gripper_on_newton(env_cfg) -> None: if isinstance(env_cfg.sim.physics, NewtonCfg): raise ValueError( "Surface grippers are only supported by the PhysX backend; the Newton backend has no " - "surface-gripper implementation. Re-run this task with physics=physx (the default)." + "surface-gripper implementation. Re-run this task with physics=isaacsim_physx (the default)." ) From e997f0ee3c45ccfb3919c8c53f1b465da665e752 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sat, 1 Aug 2026 23:40:27 -0700 Subject: [PATCH 6/8] Clarify Reach migration default Explain that the multi-backend Reach example intentionally defaults to Newton and that migrations should preserve an established PhysX default with isaacsim_physx. --- docs/source/migration/migrating_to_isaaclab_3-0.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/source/migration/migrating_to_isaaclab_3-0.rst b/docs/source/migration/migrating_to_isaaclab_3-0.rst index 281fe30a9911..e3846efc4a5c 100644 --- a/docs/source/migration/migrating_to_isaaclab_3-0.rst +++ b/docs/source/migration/migrating_to_isaaclab_3-0.rst @@ -698,6 +698,15 @@ subclass that carries both a PhysX and a Newton variant. self.sim.dt = 1 / 60 self.sim.physics = PhysxCfg(bounce_threshold_velocity=0.2) +.. important:: + + The ``After`` example below mirrors the current Reach task, which intentionally + uses Newton/MJWarp as its default. The ``Before`` snippet only illustrates the + older single-backend form, so the default differs between the two snippets. + When migrating a task that should retain PhysX by default, use + ``default: PhysxCfg = isaacsim_physx`` instead. Adding backend variants should + not silently change a task's established default. + *After:* .. code-block:: python From b71ff32c3ec72970f7282b5679f3e350988449d9 Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Sun, 2 Aug 2026 17:09:07 -0700 Subject: [PATCH 7/8] Stabilize OvPhysX root velocity test Derive the expected link velocity from the simulator-reported COM velocity after stepping. This keeps the assertion focused on the frame transformation instead of treating the commanded angular velocity as an exact post-step state. --- source/isaaclab_ovphysx/test/assets/test_rigid_object.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/isaaclab_ovphysx/test/assets/test_rigid_object.py b/source/isaaclab_ovphysx/test/assets/test_rigid_object.py index 7e3ef125d625..3f93e3f5808b 100644 --- a/source/isaaclab_ovphysx/test/assets/test_rigid_object.py +++ b/source/isaaclab_ovphysx/test/assets/test_rigid_object.py @@ -1051,10 +1051,12 @@ def test_body_root_state_properties(num_cubes, device, with_offset): # center of mass vel will be constant (i.e. spinning around com) torch.testing.assert_close(torch.zeros_like(root_com_vel_w[..., :3]), root_com_vel_w[..., :3]) torch.testing.assert_close(torch.zeros_like(body_com_vel_w[..., :3]), body_com_vel_w[..., :3]) - # link frame will be moving, and should be equal to input angular velocity cross offset + # link frame will be moving, and should account for the reported COM velocity and offset lin_vel_rel_root_gt = quat_apply_inverse(root_link_pose_w[..., 3:], root_link_vel_w[..., :3]) lin_vel_rel_body_gt = quat_apply_inverse(body_link_pose_w[..., 3:], body_link_vel_w[..., :3]) - lin_vel_rel_gt = torch.linalg.cross(spin_twist.repeat(num_cubes, 1)[..., 3:], -offset) + com_lin_vel_rel_gt = quat_apply_inverse(root_link_pose_w[..., 3:], root_com_vel_w[..., :3]) + com_ang_vel_rel_gt = quat_apply_inverse(root_link_pose_w[..., 3:], root_com_vel_w[..., 3:]) + lin_vel_rel_gt = com_lin_vel_rel_gt + torch.linalg.cross(com_ang_vel_rel_gt, -offset) torch.testing.assert_close(lin_vel_rel_gt, lin_vel_rel_root_gt, atol=1e-4, rtol=1e-4) torch.testing.assert_close(lin_vel_rel_gt, lin_vel_rel_body_gt.squeeze(-2), atol=1e-4, rtol=1e-4) From 41fc1a8eecebc614043e60316a1a8f40c30f5daf Mon Sep 17 00:00:00 2001 From: Kelly Guo Date: Mon, 3 Aug 2026 12:22:00 -0700 Subject: [PATCH 8/8] Clarify automatic PhysX selection Describe current preset behavior without historical chronology. --- docs/source/features/hydra.rst | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/docs/source/features/hydra.rst b/docs/source/features/hydra.rst index ca3f491b67ec..6ff952adce3d 100644 --- a/docs/source/features/hydra.rst +++ b/docs/source/features/hydra.rst @@ -264,15 +264,13 @@ override is given: # Use Newton physics backend python train.py --task=Isaac-Reach-Franka env.physics=newton_mjwarp -Tasks that previously used automatic ``PhysxAutoCfg`` selection by default now -use the concrete ``isaacsim_physx`` variant by default. Existing explicit -defaults, such as Newton, remain unchanged. The explicit ``physics=physx`` -selector opts into automatic PhysX-family selection at launch time: Isaac Sim -PhysX is used when a Kit renderer or Kit viewer is requested. For fully kit-less -runs, OvPhysX is used when the task configures an OvPhysX alternative; otherwise -selection falls back to Isaac Sim PhysX and requires Kit. This matches renderer -selection, where ``isaacsim_rtx`` is the concrete default and ``renderer=rtx`` -is automatic. +The concrete ``isaacsim_physx`` variant is the default in this example. Select +``physics=physx`` to enable automatic PhysX-family selection at launch time: +Isaac Sim PhysX is used when a Kit renderer or Kit viewer is requested. For fully +kit-less runs, OvPhysX is used when the task configures an OvPhysX alternative; +otherwise selection falls back to Isaac Sim PhysX and requires Kit. This matches +renderer selection, where ``isaacsim_rtx`` is the concrete default and +``renderer=rtx`` is automatic. The ``default`` field can be set to ``None`` to make an optional feature that is disabled unless explicitly selected: