Skip to content

Commit 09c163e

Browse files
authored
[Workflow] Default core tasks to RSL-RL (#7067)
Splits the default RL-library change from #6980.\n\n- Resolves `default_agent` from task registration when `--rl_library` is omitted.\n- Registers RSL-RL as the default for core tasks, including a Pendulum RSL-RL config.\n- Adds dispatch coverage and a breaking-change fragment.\n\nValidation: `uv run python -m pytest source/isaaclab_rl/test/test_entrypoints.py -q` (11 passed, 2 skipped).\n\nSupersedes the RSL-RL portion of #6980.
1 parent d914d4a commit 09c163e

23 files changed

Lines changed: 102 additions & 1 deletion

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Changed
2+
^^^^^^^
3+
4+
* **Breaking:** Changed the ``train`` and ``play`` CLI commands to use a task's
5+
registered default RL library when ``--rl_library`` is omitted. Pass
6+
``--rl_library`` explicitly to select a different library.

source/isaaclab_rl/isaaclab_rl/entrypoints/dispatch.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import sys
1414
from typing import TYPE_CHECKING
1515

16+
import gymnasium as gym
17+
1618
if TYPE_CHECKING:
1719
from .simple_agents import PolicyName
1820

@@ -106,6 +108,8 @@ def run_cli(action: str, argv: list[str] | None = None) -> int:
106108
parser = argparse.ArgumentParser(add_help=False)
107109
parser.add_argument("--rl_library", choices=sorted(backends))
108110
selected, backend_argv = parser.parse_known_args(argv)
111+
if selected.rl_library is None:
112+
selected.rl_library = _resolve_default_library(argv, backends)
109113
if selected.rl_library is None:
110114
_print_selector_help(action, sorted(backends))
111115
if "-h" in argv or "--help" in argv:
@@ -116,6 +120,23 @@ def run_cli(action: str, argv: list[str] | None = None) -> int:
116120
return 0
117121

118122

123+
def _resolve_default_library(argv: list[str], backends: dict[str, str]) -> str | None:
124+
"""Return the task-registered default RL library requested by command-line arguments."""
125+
parser = argparse.ArgumentParser(add_help=False)
126+
parser.add_argument("--task")
127+
args, _ = parser.parse_known_args(argv)
128+
if args.task is None:
129+
return None
130+
131+
import isaaclab_tasks # noqa: F401
132+
133+
try:
134+
default_library = gym.spec(args.task.split(":")[-1]).kwargs.get("default_agent")
135+
except gym.error.Error:
136+
return None
137+
return default_library if default_library in backends else None
138+
139+
119140
def _print_selector_help(action: str, backends: list[str]) -> None:
120141
"""Print help for a unified entrypoint before a backend is selected."""
121142
parser = argparse.ArgumentParser(description=f"{action.capitalize()} an RL agent with a selected backend.")

source/isaaclab_rl/test/test_entrypoints.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import sys
1313
import types
1414

15+
import gymnasium as gym
1516
import pytest
1617

1718
from isaaclab_rl.entrypoints import PlaybackRequest, TrainingRequest, api, dispatch
@@ -146,6 +147,32 @@ def _fake_run_backend(module_name: str, argv: list[str], *, run_as_script: bool)
146147
}
147148

148149

150+
def test_dispatch_uses_task_registered_default_backend(monkeypatch) -> None:
151+
"""A task registry default selects the backend when the CLI omits it."""
152+
task_name = "Isaac-DefaultAgentDispatchTest"
153+
gym.register(id=task_name, entry_point="dummy:Env", kwargs={"default_agent": "rsl_rl"})
154+
monkeypatch.setitem(sys.modules, "isaaclab_tasks", types.ModuleType("isaaclab_tasks"))
155+
received: dict[str, object] = {}
156+
monkeypatch.setattr(
157+
dispatch,
158+
"_run_backend",
159+
lambda module_name, argv, *, run_as_script: received.update(
160+
module_name=module_name, argv=argv, run_as_script=run_as_script
161+
),
162+
)
163+
164+
try:
165+
assert dispatch.run_train_cli(["--task", task_name]) == 0
166+
finally:
167+
gym.registry.pop(task_name, None)
168+
169+
assert received == {
170+
"module_name": "isaaclab_rl.entrypoints.backends.train_rsl_rl",
171+
"argv": ["--task", task_name],
172+
"run_as_script": False,
173+
}
174+
175+
149176
def test_dispatch_fuses_option_like_kit_args(monkeypatch) -> None:
150177
"""Space-separated option-like Kit arguments are fused before backend parsing."""
151178
received: dict[str, object] = {}
@@ -160,7 +187,7 @@ def test_dispatch_fuses_option_like_kit_args(monkeypatch) -> None:
160187

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

165192

166193
def _torch_backend_state() -> tuple[bool, bool, bool, bool]:
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Changed
2+
^^^^^^^
3+
4+
* **Breaking:** Changed core tasks to use RSL-RL when ``--rl_library`` is omitted, except the multi-agent Pendulum task, which uses SKRL.
5+
Pass ``--rl_library`` explicitly to select a different RL library.

