Skip to content

Commit 84fdf54

Browse files
committed
Consolidate Cartpole task IDs via preset CLI
Collapse 35 per-variant Cartpole gym task IDs into 4 consolidated tasks that select the variant via the typed preset CLI from isaac-sim#5587: - Isaac-Cartpole-Camera-Direct-v0 (subsumes 7 Direct-backend perception IDs) - Isaac-Cartpole-Camera-v0 (subsumes 4 manager-based perception IDs) - Isaac-Cartpole-Showcase-Direct-v0 (subsumes 15 proprioceptive showcase IDs) - Isaac-Cartpole-Camera-Showcase-Direct-v0 (subsumes 9 camera showcase IDs) Variant selection moves from the gym ID to ``presets=<name>`` (plus ``physics=`` / ``renderer=`` on the Direct-backend camera task, and ``--agent=`` where the per-shape skrl / rl_games yaml differs from the default). Each retired ID stays registered for one release with an env_cfg_entry_point that emits a DeprecationWarning naming the new task and the equivalent CLI tokens, then returns the corresponding cfg. The shim machinery is factored into a new helper: isaaclab_tasks.utils.deprecated_task_alias( old_task_id, new_command, consolidated_cfg_path, cfg_factory=None ) which wraps the warning emission plus lazy cfg resolution behind the ``"module:Name"`` entry-point string convention gym uses elsewhere. The consolidated PresetCfg classes live alongside their per-variant siblings in the existing *_env_cfg.py files; no new wrapper modules. PresetCfg's docstring now documents the underscore-prefix convention for class-local helpers (the resolver already skips them). Full per-ID migration table is in the PR description.
1 parent bb9388e commit 84fdf54

16 files changed

Lines changed: 991 additions & 165 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
Added
2+
^^^^^
3+
4+
* Added four consolidated Cartpole perception tasks that subsume 35
5+
per-variant task IDs via the typed preset CLI (#5587):
6+
``Isaac-Cartpole-Camera-Direct-v0``, ``Isaac-Cartpole-Camera-v0``,
7+
``Isaac-Cartpole-Showcase-Direct-v0``, and
8+
``Isaac-Cartpole-Camera-Showcase-Direct-v0``. Variant (data type,
9+
observation pipeline, gym-space shape) selected at runtime via
10+
``presets=<name>``; agent yaml selected via
11+
``--agent=<entry_point_name>`` for the manager perception feature
12+
policies and all non-default showcase shapes.
13+
* Added :func:`isaaclab_tasks.utils.deprecated_task_alias` -- factory
14+
that wraps a retired gym task ID with a :class:`DeprecationWarning`
15+
naming the consolidated task plus its equivalent CLI tokens, and
16+
lazily resolves the cfg variant at ``gym.make`` time.
17+
18+
Deprecated
19+
^^^^^^^^^^
20+
21+
* Deprecated 35 per-variant Cartpole task IDs (7 Direct-backend camera,
22+
4 manager-based camera, 15 proprioceptive showcase, 9 camera-based
23+
showcase) in favor of the four consolidated tasks above. Each retired
24+
ID still loads and emits a :class:`DeprecationWarning` naming the
25+
consolidated task and the equivalent ``presets=<name>`` (plus
26+
``--agent=<entry_point_name>`` where required) invocation. Full
27+
migration table is in the PR description.

source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/__init__.py

Lines changed: 100 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import gymnasium as gym
1111

12+
from isaaclab_tasks.utils import deprecated_task_alias
13+
1214
from . import agents
1315

1416
##
@@ -29,78 +31,150 @@
2931
)
3032

3133
gym.register(
32-
id="Isaac-Cartpole-RGB-Camera-Direct-v0",
34+
id="Isaac-Cartpole-Camera-Direct-v0",
3335
entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv",
3436
disable_env_checker=True,
3537
kwargs={
36-
"env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleRGBCameraEnvCfg",
38+
"env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleCameraPresetsEnvCfg",
3739
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
3840
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml",
3941
},
4042
)
4143

