Skip to content
Closed
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions source/isaaclab_rl/changelog.d/default-newton-rsl.minor.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Changed
^^^^^^^

* **Breaking:** Changed the ``train`` and ``play`` CLI commands to use a task's
registered default RL library when ``--rl_library`` is omitted. Pass
``--rl_library`` explicitly to select a different library.
21 changes: 21 additions & 0 deletions source/isaaclab_rl/isaaclab_rl/entrypoints/dispatch.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import sys
from typing import TYPE_CHECKING

import gymnasium as gym

if TYPE_CHECKING:
from .simple_agents import PolicyName

Expand Down Expand Up @@ -106,6 +108,8 @@ def run_cli(action: str, argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("--rl_library", choices=sorted(backends))
selected, backend_argv = parser.parse_known_args(argv)
if selected.rl_library is None:
selected.rl_library = _resolve_default_library(argv, backends)
if selected.rl_library is None:
_print_selector_help(action, sorted(backends))
if "-h" in argv or "--help" in argv:
Expand All @@ -116,6 +120,23 @@ def run_cli(action: str, argv: list[str] | None = None) -> int:
return 0


def _resolve_default_library(argv: list[str], backends: dict[str, str]) -> str | None:
"""Return the task-registered default RL library requested by command-line arguments."""
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("--task")
args, _ = parser.parse_known_args(argv)
if args.task is None:
return None

import isaaclab_tasks # noqa: F401

try:
default_library = gym.spec(args.task.split(":")[-1]).kwargs.get("default_agent")
except gym.error.Error:
return None
return default_library if default_library in backends else None


def _print_selector_help(action: str, backends: list[str]) -> None:
"""Print help for a unified entrypoint before a backend is selected."""
parser = argparse.ArgumentParser(description=f"{action.capitalize()} an RL agent with a selected backend.")
Expand Down
29 changes: 28 additions & 1 deletion source/isaaclab_rl/test/test_entrypoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import sys
import types

import gymnasium as gym
import pytest

from isaaclab_rl.entrypoints import PlaybackRequest, TrainingRequest, api, dispatch
Expand Down Expand Up @@ -128,6 +129,32 @@ def _fake_run_backend(module_name: str, argv: list[str], *, run_as_script: bool)
}


def test_dispatch_uses_task_registered_default_backend(monkeypatch) -> None:
"""A task registry default selects the backend when the CLI omits it."""
task_name = "Isaac-DefaultAgentDispatchTest"
gym.register(id=task_name, entry_point="dummy:Env", kwargs={"default_agent": "rsl_rl"})
monkeypatch.setitem(sys.modules, "isaaclab_tasks", types.ModuleType("isaaclab_tasks"))
received: dict[str, object] = {}
monkeypatch.setattr(
dispatch,
"_run_backend",
lambda module_name, argv, *, run_as_script: received.update(
module_name=module_name, argv=argv, run_as_script=run_as_script
),
)

try:
assert dispatch.run_train_cli(["--task", task_name]) == 0
finally:
gym.registry.pop(task_name, None)

assert received == {
"module_name": "isaaclab_rl.entrypoints.backends.train_rsl_rl",
"argv": ["--task", task_name],
"run_as_script": False,
}


def test_dispatch_fuses_option_like_kit_args(monkeypatch) -> None:
"""Space-separated option-like Kit arguments are fused before backend parsing."""
received: dict[str, object] = {}
Expand All @@ -142,7 +169,7 @@ def test_dispatch_fuses_option_like_kit_args(monkeypatch) -> None:

def test_dispatch_requires_a_backend() -> None:
"""Missing backend selection returns the conventional CLI error status."""
assert dispatch.run_train_cli(["--task", "Isaac-Cartpole"]) == 2
assert dispatch.run_train_cli([]) == 2


def _torch_backend_state() -> tuple[bool, bool, bool, bool]:
Expand Down
10 changes: 10 additions & 0 deletions source/isaaclab_tasks/changelog.d/default-newton-rsl.minor.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Changed
^^^^^^^

* **Breaking:** Changed the default task physics and renderer presets to Newton
MJWarp and the Newton renderer, and changed the default RL library to RSL-RL.
Select an explicit preset or pass ``--rl_library`` to retain a different
backend or RL library.
* Changed the recorded robot-PoV camera used by the XR reference tasks to pin the
Isaac RTX renderer, since the Newton renderer cannot load the UDIM textures of
those robot assets. Select ``newton_renderer`` explicitly to override.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

"""Shared recorded robot-PoV camera configuration for contributed tasks."""

from isaaclab_physx.renderers import IsaacRtxRendererCfg

import isaaclab.sim as sim_utils
from isaaclab.sensors import CameraCfg

