diff --git a/.github/workflows/test-multi-gpu.yaml b/.github/workflows/test-multi-gpu.yaml index e9bee1c4ed2d..598e2104c1d0 100644 --- a/.github/workflows/test-multi-gpu.yaml +++ b/.github/workflows/test-multi-gpu.yaml @@ -47,14 +47,14 @@ jobs: # PhysX + Isaac RTX renderer - physics: physx renderer: isaac-rtx - task: Isaac-Cartpole-Camera-Presets-Direct-v0 + task: Isaac-Cartpole-Camera-Direct-v0 extra_args: "" trainer: skrl # PhysX + Newton Warp renderer (hybrid) - physics: physx renderer: newton-warp - task: Isaac-Cartpole-Camera-Presets-Direct-v0 + task: Isaac-Cartpole-Camera-Direct-v0 extra_args: "env.tiled_camera.renderer_cfg=newton_renderer" trainer: skrl @@ -67,14 +67,14 @@ jobs: # Newton + Newton Warp renderer - physics: newton renderer: newton-warp - task: Isaac-Cartpole-Camera-Presets-Direct-v0 + task: Isaac-Cartpole-Camera-Direct-v0 extra_args: "+sim=newton env.tiled_camera.renderer_cfg=newton_renderer" trainer: skrl # Newton + Isaac RTX renderer (hybrid) - physics: newton renderer: isaac-rtx - task: Isaac-Cartpole-Camera-Presets-Direct-v0 + task: Isaac-Cartpole-Camera-Direct-v0 extra_args: "+sim=newton" trainer: skrl diff --git a/docs/source/features/reproducibility.rst b/docs/source/features/reproducibility.rst index e7df5f2df51a..d8154441b474 100644 --- a/docs/source/features/reproducibility.rst +++ b/docs/source/features/reproducibility.rst @@ -41,7 +41,7 @@ To enable deterministic RTX settings from the app launcher, pass ``--determinist .. code-block:: bash ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py \ - --task Isaac-Cartpole-RGB-v0 --enable_cameras --headless --deterministic + --task Isaac-Cartpole-Camera-v0 --enable_cameras --headless --deterministic For results on our determinacy testing for RL training, please check the GitHub Pull Request `#940`_. diff --git a/docs/source/how-to/optimize_stage_creation.rst b/docs/source/how-to/optimize_stage_creation.rst index 567b635405e0..9a864f25aa4f 100644 --- a/docs/source/how-to/optimize_stage_creation.rst +++ b/docs/source/how-to/optimize_stage_creation.rst @@ -82,22 +82,8 @@ Limitations 1. Isaac-Ant-Direct-v0 2. Isaac-Ant-v0 3. Isaac-Cartpole-Direct-v0 - 4. Isaac-Cartpole-Showcase-Box-Box-Direct-v0 - 5. Isaac-Cartpole-Showcase-Box-Discrete-Direct-v0 - 6. Isaac-Cartpole-Showcase-Box-MultiDiscrete-Direct-v0 - 7. Isaac-Cartpole-Showcase-Dict-Box-Direct-v0 - 8. Isaac-Cartpole-Showcase-Dict-Discrete-Direct-v0 - 9. Isaac-Cartpole-Showcase-Dict-MultiDiscrete-Direct-v0 - 10. Isaac-Cartpole-Showcase-Discrete-Box-Direct-v0 - 11. Isaac-Cartpole-Showcase-Discrete-Discrete-Direct-v0 - 12. Isaac-Cartpole-Showcase-Discrete-MultiDiscrete-Direct-v0 - 13. Isaac-Cartpole-Showcase-MultiDiscrete-Box-Direct-v0 - 14. Isaac-Cartpole-Showcase-MultiDiscrete-Discrete-Direct-v0 - 15. Isaac-Cartpole-Showcase-MultiDiscrete-MultiDiscrete-Direct-v0 - 16. Isaac-Cartpole-Showcase-Tuple-Box-Direct-v0 - 17. Isaac-Cartpole-Showcase-Tuple-Discrete-Direct-v0 - 18. Isaac-Cartpole-Showcase-Tuple-MultiDiscrete-Direct-v0 - 19. Isaac-Cartpole-v0 + 4. Isaac-Cartpole-Showcase-Direct-v0 + 5. Isaac-Cartpole-v0 20. Isaac-Factory-GearMesh-Direct-v0 21. Isaac-Factory-NutThread-Direct-v0 22. Isaac-Factory-PegInsert-Direct-v0 diff --git a/docs/source/overview/core-concepts/sensors/camera.rst b/docs/source/overview/core-concepts/sensors/camera.rst index 29673f2bf465..e99ffefb46af 100644 --- a/docs/source/overview/core-concepts/sensors/camera.rst +++ b/docs/source/overview/core-concepts/sensors/camera.rst @@ -149,13 +149,13 @@ The active preset is selected at launch via the ``presets=`` CLI argument: .. code-block:: bash # Use Newton Warp renderer - python train.py task=Isaac-Cartpole-RGB-Camera-Direct-v0 presets=newton_renderer + python train.py task=Isaac-Cartpole-Camera-Direct-v0 presets=newton_renderer # Use OVRTX renderer - python train.py task=Isaac-Cartpole-RGB-Camera-Direct-v0 presets=ovrtx_renderer + python train.py task=Isaac-Cartpole-Camera-Direct-v0 presets=ovrtx_renderer # Use default (Isaac RTX) - python train.py task=Isaac-Cartpole-RGB-Camera-Direct-v0 + python train.py task=Isaac-Cartpole-Camera-Direct-v0 Accessing camera data @@ -174,7 +174,7 @@ When using the RTX renderer, add ``--enable_cameras`` when launching: .. code-block:: shell python scripts/reinforcement_learning/rl_games/train.py \ - --task=Isaac-Cartpole-RGB-Camera-Direct-v0 --headless --enable_cameras + --task=Isaac-Cartpole-Camera-Direct-v0 --headless --enable_cameras Annotators (RTX only) diff --git a/docs/source/overview/environments.rst b/docs/source/overview/environments.rst index 39536c32883f..e91578533c36 100644 --- a/docs/source/overview/environments.rst +++ b/docs/source/overview/environments.rst @@ -69,9 +69,10 @@ Classic environments that are based on IsaacGymEnvs implementation of MuJoCo-sty | | | | ``segmentation``, | | | | | ``simple_shading_*`` | +------------------+-----------------------------+-------------------------------------------------------------------------+------------------------------+ - | |cartpole| | |cartpole-resnet-link| | Move the cart to keep the pole upwards in the classic cartpole control | ``newton_mjwarp``, ``physx`` | - | | | based off of features extracted from perceptive inputs with pre-trained | | - | | |cartpole-theia-link| | frozen vision encoders. Requires running with ``--enable_cameras``. | | + | |cartpole| | |cartpole-camera-link| | Move the cart to keep the pole upwards in the classic cartpole control | ``newton_mjwarp``, ``physx`` | + | | | from raw RGB/depth observations or features extracted by pre-trained | ``rgb``, ``depth``, | + | | | frozen vision encoders. Select pipeline via ``presets=``. Requires | ``resnet18``, | + | | | running with ``--enable_cameras``. | ``theia_tiny`` | +------------------+-----------------------------+-------------------------------------------------------------------------+------------------------------+ .. |humanoid| image:: ../_static/tasks/classic/humanoid.jpg @@ -81,9 +82,8 @@ Classic environments that are based on IsaacGymEnvs implementation of MuJoCo-sty .. |humanoid-link| replace:: `Isaac-Humanoid-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/humanoid/humanoid_env_cfg.py>`__ .. |ant-link| replace:: `Isaac-Ant-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/ant/ant_env_cfg.py>`__ .. |cartpole-link| replace:: `Isaac-Cartpole-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/cartpole_env_cfg.py>`__ -.. |cartpole-camera-presets| replace:: `Isaac-Cartpole-Camera-Presets-Direct-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_camera_presets_env_cfg.py>`__ -.. |cartpole-resnet-link| replace:: `Isaac-Cartpole-RGB-ResNet18-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py>`__ -.. |cartpole-theia-link| replace:: `Isaac-Cartpole-RGB-TheiaTiny-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py>`__ +.. |cartpole-camera-presets| replace:: `Isaac-Cartpole-Camera-Direct-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/cartpole_camera_presets_env_cfg.py>`__ +.. |cartpole-camera-link| replace:: `Isaac-Cartpole-Camera-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py>`__ .. |humanoid-direct-link| replace:: `Isaac-Humanoid-Direct-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/direct/humanoid/humanoid_env.py>`__ @@ -783,146 +783,31 @@ inferencing, including reading from an already trained checkpoint and disabling - Direct - **rl_games** (PPO), **skrl** (IPPO, PPO, MAPPO) - - * - Isaac-Cartpole-Camera-Showcase-Box-Box-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Showcase-Box-Discrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Showcase-Box-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Showcase-Dict-Box-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Showcase-Dict-Discrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Showcase-Dict-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Showcase-Tuple-Box-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Showcase-Tuple-Discrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Showcase-Tuple-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``) - - - - Direct - - **skrl** (PPO) - - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer`` - * - Isaac-Cartpole-Camera-Presets-Direct-v0 (Requires running with ``--enable_cameras``) + * - Isaac-Cartpole-Camera-Direct-v0 (Requires running with ``--enable_cameras``) - - Direct - **rl_games** (PPO), **skrl** (PPO) - ``newton_mjwarp``, ``physx``, ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer``, ``rgb``, ``depth``, ``albedo``, ``semantic_segmentation``, ``simple_shading_constant_diffuse``, ``simple_shading_diffuse_mdl``, ``simple_shading_full_mdl`` - * - Isaac-Cartpole-Direct-v0 + * - Isaac-Cartpole-Camera-Showcase-Direct-v0 (Requires running with ``--enable_cameras``) - - Direct - - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-RGB-ResNet18-v0 (Requires running with ``--enable_cameras``) - - - - Manager Based - - **rl_games** (PPO) - - ``newton_mjwarp``, ``physx`` - * - Isaac-Cartpole-RGB-TheiaTiny-v0 (Requires running with ``--enable_cameras``) + - **skrl** (PPO) + - ``newton_renderer``, ``ovrtx_renderer``, ``isaacsim_rtx_renderer``, ``box_box``, ``box_discrete``, ``box_multidiscrete``, ``dict_box``, ``dict_discrete``, ``dict_multidiscrete``, ``tuple_box``, ``tuple_discrete``, ``tuple_multidiscrete`` + * - Isaac-Cartpole-Camera-v0 (Requires running with ``--enable_cameras``) - - Manager Based - **rl_games** (PPO) - - ``newton_mjwarp``, ``physx`` - * - Isaac-Cartpole-Showcase-Box-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Box-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Box-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Dict-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Dict-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Dict-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Discrete-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Discrete-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Discrete-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-MultiDiscrete-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-MultiDiscrete-Discrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-MultiDiscrete-MultiDiscrete-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Tuple-Box-Direct-v0 - - - - Direct - - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Tuple-Discrete-Direct-v0 + - ``newton_mjwarp``, ``physx``, ``rgb``, ``depth``, ``resnet18``, ``theia_tiny`` + * - Isaac-Cartpole-Direct-v0 - - Direct - - **skrl** (PPO) + - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO) - ``newton_mjwarp``, ``physx``, ``ovphysx`` - * - Isaac-Cartpole-Showcase-Tuple-MultiDiscrete-Direct-v0 + * - Isaac-Cartpole-Showcase-Direct-v0 - - Direct - **skrl** (PPO) - - ``newton_mjwarp``, ``physx``, ``ovphysx`` + - ``newton_mjwarp``, ``physx``, ``ovphysx``, ``box_box``, ``box_discrete``, ``box_multidiscrete``, ``discrete_box``, ``discrete_discrete``, ``discrete_multidiscrete``, ``multidiscrete_box``, ``multidiscrete_discrete``, ``multidiscrete_multidiscrete``, ``dict_box``, ``dict_discrete``, ``dict_multidiscrete``, ``tuple_box``, ``tuple_discrete``, ``tuple_multidiscrete`` * - Isaac-Cartpole-v0 - - Manager Based diff --git a/docs/source/overview/reinforcement-learning/performance_benchmarks.rst b/docs/source/overview/reinforcement-learning/performance_benchmarks.rst index 61615126ee35..2b2696d33369 100644 --- a/docs/source/overview/reinforcement-learning/performance_benchmarks.rst +++ b/docs/source/overview/reinforcement-learning/performance_benchmarks.rst @@ -24,7 +24,7 @@ Memory Consumption +====================================+================+===================+==========+===========+ | Isaac-Cartpole-Direct-v0 | |cartpole| | 4096 | 3.7 | 3.3 | +------------------------------------+----------------+-------------------+----------+-----------+ -| Isaac-Cartpole-RGB-Camera-Direct-v0| |cartpole-cam| | 1024 | 7.5 | 16.7 | +| Isaac-Cartpole-Camera-Direct-v0 | |cartpole-cam| | 1024 | 7.5 | 16.7 | +------------------------------------+----------------+-------------------+----------+-----------+ | Isaac-Velocity-Rough-G1-v0 | |g1| | 4096 | 6.5 | 6.1 | +------------------------------------+----------------+-------------------+----------+-----------+ @@ -57,7 +57,7 @@ CPU: AMD Ryzen 9 7950X 16-Core Processor +=====================================+===================+==============+===================+====================+ | Isaac-Cartpole-Direct-v0 | 4096 | 1100000 | 910000 | 510000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ -| Isaac-Cartpole-RGB-Camera-Direct-v0 | 1024 | 50000 | 45000 | 32000 | +| Isaac-Cartpole-Camera-Direct-v0 | 1024 | 50000 | 45000 | 32000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ | Isaac-Velocity-Rough-G1-v0 | 4096 | 94000 | 88000 | 82000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ @@ -77,7 +77,7 @@ CPU: Intel(R) Xeon(R) Platinum 8362 CPU @ 2.80GHz +=====================================+===================+==============+===================+====================+ | Isaac-Cartpole-Direct-v0 | 4096 | 620000 | 490000 | 260000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ -| Isaac-Cartpole-RGB-Camera-Direct-v0 | 1024 | 30000 | 28000 | 21000 | +| Isaac-Cartpole-Camera-Direct-v0 | 1024 | 30000 | 28000 | 21000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ | Isaac-Velocity-Rough-G1-v0 | 4096 | 72000 | 64000 | 62000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ @@ -97,7 +97,7 @@ CPU: Intel(R) Xeon(R) Platinum 8362 CPU @ 2.80GHz +=====================================+===================+==============+===================+====================+ | Isaac-Cartpole-Direct-v0 | 4096 | 2700000 | 2100000 | 950000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ -| Isaac-Cartpole-RGB-Camera-Direct-v0 | 1024 | 130000 | 120000 | 90000 | +| Isaac-Cartpole-Camera-Direct-v0 | 1024 | 130000 | 120000 | 90000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ | Isaac-Velocity-Rough-G1-v0 | 4096 | 290000 | 270000 | 250000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ @@ -117,7 +117,7 @@ CPU: Intel(R) Xeon(R) Platinum 8362 CPU @ 2.80GHz +=====================================+===================+==============+===================+====================+ | Isaac-Cartpole-Direct-v0 | 4096 | 10200000 | 8200000 | 3500000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ -| Isaac-Cartpole-RGB-Camera-Direct-v0 | 1024 | 530000 | 490000 | 260000 | +| Isaac-Cartpole-Camera-Direct-v0 | 1024 | 530000 | 490000 | 260000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ | Isaac-Velocity-Rough-G1-v0 | 4096 | 1200000 | 1100000 | 960000 | +-------------------------------------+-------------------+--------------+-------------------+--------------------+ diff --git a/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py b/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py index f43ae7ecaaaa..8d469c97b2a3 100644 --- a/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py +++ b/scripts/reinforcement_learning/ray/hyperparameter_tuning/vision_cartpole_cfg.py @@ -20,35 +20,39 @@ class CartpoleRGBNoTuneJobCfg(vision_cfg.CameraJobCfg): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera-v0"]) super().__init__(cfg, vary_env_count=False, vary_cnn=False, vary_mlp=False) class CartpoleRGBCNNOnlyJobCfg(vision_cfg.CameraJobCfg): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera-v0"]) super().__init__(cfg, vary_env_count=False, vary_cnn=True, vary_mlp=False) class CartpoleRGBJobCfg(vision_cfg.CameraJobCfg): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera-v0"]) super().__init__(cfg, vary_env_count=True, vary_cnn=True, vary_mlp=True) class CartpoleResNetJobCfg(vision_cfg.ResNetCameraJob): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-ResNet18-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera-v0"]) + cfg["runner_args"]["--agent"] = "rl_games_feature_cfg_entry_point" + cfg["hydra_args"]["presets"] = "resnet18" super().__init__(cfg) class CartpoleTheiaJobCfg(vision_cfg.TheiaCameraJob): def __init__(self, cfg: dict = {}): cfg = util.populate_isaac_ray_cfg_args(cfg) - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-TheiaTiny-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera-v0"]) + cfg["runner_args"]["--agent"] = "rl_games_feature_cfg_entry_point" + cfg["hydra_args"]["presets"] = "theia_tiny" super().__init__(cfg) diff --git a/scripts/reinforcement_learning/ray/tuner.py b/scripts/reinforcement_learning/ray/tuner.py index 99dc7e8d08f5..9863ce3c305d 100644 --- a/scripts/reinforcement_learning/ray/tuner.py +++ b/scripts/reinforcement_learning/ray/tuner.py @@ -364,7 +364,7 @@ def __init__(self, cfg: dict): assert "runner_args" in cfg, "No runner arguments specified." """ Task is the desired task to train on. For example: - cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-RGB-TheiaTiny-v0"]) + cfg["runner_args"]["--task"] = tune.choice(["Isaac-Cartpole-Camera-v0"]) """ assert "--task" in cfg["runner_args"], "No task specified." """ diff --git a/source/isaaclab/test/sensors/test_tiled_camera_env.py b/source/isaaclab/test/sensors/test_tiled_camera_env.py index c2d2982d336f..0e15e32c63a3 100644 --- a/source/isaaclab/test/sensors/test_tiled_camera_env.py +++ b/source/isaaclab/test/sensors/test_tiled_camera_env.py @@ -13,7 +13,7 @@ # add argparse arguments parser = argparse.ArgumentParser( description=( - "Test Isaac-Cartpole-RGB-Camera-Direct-v0 environment with different resolutions and number of environments." + "Test Isaac-Cartpole-Camera-Direct-v0 environment with different resolutions and number of environments." ) ) parser.add_argument("--save_images", action="store_true", default=False, help="Save out renders to file.") @@ -105,7 +105,7 @@ def test_tiled_num_envs_edge_cases(): def _launch_tests(tile_widths: range, tile_heights: range, num_envs: int): """Run through different resolutions for tiled rendering""" device = "cuda:0" - task_name = "Isaac-Cartpole-RGB-Camera-Direct-v0" + task_name = "Isaac-Cartpole-Camera-Direct-v0" # iterate over all registered environments for width in tile_widths: for height in tile_heights: @@ -126,7 +126,7 @@ def _launch_tests(tile_widths: range, tile_heights: range, num_envs: int): def _run_environment(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg): """Run environment and capture a rendered image.""" # create environment - env: ManagerBasedRLEnv | DirectRLEnv = gym.make("Isaac-Cartpole-RGB-Camera-Direct-v0", cfg=env_cfg) + env: ManagerBasedRLEnv | DirectRLEnv = gym.make("Isaac-Cartpole-Camera-Direct-v0", cfg=env_cfg) # this flag is necessary to prevent a bug where the simulation gets stuck randomly when running the # test on many environments. env.sim.set_setting("/physics/cooking/ujitsoCollisionCooking", False) diff --git a/source/isaaclab_tasks/changelog.d/jichuanh-cartpole-presets.minor.rst b/source/isaaclab_tasks/changelog.d/jichuanh-cartpole-presets.minor.rst new file mode 100644 index 000000000000..1983a0e0b220 --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/jichuanh-cartpole-presets.minor.rst @@ -0,0 +1,38 @@ +Added +^^^^^ + +* Added four consolidated Cartpole perception tasks that subsume 35 + per-variant task IDs via the typed preset CLI (#5587): + ``Isaac-Cartpole-Camera-Direct-v0``, ``Isaac-Cartpole-Camera-v0``, + ``Isaac-Cartpole-Showcase-Direct-v0``, and + ``Isaac-Cartpole-Camera-Showcase-Direct-v0``. Variant (data type, + observation pipeline, gym-space shape) selected at runtime via + ``presets=``; agent yaml selected via + ``--agent=`` for the manager perception feature + policies and all non-default showcase shapes. +* Added a ``deprecated`` convention for retired gym task registrations: + a ``gym.register`` kwarg with shape + ``{"alias": "--task=NEW [--agent=NAME] presets=NAME"}`` holding the + equivalent migration command. The dict shape is open for future + fields (``reason``, ``removed_in``, ...). :func:`isaaclab_tasks.utils.parse_cfg.load_cfg_from_registry` + reads ``kwargs["deprecated"]["alias"]`` when loading an + ``env_cfg_entry_point`` and emits a :class:`FutureWarning` + naming the new command. + +Deprecated +^^^^^^^^^^ + +* Deprecated 35 per-variant Cartpole task IDs (7 Direct-backend camera, + 4 manager-based camera, 15 proprioceptive showcase, 9 camera-based + showcase) in favor of the four consolidated tasks above. Each retired + ID still loads and emits a :class:`FutureWarning` naming the + consolidated task and the equivalent ``presets=`` (plus + ``--agent=`` where required) invocation. The + ``env_cfg_entry_point`` of each retired ID keeps pointing at the + historical per-variant cfg subclass so retired IDs stay bit-for-bit + identical to their pre-deprecation behavior; only the deprecation + warning is layered on top via the new ``deprecated`` kwarg. The historical subclasses (e.g. ``CartpoleRGBCameraEnvCfg``, + ``CartpoleAlbedoCameraEnvCfg``, ``BoxBoxEnvCfg``, ...) are kept for + one release alongside the consolidated cfgs and will be removed + together with the retired task IDs. Full migration table is in the + PR description. diff --git a/source/isaaclab_tasks/changelog.d/jichuanh-cartpole-remove-deprecated-tasks.minor.rst b/source/isaaclab_tasks/changelog.d/jichuanh-cartpole-remove-deprecated-tasks.minor.rst new file mode 100644 index 000000000000..53fa50a5375b --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/jichuanh-cartpole-remove-deprecated-tasks.minor.rst @@ -0,0 +1,23 @@ +Changed +^^^^^^^ + +* **Breaking:** Removed 35 per-variant Cartpole task IDs (7 Direct camera, + 4 manager-based camera, 15 proprioceptive showcase, 9 camera-based + showcase) and the ``deprecated`` ``gym.register`` kwarg that flagged + them as aliases. Use the consolidated tasks + (``Isaac-Cartpole-Camera-Direct-v0``, ``Isaac-Cartpole-Camera-v0``, + ``Isaac-Cartpole-Showcase-Direct-v0``, + ``Isaac-Cartpole-Camera-Showcase-Direct-v0``) with ``presets=`` + to select the variant: + + * ``Isaac-Cartpole-{RGB,Depth,Albedo,SimpleShading-*}-Camera-Direct-v0`` + and ``Isaac-Cartpole-Camera-Presets-Direct-v0`` → + ``--task=Isaac-Cartpole-Camera-Direct-v0 [presets=]``. + * ``Isaac-Cartpole-{RGB,Depth}-v0`` → + ``--task=Isaac-Cartpole-Camera-v0 [presets=]``. + * ``Isaac-Cartpole-RGB-{ResNet18,TheiaTiny}-v0`` → + ``--task=Isaac-Cartpole-Camera-v0 --agent=rl_games_feature_cfg_entry_point presets=``. + * ``Isaac-Cartpole-Showcase---Direct-v0`` → + ``--task=Isaac-Cartpole-Showcase-Direct-v0 [--agent=skrl___cfg_entry_point] presets=_``. + * ``Isaac-Cartpole-Camera-Showcase---Direct-v0`` → + ``--task=Isaac-Cartpole-Camera-Showcase-Direct-v0 [--agent=skrl___cfg_entry_point] presets=_``. diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/__init__.py index b1b8fdbf35b5..fcd518c138e6 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole/__init__.py @@ -29,73 +29,7 @@ ) gym.register( - id="Isaac-Cartpole-RGB-Camera-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleRGBCameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Albedo-Camera-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleAlbedoCameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-SimpleShading-Constant-Camera-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleSimpleShadingConstantCameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-SimpleShading-Diffuse-Camera-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleSimpleShadingDiffuseCameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-SimpleShading-Full-Camera-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleSimpleShadingFullCameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Depth-Camera-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleDepthCameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_camera_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Camera-Presets-Direct-v0", + id="Isaac-Cartpole-Camera-Direct-v0", entry_point=f"{__name__}.cartpole_camera_presets_env:CartpoleCameraPresetsEnv", disable_env_checker=True, kwargs={ diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole/__init__.py index 576ccc822edf..1f16a18a83fa 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole/__init__.py @@ -15,172 +15,33 @@ # Register Gym environments ########################### -### -# Observation space as Box -### - +# Canonical proprioceptive showcase task -- selects the (observation, action) +# space combination via the preset CLI (#5587). The default skrl yaml matches +# the canonical ``box_box`` shape; for other variants pass the matching +# ``--agent skrl___cfg_entry_point``. gym.register( - id="Isaac-Cartpole-Showcase-Box-Box-Direct-v0", + id="Isaac-Cartpole-Showcase-Direct-v0", entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", disable_env_checker=True, kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:BoxBoxEnvCfg", + "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:CartpoleShowcasePresetsEnvCfg", "skrl_cfg_entry_point": f"{agents.__name__}:skrl_box_box_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-Box-Discrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:BoxDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_box_discrete_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-Box-MultiDiscrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:BoxMultiDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_box_multidiscrete_ppo_cfg.yaml", - }, -) - -### -# Observation space as Discrete -### - -gym.register( - id="Isaac-Cartpole-Showcase-Discrete-Box-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:DiscreteBoxEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_discrete_box_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-Discrete-Discrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:DiscreteDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_discrete_discrete_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-Discrete-MultiDiscrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:DiscreteMultiDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_discrete_multidiscrete_ppo_cfg.yaml", - }, -) - -### -# Observation space as MultiDiscrete -### - -gym.register( - id="Isaac-Cartpole-Showcase-MultiDiscrete-Box-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:MultiDiscreteBoxEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_multidiscrete_box_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-MultiDiscrete-Discrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:MultiDiscreteDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_multidiscrete_discrete_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-MultiDiscrete-MultiDiscrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:MultiDiscreteMultiDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_multidiscrete_multidiscrete_ppo_cfg.yaml", - }, -) - -### -# Observation space as Dict -### - -gym.register( - id="Isaac-Cartpole-Showcase-Dict-Box-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:DictBoxEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_dict_box_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-Dict-Discrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:DictDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_dict_discrete_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-Dict-MultiDiscrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:DictMultiDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_dict_multidiscrete_ppo_cfg.yaml", - }, -) - -### -# Observation space as Tuple -### - -gym.register( - id="Isaac-Cartpole-Showcase-Tuple-Box-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:TupleBoxEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_tuple_box_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-Tuple-Discrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:TupleDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_tuple_discrete_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Showcase-Tuple-MultiDiscrete-Direct-v0", - entry_point=f"{__name__}.cartpole_env:CartpoleShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_env_cfg:TupleMultiDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_tuple_multidiscrete_ppo_cfg.yaml", + "skrl_box_box_cfg_entry_point": f"{agents.__name__}:skrl_box_box_ppo_cfg.yaml", + "skrl_box_discrete_cfg_entry_point": f"{agents.__name__}:skrl_box_discrete_ppo_cfg.yaml", + "skrl_box_multidiscrete_cfg_entry_point": f"{agents.__name__}:skrl_box_multidiscrete_ppo_cfg.yaml", + "skrl_discrete_box_cfg_entry_point": f"{agents.__name__}:skrl_discrete_box_ppo_cfg.yaml", + "skrl_discrete_discrete_cfg_entry_point": f"{agents.__name__}:skrl_discrete_discrete_ppo_cfg.yaml", + "skrl_discrete_multidiscrete_cfg_entry_point": f"{agents.__name__}:skrl_discrete_multidiscrete_ppo_cfg.yaml", + "skrl_multidiscrete_box_cfg_entry_point": f"{agents.__name__}:skrl_multidiscrete_box_ppo_cfg.yaml", + "skrl_multidiscrete_discrete_cfg_entry_point": f"{agents.__name__}:skrl_multidiscrete_discrete_ppo_cfg.yaml", + "skrl_multidiscrete_multidiscrete_cfg_entry_point": ( + f"{agents.__name__}:skrl_multidiscrete_multidiscrete_ppo_cfg.yaml" + ), + "skrl_dict_box_cfg_entry_point": f"{agents.__name__}:skrl_dict_box_ppo_cfg.yaml", + "skrl_dict_discrete_cfg_entry_point": f"{agents.__name__}:skrl_dict_discrete_ppo_cfg.yaml", + "skrl_dict_multidiscrete_cfg_entry_point": f"{agents.__name__}:skrl_dict_multidiscrete_ppo_cfg.yaml", + "skrl_tuple_box_cfg_entry_point": f"{agents.__name__}:skrl_tuple_box_ppo_cfg.yaml", + "skrl_tuple_discrete_cfg_entry_point": f"{agents.__name__}:skrl_tuple_discrete_ppo_cfg.yaml", + "skrl_tuple_multidiscrete_cfg_entry_point": f"{agents.__name__}:skrl_tuple_multidiscrete_ppo_cfg.yaml", }, ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole/cartpole_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole/cartpole_env_cfg.py index 2ff10fa8f8ab..76fb2e77c995 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole/cartpole_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole/cartpole_env_cfg.py @@ -10,6 +10,7 @@ from isaaclab.utils.configclass import configclass from isaaclab_tasks.direct.cartpole.cartpole_env_cfg import CartpoleEnvCfg +from isaaclab_tasks.utils import PresetCfg ### # Observation space as Box @@ -605,3 +606,36 @@ class TupleMultiDiscreteEnvCfg(CartpoleEnvCfg): ) ) # or for simplicity: (2, 2) action_space = spaces.MultiDiscrete([3, 2]) # or for simplicity: [{3}, {2}] + + +## +# Consolidated PresetCfg +## + + +@configclass +class CartpoleShowcasePresetsEnvCfg(PresetCfg): + """Proprioceptive cartpole showcase with selectable observation/action space. + + Each variant attribute is an instance of an existing per-shape cfg class + declared above. The hydra resolver picks one based on the + ``presets=`` CLI token; the default is ``box_box`` (matching the + canonical cartpole shape). + """ + + box_box = BoxBoxEnvCfg() + box_discrete = BoxDiscreteEnvCfg() + box_multidiscrete = BoxMultiDiscreteEnvCfg() + discrete_box = DiscreteBoxEnvCfg() + discrete_discrete = DiscreteDiscreteEnvCfg() + discrete_multidiscrete = DiscreteMultiDiscreteEnvCfg() + multidiscrete_box = MultiDiscreteBoxEnvCfg() + multidiscrete_discrete = MultiDiscreteDiscreteEnvCfg() + multidiscrete_multidiscrete = MultiDiscreteMultiDiscreteEnvCfg() + dict_box = DictBoxEnvCfg() + dict_discrete = DictDiscreteEnvCfg() + dict_multidiscrete = DictMultiDiscreteEnvCfg() + tuple_box = TupleBoxEnvCfg() + tuple_discrete = TupleDiscreteEnvCfg() + tuple_multidiscrete = TupleMultiDiscreteEnvCfg() + default = box_box # canonical Cartpole shape: Box obs, Box action. diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole_camera/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole_camera/__init__.py index 2953ce1a29c0..f408383636ee 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole_camera/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole_camera/__init__.py @@ -15,104 +15,27 @@ # Register Gym environments ########################### -### -# Observation space as Box -### - +# Canonical camera-based showcase task -- selects the (observation, action) +# space combination via the preset CLI (#5587). The default skrl yaml matches +# the canonical ``box_box`` shape; for other variants pass the matching +# ``--agent skrl___cfg_entry_point``. gym.register( - id="Isaac-Cartpole-Camera-Showcase-Box-Box-Direct-v0", + id="Isaac-Cartpole-Camera-Showcase-Direct-v0", entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", disable_env_checker=True, kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:BoxBoxEnvCfg", + "env_cfg_entry_point": ( + f"{__name__}.cartpole_camera_env_cfg:CartpoleCameraShowcasePresetsEnvCfg" + ), "skrl_cfg_entry_point": f"{agents.__name__}:skrl_box_box_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Camera-Showcase-Box-Discrete-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:BoxDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_box_discrete_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Camera-Showcase-Box-MultiDiscrete-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:BoxMultiDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_box_multidiscrete_ppo_cfg.yaml", - }, -) - -### -# Observation space as Dict -### - -gym.register( - id="Isaac-Cartpole-Camera-Showcase-Dict-Box-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:DictBoxEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_dict_box_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Camera-Showcase-Dict-Discrete-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:DictDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_dict_discrete_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Camera-Showcase-Dict-MultiDiscrete-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:DictMultiDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_dict_multidiscrete_ppo_cfg.yaml", - }, -) - -### -# Observation space as Tuple -### - -gym.register( - id="Isaac-Cartpole-Camera-Showcase-Tuple-Box-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:TupleBoxEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_tuple_box_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Camera-Showcase-Tuple-Discrete-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:TupleDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_tuple_discrete_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Camera-Showcase-Tuple-MultiDiscrete-Direct-v0", - entry_point=f"{__name__}.cartpole_camera_env:CartpoleCameraShowcaseEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:TupleMultiDiscreteEnvCfg", - "skrl_cfg_entry_point": f"{agents.__name__}:skrl_tuple_multidiscrete_ppo_cfg.yaml", + "skrl_box_box_cfg_entry_point": f"{agents.__name__}:skrl_box_box_ppo_cfg.yaml", + "skrl_box_discrete_cfg_entry_point": f"{agents.__name__}:skrl_box_discrete_ppo_cfg.yaml", + "skrl_box_multidiscrete_cfg_entry_point": f"{agents.__name__}:skrl_box_multidiscrete_ppo_cfg.yaml", + "skrl_dict_box_cfg_entry_point": f"{agents.__name__}:skrl_dict_box_ppo_cfg.yaml", + "skrl_dict_discrete_cfg_entry_point": f"{agents.__name__}:skrl_dict_discrete_ppo_cfg.yaml", + "skrl_dict_multidiscrete_cfg_entry_point": f"{agents.__name__}:skrl_dict_multidiscrete_ppo_cfg.yaml", + "skrl_tuple_box_cfg_entry_point": f"{agents.__name__}:skrl_tuple_box_ppo_cfg.yaml", + "skrl_tuple_discrete_cfg_entry_point": f"{agents.__name__}:skrl_tuple_discrete_ppo_cfg.yaml", + "skrl_tuple_multidiscrete_cfg_entry_point": f"{agents.__name__}:skrl_tuple_multidiscrete_ppo_cfg.yaml", }, ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole_camera/cartpole_camera_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole_camera/cartpole_camera_env_cfg.py index d3e78a6bd4b7..095072bfeb03 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole_camera/cartpole_camera_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/direct/cartpole_showcase/cartpole_camera/cartpole_camera_env_cfg.py @@ -12,6 +12,7 @@ from isaaclab.utils.configclass import configclass from isaaclab_tasks.direct.cartpole.cartpole_camera_env_cfg import CartpoleRGBCameraEnvCfg as CartpoleCameraEnvCfg +from isaaclab_tasks.utils import PresetCfg def get_tiled_camera_cfg(data_type: str, width: int = 100, height: int = 100) -> CameraCfg: @@ -373,3 +374,29 @@ class TupleMultiDiscreteEnvCfg(CartpoleCameraEnvCfg): ) ) # or for simplicity: ([height, width, 3], 2) action_space = spaces.MultiDiscrete([3, 2]) # or for simplicity: [{3}, {2}] + + +## +# Consolidated PresetCfg +## + + +@configclass +class CartpoleCameraShowcasePresetsEnvCfg(PresetCfg): + """Camera-based cartpole showcase with selectable observation container and action space. + + Each variant attribute is an instance of an existing per-shape cfg class + declared above. The hydra resolver picks one based on ``presets=``; + the default is ``box_box`` (matching the canonical cartpole camera shape). + """ + + box_box = BoxBoxEnvCfg() + box_discrete = BoxDiscreteEnvCfg() + box_multidiscrete = BoxMultiDiscreteEnvCfg() + dict_box = DictBoxEnvCfg() + dict_discrete = DictDiscreteEnvCfg() + dict_multidiscrete = DictMultiDiscreteEnvCfg() + tuple_box = TupleBoxEnvCfg() + tuple_discrete = TupleDiscreteEnvCfg() + tuple_multidiscrete = TupleMultiDiscreteEnvCfg() + default = box_box # canonical Cartpole Camera shape: Box obs, Box action. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/__init__.py index 68eef31a0cc8..8c67ece547ff 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/__init__.py @@ -29,42 +29,18 @@ }, ) +# Canonical perception task -- selects observation pipeline (raw RGB, raw depth, +# ResNet18 features, Theia-Tiny features) via the preset CLI (#5587). Two +# rl_games agent entry points cover the image-policy and feature-policy yamls; +# pick via ``--agent rl_games_cfg_entry_point`` (image, default) or +# ``--agent rl_games_feature_cfg_entry_point`` (pretrained-feature). gym.register( - id="Isaac-Cartpole-RGB-v0", + id="Isaac-Cartpole-Camera-v0", entry_point="isaaclab.envs:ManagerBasedRLEnv", disable_env_checker=True, kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleRGBCameraEnvCfg", + "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleCameraPresetsEnvCfg", "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-Depth-v0", - entry_point="isaaclab.envs:ManagerBasedRLEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleDepthCameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_camera_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-RGB-ResNet18-v0", - entry_point="isaaclab.envs:ManagerBasedRLEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleResNet18CameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_feature_ppo_cfg.yaml", - }, -) - -gym.register( - id="Isaac-Cartpole-RGB-TheiaTiny-v0", - entry_point="isaaclab.envs:ManagerBasedRLEnv", - disable_env_checker=True, - kwargs={ - "env_cfg_entry_point": f"{__name__}.cartpole_camera_env_cfg:CartpoleTheiaTinyCameraEnvCfg", - "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_feature_ppo_cfg.yaml", + "rl_games_feature_cfg_entry_point": f"{agents.__name__}:rl_games_feature_ppo_cfg.yaml", }, ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py index 0452ca3d5996..02915002dd5c 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/classic/cartpole/cartpole_camera_env_cfg.py @@ -11,6 +11,7 @@ from isaaclab.utils.configclass import configclass import isaaclab_tasks.manager_based.classic.cartpole.mdp as mdp +from isaaclab_tasks.utils import PresetCfg from .cartpole_env_cfg import CartpoleEnvCfg, CartpoleSceneCfg @@ -174,3 +175,34 @@ class CartpoleTheiaTinyCameraEnvCfg(CartpoleRGBCameraEnvCfg): """Configuration for the cartpole environment with Theia-Tiny features as observations.""" observations: TheiaTinyObservationCfg = TheiaTinyObservationCfg() + + +## +# Consolidated env configuration (canonical -- used by Isaac-Cartpole-Camera-v0) +## + + +@configclass +class CartpoleCameraPresetsEnvCfg(PresetCfg): + """Manager-based cartpole perception with selectable observation pipeline. + + Variants selected via ``presets=``: + + * ``rgb`` / ``default`` -- raw RGB camera observations. + * ``depth`` -- depth (distance-to-camera) observations. + * ``resnet18`` -- features extracted by a frozen ResNet18 backbone from + the RGB camera. + * ``theia_tiny`` -- features extracted by a frozen Theia-Tiny transformer + backbone from the RGB camera. + + Each variant is one of the existing per-pipeline subclasses above. The + framework resolver pins the selected variant at ``gym.make`` time when + the user passes ``presets=``. Used by the canonical + :obj:`Isaac-Cartpole-Camera-v0` task. + """ + + rgb: CartpoleRGBCameraEnvCfg = CartpoleRGBCameraEnvCfg() + depth: CartpoleDepthCameraEnvCfg = CartpoleDepthCameraEnvCfg() + resnet18: CartpoleResNet18CameraEnvCfg = CartpoleResNet18CameraEnvCfg() + theia_tiny: CartpoleTheiaTinyCameraEnvCfg = CartpoleTheiaTinyCameraEnvCfg() + default = rgb diff --git a/source/isaaclab_tasks/test/benchmarking/configs.yaml b/source/isaaclab_tasks/test/benchmarking/configs.yaml index 7a7a0aa49945..feba32a63517 100644 --- a/source/isaaclab_tasks/test/benchmarking/configs.yaml +++ b/source/isaaclab_tasks/test/benchmarking/configs.yaml @@ -33,7 +33,7 @@ fast: episode_length: 900 upper_thresholds: duration: 1200 #750 - skrl:Isaac-Cartpole-RGB-Camera-Direct-v0: + skrl:Isaac-Cartpole-Camera-Direct-v0: max_iterations: 50 lower_thresholds: reward: 190 @@ -144,42 +144,14 @@ full: upper_thresholds: duration: 1500 # Vision-based cartpole tasks - Isaac-Cartpole-Depth-Camera-Direct-v0: + Isaac-Cartpole-Camera-Direct-v0: max_iterations: 300 lower_thresholds: reward: 200 episode_length: 150 upper_thresholds: duration: 3000 - Isaac-Cartpole-Depth-v0: - max_iterations: 300 - lower_thresholds: - reward: 1 - episode_length: 150 - upper_thresholds: - duration: 3000 - Isaac-Cartpole-RGB-Camera-Direct-v0: - max_iterations: 300 - lower_thresholds: - reward: 200 - episode_length: 150 - upper_thresholds: - duration: 3000 - Isaac-Cartpole-RGB-ResNet18-v0: - max_iterations: 300 - lower_thresholds: - reward: 1 - episode_length: 100 - upper_thresholds: - duration: 4000 - Isaac-Cartpole-RGB-TheiaTiny-v0: - max_iterations: 300 - lower_thresholds: - reward: 1 - episode_length: 150 - upper_thresholds: - duration: 4000 - Isaac-Cartpole-RGB-v0: + Isaac-Cartpole-Camera-v0: max_iterations: 300 lower_thresholds: reward: -2 diff --git a/source/isaaclab_tasks/test/test_preset_kit_decision.py b/source/isaaclab_tasks/test/test_preset_kit_decision.py index 62c51caaa73d..6967655bb9b9 100644 --- a/source/isaaclab_tasks/test/test_preset_kit_decision.py +++ b/source/isaaclab_tasks/test/test_preset_kit_decision.py @@ -15,7 +15,7 @@ import isaaclab_tasks # noqa: F401 from isaaclab_tasks.utils import compute_kit_requirements, resolve_task_config -_CAMERA_PRESETS_TASK = "Isaac-Cartpole-Camera-Presets-Direct-v0" +_CAMERA_PRESETS_TASK = "Isaac-Cartpole-Camera-Direct-v0" def _resolve_with_presets(presets: str): diff --git a/source/isaaclab_tasks/test/test_rendering_registered_tasks.py b/source/isaaclab_tasks/test/test_rendering_registered_tasks.py index 94eb6e07232a..6bf5572fc2f1 100644 --- a/source/isaaclab_tasks/test/test_rendering_registered_tasks.py +++ b/source/isaaclab_tasks/test/test_rendering_registered_tasks.py @@ -63,16 +63,19 @@ def _collect_camera_outputs(env: object) -> dict[str, dict[str, torch.Tensor]]: # Task IDs that expose camera/tiled_camera image observations; each is validated for non-blank rendering. # The max different pixels percentage is set based on the screen space taken up by the env. +# The ``presets`` column selects a data-type variant on the consolidated cartpole camera task; +# ``None`` uses the default. _RENDER_CORRECTNESS_TASK_IDS = [ - ("Isaac-Cartpole-Albedo-Camera-Direct-v0", "cartpole"), - ("Isaac-Cartpole-Camera-Presets-Direct-v0", "cartpole"), - ("Isaac-Cartpole-Depth-Camera-Direct-v0", "cartpole"), - ("Isaac-Cartpole-RGB-Camera-Direct-v0", "cartpole"), - ("Isaac-Cartpole-SimpleShading-Constant-Camera-Direct-v0", "cartpole"), - ("Isaac-Cartpole-SimpleShading-Diffuse-Camera-Direct-v0", "cartpole"), - ("Isaac-Cartpole-SimpleShading-Full-Camera-Direct-v0", "cartpole"), + ("Isaac-Cartpole-Camera-Direct-v0", None, "cartpole"), + ("Isaac-Cartpole-Camera-Direct-v0", "albedo", "cartpole"), + ("Isaac-Cartpole-Camera-Direct-v0", "depth", "cartpole"), + ("Isaac-Cartpole-Camera-Direct-v0", "rgb", "cartpole"), + ("Isaac-Cartpole-Camera-Direct-v0", "simple_shading_constant_diffuse", "cartpole"), + ("Isaac-Cartpole-Camera-Direct-v0", "simple_shading_diffuse_mdl", "cartpole"), + ("Isaac-Cartpole-Camera-Direct-v0", "simple_shading_full_mdl", "cartpole"), pytest.param( "Isaac-Repose-Cube-Shadow-Vision-Direct-v0", + None, "shadow_hand", # The Shadow-Vision render is right at the SSIM/diff-pixel tolerance and intermittently # exceeds the 3% diff threshold by a fraction of a percent. Allow up to 3 attempts and @@ -82,15 +85,19 @@ def _collect_camera_outputs(env: object) -> dict[str, dict[str, torch.Tensor]]: ] -@pytest.mark.parametrize("task_id, env_name", _RENDER_CORRECTNESS_TASK_IDS) -def test_rendering_registered_tasks(task_id: str, env_name: str): +@pytest.mark.parametrize("task_id, presets, env_name", _RENDER_CORRECTNESS_TASK_IDS) +def test_rendering_registered_tasks(task_id: str, presets: str | None, env_name: str): """Test registered tasks rendering correctness.""" env = None try: - from isaaclab_tasks.utils.parse_cfg import parse_env_cfg + from isaaclab_tasks.utils.hydra import resolve_presets + from isaaclab_tasks.utils.parse_cfg import load_cfg_from_registry - env_cfg = parse_env_cfg(task_id, num_envs=4) + env_cfg = load_cfg_from_registry(task_id, "env_cfg_entry_point") + env_cfg = resolve_presets(env_cfg, {presets} if presets else frozenset()) + env_cfg.sim.device = "cuda:0" + env_cfg.scene.num_envs = 4 env = gym.make(task_id, cfg=env_cfg) unwrapped: Any = env.unwrapped diff --git a/source/isaaclab_tasks/test/test_train_scripts_deterministic.py b/source/isaaclab_tasks/test/test_train_scripts_deterministic.py index 65744aa08730..9f40c6961c83 100644 --- a/source/isaaclab_tasks/test/test_train_scripts_deterministic.py +++ b/source/isaaclab_tasks/test/test_train_scripts_deterministic.py @@ -196,7 +196,7 @@ def test_rl_games_deterministic_flag_affects_rewards_reproducibility(): train_script = "scripts/reinforcement_learning/rl_games/train.py" log_subdir = "rl_games" preferred_reward_tags = ["rewards/iter"] - task_name = "Isaac-Cartpole-RGB-v0" + task_name = "Isaac-Cartpole-Camera-v0" rewards_non_det_1 = _run_train_once( train_script=train_script, diff --git a/source/isaaclab_visualizers/test/test_visualizer_cartpole_integration.py b/source/isaaclab_visualizers/test/test_visualizer_cartpole_integration.py index 79bad6ea1459..e8a515cabe61 100644 --- a/source/isaaclab_visualizers/test/test_visualizer_cartpole_integration.py +++ b/source/isaaclab_visualizers/test/test_visualizer_cartpole_integration.py @@ -469,7 +469,7 @@ def _make_cartpole_camera_env(visualizer_kind: str, backend_kind: str) -> Cartpo marks=pytest.mark.skip( reason=( "TODO: Kit visualizer + Newton physics + Isaac RTX tiled camera can hit CUDA illegal access " - "or bad GPU state. Repro: rl_games train Isaac-Cartpole-Camera-Presets-Direct-v0 " + "or bad GPU state. Repro: rl_games train Isaac-Cartpole-Camera-Direct-v0 " "--enable_cameras presets=newton_mjwarp --viz kit. Re-enable when fixed." ) ),