44+
45+
# Retired per-data-type camera task IDs. Each is registered as a deprecation
46+
# shim that emits a DeprecationWarning naming the consolidated task with the
47+
# equivalent presets=<name>, then loads the corresponding variant of
48+
# CartpoleCameraPresetsEnvCfg. The nested tiled_camera attribute must be
49+
# pinned alongside the root preset -- see _resolve_camera_variant.
50+
_CAMERA_CFG_PATH = f"{__name__}.cartpole_camera_env_cfg:CartpoleCameraPresetsEnvCfg"
51+
_CAMERA_KWARGS = {
52+
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
53+
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml",
54+
}
55+
56+
57+
def _resolve_camera_variant(preset_name: str):
58+
"""Lazy 2-axis resolver: pin both the root cfg variant and the nested
59+
``tiled_camera`` preset. Without this the nested PresetCfg's default
60+
(rgb) wins and a deprecated albedo task would load albedo's
61+
``observation_space`` with rgb ``data_types``.
62+
63+
Returns a zero-arg callable so the import of
64+
:class:`CartpoleCameraPresetsEnvCfg` is deferred to ``gym.make()``.
65+
"""
66+
67+
def call():
68+
from .cartpole_camera_env_cfg import CartpoleCameraPresetsEnvCfg
69+
70+
cfg = CartpoleCameraPresetsEnvCfg()
71+
result = getattr(cfg, preset_name)
72+
result.tiled_camera = getattr(result.tiled_camera, preset_name)
73+
return result
74+
75+
return call
76+
77+
4278
gym.register(
43-
id="Isaac-Cartpole-Albedo-Camera-Direct-v0",
79+
id="Isaac-Cartpole-Camera-Presets-Direct-v0",
4480
entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv",
4581
disable_env_checker=True,
4682
kwargs={
47-
"env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleAlbedoCameraEnvCfg",
48-
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
49-
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml",
83+
"env_cfg_entry_point": deprecated_task_alias(
84+
"Isaac-Cartpole-Camera-Presets-Direct-v0",
85+
"--task=Isaac-Cartpole-Camera-Direct-v0",
86+
_CAMERA_CFG_PATH,
87+
),
88+
**_CAMERA_KWARGS,
5089
},
5190
)
5291

5392
gym.register(
54-
id="Isaac-Cartpole-SimpleShading-Constant-Camera-Direct-v0",
93+
id="Isaac-Cartpole-RGB-Camera-Direct-v0",
5594
entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv",
5695
disable_env_checker=True,
5796
kwargs={
58-
"env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleSimpleShadingConstantCameraEnvCfg",
59-
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
60-
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml",
97+
"env_cfg_entry_point": deprecated_task_alias(
98+
"Isaac-Cartpole-RGB-Camera-Direct-v0",
99+
"--task=Isaac-Cartpole-Camera-Direct-v0 presets=rgb",
100+
_CAMERA_CFG_PATH,
101+
cfg_factory=_resolve_camera_variant("rgb"),
102+
),
103+
**_CAMERA_KWARGS,
61104
},
62105
)
63106

64107
gym.register(
65-
id="Isaac-Cartpole-SimpleShading-Diffuse-Camera-Direct-v0",
108+
id="Isaac-Cartpole-Albedo-Camera-Direct-v0",
66109
entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv",
67110
disable_env_checker=True,
68111
kwargs={
69-
"env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleSimpleShadingDiffuseCameraEnvCfg",
70-
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
71-
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml",
112+
"env_cfg_entry_point": deprecated_task_alias(
113+
"Isaac-Cartpole-Albedo-Camera-Direct-v0",
114+
"--task=Isaac-Cartpole-Camera-Direct-v0 presets=albedo",
115+
_CAMERA_CFG_PATH,
116+
cfg_factory=_resolve_camera_variant("albedo"),
117+
),
118+
**_CAMERA_KWARGS,
72119
},
73120
)
74121

75122
gym.register(
76-
id="Isaac-Cartpole-SimpleShading-Full-Camera-Direct-v0",
123+
id="Isaac-Cartpole-SimpleShading-Constant-Camera-Direct-v0",
77124
entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv",
78125
disable_env_checker=True,
79126
kwargs={
80-
"env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleSimpleShadingFullCameraEnvCfg",
81-
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
82-
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml",
127+
"env_cfg_entry_point": deprecated_task_alias(
128+
"Isaac-Cartpole-SimpleShading-Constant-Camera-Direct-v0",
129+
"--task=Isaac-Cartpole-Camera-Direct-v0 presets=simple_shading_constant_diffuse",
130+
_CAMERA_CFG_PATH,
131+
cfg_factory=_resolve_camera_variant("simple_shading_constant_diffuse"),
132+
),
133+
**_CAMERA_KWARGS,
83134
},
84135
)
85136