source/isaaclab_tasks/isaaclab_tasks/core/cabinet/config/franka/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
kwargs={
1818
"env_cfg_entry_point": f"{__name__}.joint_pos_env_cfg:FrankaCabinetEnvCfg",
1919
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CabinetPPORunnerCfg",
20+
"default_agent": "rsl_rl",
2021
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_manager_ppo_cfg.yaml",
2122
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_manager_ppo_cfg.yaml",
2223
},
@@ -35,6 +36,7 @@
3536
"env_cfg_entry_point": f"{__name__}.cabinet_direct_env_cfg:FrankaCabinetDirectEnvCfg",
3637
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_direct_ppo_cfg.yaml",
3738
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaCabinetPPORunnerCfg",
39+
"default_agent": "rsl_rl",
3840
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_direct_ppo_cfg.yaml",
3941
},
4042
)

source/isaaclab_tasks/isaaclab_tasks/core/cartpole/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"env_cfg_entry_point": f"{__name__}.cartpole_direct_env_cfg:CartpoleEnvCfg",
3838
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_direct_ppo_cfg.yaml",
3939
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CartpoleDirectPPORunnerCfg",
40+
"default_agent": "rsl_rl",
4041
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_direct_ppo_cfg.yaml",
4142
"sb3_cfg_entry_point": f"{agents.__name__}:sb3_ppo_cfg.yaml",
4243
},
@@ -50,6 +51,7 @@
5051
"env_cfg_entry_point": f"{__name__}.cartpole_direct_camera_env_cfg:CartpoleCameraEnvCfg",
5152
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
5253
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CartpoleCameraDirectPPORunnerCfg",
54+
"default_agent": "rsl_rl",
5355
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_direct_camera_ppo_cfg.yaml",
5456
},
5557
)
@@ -66,6 +68,7 @@
6668
"env_cfg_entry_point": f"{__name__}.cartpole_manager_env_cfg:CartpoleEnvCfg",
6769
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_manager_ppo_cfg.yaml",
6870
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CartpolePPORunnerCfg",
71+
"default_agent": "rsl_rl",
6972
"rsl_rl_with_symmetry_cfg_entry_point": (
7073
f"{agents.__name__}.rsl_rl_ppo_cfg:CartpolePPORunnerWithSymmetryCfg"
7174
),
@@ -83,6 +86,7 @@
8386
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
8487
"rl_games_feature_cfg_entry_point": f"{agents.__name__}:rl_games_manager_feature_ppo_cfg.yaml",
8588
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:CartpoleCameraPPORunnerCfg",
89+
"default_agent": "rsl_rl",
8690
"rsl_rl_feature_cfg_entry_point": (
8791
f"{agents.__name__}.rsl_rl_ppo_cfg:CartpoleCameraFeaturePPORunnerCfg"
8892
),

source/isaaclab_tasks/isaaclab_tasks/core/fourbar_pole/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@
2020
kwargs={
2121
"env_cfg_entry_point": f"{__name__}.fourbar_pole_manager_env_cfg:FourbarPoleSwingupEnvCfg",
2222
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_manager_ppo_cfg:FourbarPolePPORunnerCfg",
23+
"default_agent": "rsl_rl",
2324
},
2425
)

source/isaaclab_tasks/isaaclab_tasks/core/handover/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
kwargs={
2323
"env_cfg_entry_point": f"{__name__}.handover_env_cfg:HandoverEnvCfg",
2424
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:HandoverPPORunnerCfg",
25+
"default_agent": "rsl_rl",
2526
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_ppo_cfg.yaml",
2627
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_ppo_cfg.yaml",
2728
"skrl_ippo_cfg_entry_point": f"{agents.__name__}:skrl_ippo_cfg.yaml",

source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
kwargs={
2121
"env_cfg_entry_point": f"{__name__}.franka_env_cfg:FrankaReorientEnvCfg",
2222
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaPPORunnerCfg",
23+
"default_agent": "rsl_rl",
2324
},
2425
)
2526

@@ -30,5 +31,6 @@
3031
kwargs={
3132
"env_cfg_entry_point": f"{__name__}.franka_env_cfg:FrankaLiftEnvCfg",
3233
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaPPORunnerCfg",
34+
"default_agent": "rsl_rl",
3335
},
3436
)

source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
kwargs={
1919
"env_cfg_entry_point": f"{__name__}.franka_soft_env_cfg:FrankaSoftEnvCfg",
2020
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaDeformablePPORunnerCfg",
21+
"default_agent": "rsl_rl",
2122
},
2223
)
2324

@@ -28,6 +29,7 @@
2829
kwargs={
2930
"env_cfg_entry_point": f"{__name__}.franka_cloth_env_cfg:FrankaClothEnvCfg",
3031
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaClothPPORunnerCfg",
32+
"default_agent": "rsl_rl",
3133
},
3234
)
3335

@@ -61,6 +63,7 @@
6163
kwargs={
6264
"env_cfg_entry_point": f"{__name__}.franka_soft_env_cfg:FrankaSoftCameraEnvCfg",
6365
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaDeformableCameraPPORunnerCfg",
66+
"default_agent": "rsl_rl",
6467
},
6568
)
6669

@@ -71,5 +74,6 @@
7174
kwargs={
7275
"env_cfg_entry_point": f"{__name__}.franka_cloth_env_cfg:FrankaClothCameraEnvCfg",
7376
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaDeformableCameraPPORunnerCfg",
77+
"default_agent": "rsl_rl",
7478
},
7579
)

0 commit comments

Comments
 (0)