Expand All @@ -19,6 +21,10 @@ def robot_pov_camera_cfg(
) -> CameraCfg:
"""Return a recorded robot-PoV camera under a prim that follows physical-body motion.

The camera defaults to the Isaac RTX renderer instead of the ``MultiBackendRendererCfg``
default: the Newton warp renderer cannot load the UDIM textures used by the humanoid
assets these feeds record. Select ``newton_renderer`` explicitly to override.

Args:
parent_prim_path: Path of the robot prim whose transform inherits physical-body motion.
offset_pos: Camera position in the parent body frame.
Expand All @@ -30,7 +36,7 @@ def robot_pov_camera_cfg(
height=450,
width=720,
data_types=["rgb"],
renderer_cfg=MultiBackendRendererCfg(),
renderer_cfg=MultiBackendRendererCfg(default=IsaacRtxRendererCfg()),
spawn=sim_utils.PinholeCameraCfg(focal_length=18.15, clipping_range=(0.1, 2.0)),
offset=CameraCfg.OffsetCfg(pos=offset_pos, rot=offset_rot, convention="ros"),
)
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ class CabinetSimCfg(PresetCfg):
physx: SimulationCfg = isaacsim_physx.replace(
physics=PhysxAutoCfg(isaacsim_physx=isaacsim_physx.physics, ovphysx=ovphysx.physics)
)
default: SimulationCfg = isaacsim_physx
newton_mjwarp: SimulationCfg = SimulationCfg(
dt=1 / 600,
render_interval=1,
Expand All @@ -125,6 +124,7 @@ class CabinetSimCfg(PresetCfg):
default_visualizer_cfg=VisualizerCfg(eye=(-2.0, 2.0, 2.0), lookat=(0.8, 0.0, 0.5)),
physics=NewtonCfg(solver_cfg=KaminoSolverCfg(max_contacts_per_world=64)),
)
default: SimulationCfg = newton_mjwarp


@configclass
Expand All @@ -138,9 +138,9 @@ class CabinetDecimationCfg(PresetCfg):
isaacsim_physx: int = 1
ovphysx: int = isaacsim_physx
physx: int = isaacsim_physx
default: int = isaacsim_physx
newton_mjwarp: int = 10
newton_kamino: int = 10
default: int = newton_mjwarp


##
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.joint_pos_env_cfg:FrankaCabinetEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CabinetPPORunnerCfg",
"default_agent": "rsl_rl",
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_manager_ppo_cfg.yaml",
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_manager_ppo_cfg.yaml",
},
Expand All @@ -35,6 +36,7 @@
"env_cfg_entry_point": f"{__name__}.cabinet_direct_env_cfg:FrankaCabinetDirectEnvCfg",
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_direct_ppo_cfg.yaml",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaCabinetPPORunnerCfg",
"default_agent": "rsl_rl",
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_direct_ppo_cfg.yaml",
},
)
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"env_cfg_entry_point": f"{__name__}.cartpole_direct_env_cfg:CartpoleEnvCfg",
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_direct_ppo_cfg.yaml",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CartpoleDirectPPORunnerCfg",
"default_agent": "rsl_rl",
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_direct_ppo_cfg.yaml",
"sb3_cfg_entry_point": f"{agents.__name__}:sb3_ppo_cfg.yaml",
},
Expand All @@ -50,6 +51,7 @@
"env_cfg_entry_point": f"{__name__}.cartpole_direct_camera_env_cfg:CartpoleCameraEnvCfg",
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CartpoleCameraDirectPPORunnerCfg",
"default_agent": "rsl_rl",
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_direct_camera_ppo_cfg.yaml",
},
)
Expand All @@ -66,6 +68,7 @@
"env_cfg_entry_point": f"{__name__}.cartpole_manager_env_cfg:CartpoleEnvCfg",
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_manager_ppo_cfg.yaml",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CartpolePPORunnerCfg",
"default_agent": "rsl_rl",
"rsl_rl_with_symmetry_cfg_entry_point": (
f"{agents.__name__}.rsl_rl_ppo_cfg:CartpolePPORunnerWithSymmetryCfg"
),
Expand All @@ -83,6 +86,7 @@
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
"rl_games_feature_cfg_entry_point": f"{agents.__name__}:rl_games_manager_feature_ppo_cfg.yaml",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CartpoleCameraPPORunnerCfg",
"default_agent": "rsl_rl",
"rsl_rl_feature_cfg_entry_point": (
f"{agents.__name__}.rsl_rl_ppo_cfg:CartpoleCameraFeaturePPORunnerCfg"
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ class CartpolePhysicsCfg(PresetCfg):
isaacsim_physx: PhysxCfg = PhysxCfg()
ovphysx: OvPhysxCfg = OvPhysxCfg()
physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx)
default = isaacsim_physx
newton_mjwarp: NewtonCfg = NewtonCfg(
solver_cfg=MJWarpSolverCfg(
njmax=5,
Expand Down Expand Up @@ -64,6 +63,7 @@ class CartpolePhysicsCfg(PresetCfg):
debug_mode=False,
use_cuda_graph=True,
)
default = newton_mjwarp


@configclass
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ class CartpolePhysicsCfg(PresetCfg):
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,
Expand All @@ -52,6 +51,7 @@ class CartpolePhysicsCfg(PresetCfg):
debug_mode=False,
use_cuda_graph=True,
)
default: NewtonCfg = newton_mjwarp
newton_kamino: NewtonCfg = NewtonCfg(
solver_cfg=KaminoSolverCfg(
integrator="moreau",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.fourbar_pole_manager_env_cfg:FourbarPoleSwingupEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_manager_ppo_cfg:FourbarPolePPORunnerCfg",
"default_agent": "rsl_rl",
},
)
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.handover_env_cfg:HandoverEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:HandoverPPORunnerCfg",
"default_agent": "rsl_rl",
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_ppo_cfg.yaml",
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_ppo_cfg.yaml",
"skrl_ippo_cfg_entry_point": f"{agents.__name__}:skrl_ippo_cfg.yaml",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.franka_env_cfg:FrankaReorientEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaPPORunnerCfg",
"default_agent": "rsl_rl",
},
)

Expand All @@ -30,5 +31,6 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.franka_env_cfg:FrankaLiftEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaPPORunnerCfg",
"default_agent": "rsl_rl",
},
)
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.franka_soft_env_cfg:FrankaSoftEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaDeformablePPORunnerCfg",
"default_agent": "rsl_rl",
},
)

Expand All @@ -28,6 +29,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.franka_cloth_env_cfg:FrankaClothEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaClothPPORunnerCfg",
"default_agent": "rsl_rl",
},
)

Expand All @@ -38,6 +40,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.franka_soft_env_cfg:FrankaSoftCameraEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaDeformableCameraPPORunnerCfg",
"default_agent": "rsl_rl",
},
)

Expand All @@ -48,5 +51,6 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.franka_cloth_env_cfg:FrankaClothCameraEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaDeformableCameraPPORunnerCfg",
"default_agent": "rsl_rl",
},
)
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.kuka_allegro_env_cfg:KukaAllegroReorientEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:KukaAllegroPPORunnerCfg",
"default_agent": "rsl_rl",
},
)

Expand All @@ -30,6 +31,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.kuka_allegro_env_cfg:KukaAllegroLiftEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:KukaAllegroPPORunnerCfg",
"default_agent": "rsl_rl",
},
)

Expand All @@ -44,6 +46,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.kuka_allegro_camera_env_cfg:KukaAllegroReorientCameraEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:KukaAllegroPPORunnerCfg",
"default_agent": "rsl_rl",
},
)

Expand All @@ -54,5 +57,6 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.kuka_allegro_camera_env_cfg:KukaAllegroLiftCameraEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:KukaAllegroPPORunnerCfg",
"default_agent": "rsl_rl",
},
)
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ class KukaAllegroPhysicsCfg(lift.PhysicsCfg):
gpu_found_lost_pairs_capacity=2**26,
)
physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx)
default = isaacsim_physx
newton_mjwarp = lift.PhysicsCfg().newton_mjwarp
default = newton_mjwarp


@configclass
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ class PhysicsCfg(PresetCfg):
debug_mode=False,
)
physx = PhysxAutoCfg(isaacsim_physx=isaacsim_physx)
default = isaacsim_physx
default = newton_mjwarp


@configclass
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"env_cfg_entry_point": f"{__name__}.ant_direct_env_cfg:AntEnvCfg",
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_direct_ppo_cfg.yaml",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:AntDirectPPORunnerCfg",
"default_agent": "rsl_rl",
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_direct_ppo_cfg.yaml",
},
)
Expand All @@ -42,6 +43,7 @@
kwargs={
"env_cfg_entry_point": f"{__name__}.ant_manager_env_cfg:AntEnvCfg",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:AntPPORunnerCfg",
"default_agent": "rsl_rl",
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_manager_ppo_cfg.yaml",
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_manager_ppo_cfg.yaml",
"sb3_cfg_entry_point": f"{agents.__name__}:sb3_manager_ppo_cfg.yaml",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ class AntPhysicsCfg(PresetCfg):
isaacsim_physx: PhysxCfg = PhysxCfg(bounce_threshold_velocity=0.2)
ovphysx: OvPhysxCfg = OvPhysxCfg()
physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx)
default = isaacsim_physx
newton_mjwarp: NewtonCfg = NewtonCfg(
solver_cfg=MJWarpSolverCfg(
njmax=45,
Expand Down Expand Up @@ -63,6 +62,7 @@ class AntPhysicsCfg(PresetCfg):
debug_mode=False,
use_cuda_graph=True,
)
default = newton_mjwarp


@configclass
Expand Down
Loading
Loading