86137
gym.register(
87-
id="Isaac-Cartpole-Depth-Camera-Direct-v0",
138+
id="Isaac-Cartpole-SimpleShading-Diffuse-Camera-Direct-v0",
88139
entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv",
89140
disable_env_checker=True,
90141
kwargs={
91-
"env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleDepthCameraEnvCfg",
92-
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
93-
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml",
142+
"env_cfg_entry_point": deprecated_task_alias(
143+
"Isaac-Cartpole-SimpleShading-Diffuse-Camera-Direct-v0",
144+
"--task=Isaac-Cartpole-Camera-Direct-v0 presets=simple_shading_diffuse_mdl",
145+
_CAMERA_CFG_PATH,
146+
cfg_factory=_resolve_camera_variant("simple_shading_diffuse_mdl"),
147+
),
148+
**_CAMERA_KWARGS,
94149
},
95150
)
96151

97152
gym.register(
98-
id="Isaac-Cartpole-Camera-Presets-Direct-v0",
153+
id="Isaac-Cartpole-SimpleShading-Full-Camera-Direct-v0",
99154
entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv",
100155
disable_env_checker=True,
101156
kwargs={
102-
"env_cfg_entry_point": f"{__name__}.cartpole_camera_presets_env_cfg:CartpoleCameraPresetsEnvCfg",
103-
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml",
104-
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml",
157+
"env_cfg_entry_point": deprecated_task_alias(
158+
"Isaac-Cartpole-SimpleShading-Full-Camera-Direct-v0",
159+
"--task=Isaac-Cartpole-Camera-Direct-v0 presets=simple_shading_full_mdl",
160+
_CAMERA_CFG_PATH,
161+
cfg_factory=_resolve_camera_variant("simple_shading_full_mdl"),
162+
),
163+
**_CAMERA_KWARGS,
164+
},
165+
)
166+
167+
gym.register(
168+
id="Isaac-Cartpole-Depth-Camera-Direct-v0",
169+
entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv",
170+
disable_env_checker=True,
171+
kwargs={
172+
"env_cfg_entry_point": deprecated_task_alias(
173+
"Isaac-Cartpole-Depth-Camera-Direct-v0",
174+
"--task=Isaac-Cartpole-Camera-Direct-v0 presets=depth",
175+
_CAMERA_CFG_PATH,
176+
cfg_factory=_resolve_camera_variant("depth"),
177+
),
178+
**_CAMERA_KWARGS,
105179
},
106180
)

source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_camera_env_cfg.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from isaaclab.sim import SimulationCfg
1414
from isaaclab.utils import configclass
1515

16+
from isaaclab_tasks.utils import PresetCfg
1617
from isaaclab_tasks.utils.presets import MultiBackendRendererCfg
1718

1819
from isaaclab_assets.robots.cartpole import CARTPOLE_CFG
@@ -158,3 +159,99 @@ class CartpoleSimpleShadingFullCameraEnvCfg(CartpoleRGBCameraEnvCfg):
158159

159160
# spaces
160161
observation_space = [tiled_camera.height, tiled_camera.width, 3]
162+
163+
164+
##
165+
# Consolidated PresetCfg
166+
##
167+
168+
169+
@configclass
170+
class MultiDataTypeCartpoleTiledCameraCfg(PresetCfg):
171+
@configclass
172+
class CartpoleTiledCameraCfg(CameraCfg):
173+
prim_path: str = "/World/envs/env_.*/Camera"
174+
offset: CameraCfg.OffsetCfg = CameraCfg.OffsetCfg(
175+
pos=(-5.0, 0.0, 2.0), rot=(0.0, 0.0, 0.0, 1.0), convention="world"
176+
)
177+
data_types: list[str] = []
178+
spawn: sim_utils.PinholeCameraCfg = sim_utils.PinholeCameraCfg(
179+
focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 20.0)
180+
)
181+
width: int = 100
182+
height: int = 100
183+
renderer_cfg: MultiBackendRendererCfg = MultiBackendRendererCfg()
184+
185+
# Class-local helper (``_`` prefix -> PresetCfg resolver skips it, not a variant).
186+
# 180-degree offset matches the historical Albedo / SimpleShading per-variant
187+
# camera orientations (the dropped *-Camera-Direct-v0 task IDs).
188+
_ROTATED_OFFSET = CameraCfg.OffsetCfg(pos=(-5.0, 0.0, 2.0), rot=(1.0, 0.0, 0.0, 0.0), convention="world")
189+
190+
rgb = CartpoleTiledCameraCfg(data_types=["rgb"])
191+
depth = CartpoleTiledCameraCfg(data_types=["depth"])
192+
semantic_segmentation = CartpoleTiledCameraCfg(data_types=["semantic_segmentation"])
193+
albedo = CartpoleTiledCameraCfg(data_types=["albedo"], offset=_ROTATED_OFFSET)
194+
# simple_shading_* -- cheap renderer-side approximations used for the dropped
195+
# Isaac-Cartpole-SimpleShading-{Constant,Diffuse,Full}-Camera-Direct-v0 tasks.
196+
# Trade visual fidelity (constant < diffuse_mdl < full_mdl) for throughput.
197+
simple_shading_constant_diffuse = CartpoleTiledCameraCfg(
198+
data_types=["simple_shading_constant_diffuse"], offset=_ROTATED_OFFSET
199+
)
200+
simple_shading_diffuse_mdl = CartpoleTiledCameraCfg(
201+
data_types=["simple_shading_diffuse_mdl"], offset=_ROTATED_OFFSET
202+
)
203+
simple_shading_full_mdl = CartpoleTiledCameraCfg(data_types=["simple_shading_full_mdl"], offset=_ROTATED_OFFSET)
204+
default = rgb
205+
206+
207+
@configclass
208+
class CartpoleCameraPresetsEnvCfg(PresetCfg):
209+
@configclass
210+
class BaseCartpoleCameraEnvCfg(DirectRLEnvCfg):
211+
# env
212+
decimation = 2
213+
episode_length_s = 5.0
214+
action_scale = 100.0 # [N]
215+
216+
# simulation
217+
sim: SimulationCfg = SimulationCfg(dt=1 / 120, render_interval=decimation)
218+
219+
# robot
220+
robot_cfg: ArticulationCfg = CARTPOLE_CFG.replace(prim_path="/World/envs/env_.*/Robot")
221+
cart_dof_name = "slider_to_cart"
222+
pole_dof_name = "cart_to_pole"
223+
224+
# camera
225+
tiled_camera: MultiDataTypeCartpoleTiledCameraCfg = MultiDataTypeCartpoleTiledCameraCfg()
226+
write_image_to_file = False
227+
228+
# spaces
229+
action_space = 1
230+
state_space = 0
231+
observation_space = [100, 100, 3]
232+
233+
# change viewer settings
234+
viewer = ViewerCfg(eye=(20.0, 20.0, 20.0))
235+
236+
# scene
237+
scene: InteractiveSceneCfg = InteractiveSceneCfg(num_envs=512, env_spacing=20.0, replicate_physics=True)
238+
239+
# reset
240+
max_cart_pos = 3.0 # the cart is reset if it exceeds that position [m]
241+
initial_pole_angle_range = [-0.125, 0.125] # the range in which the pole angle is sampled from on reset [rad]
242+
243+
# reward scales
244+
rew_scale_alive = 1.0
245+
rew_scale_terminated = -2.0
246+
rew_scale_pole_pos = -1.0
247+
rew_scale_cart_vel = -0.01
248+
rew_scale_pole_vel = -0.005
249+
250+
rgb = BaseCartpoleCameraEnvCfg()
251+
depth = BaseCartpoleCameraEnvCfg(observation_space=[100, 100, 1])
252+
albedo = BaseCartpoleCameraEnvCfg(observation_space=[100, 100, 3])
253+
semantic_segmentation = BaseCartpoleCameraEnvCfg(observation_space=[100, 100, 4])
254+
simple_shading_constant_diffuse = BaseCartpoleCameraEnvCfg(observation_space=[100, 100, 3])
255+
simple_shading_diffuse_mdl = BaseCartpoleCameraEnvCfg(observation_space=[100, 100, 3])
256+
simple_shading_full_mdl = BaseCartpoleCameraEnvCfg(observation_space=[100, 100, 3])
257+
default = rgb

0 commit comments

Comments
 (0)