diff --git a/docs/source/setup/installation/index.rst b/docs/source/setup/installation/index.rst index da82d25b9da..3c9971cab73 100644 --- a/docs/source/setup/installation/index.rst +++ b/docs/source/setup/installation/index.rst @@ -91,8 +91,6 @@ Other notable limitations with respect to Isaac Lab include... #. Multi-node training may require direct connections between Spark machines or additional network configurations. -#. :ref:`Isaac Lab Mimic ` data generation and policy inference for visuomotor environments are not supported on DGX Spark due to a lack of non-DLSS image denoiser on aarch64. - #. :ref:`Running Cosmos Transfer1 ` is not currently supported on the DGX Spark. Troubleshooting diff --git a/scripts/imitation_learning/robomimic/train.py b/scripts/imitation_learning/robomimic/train.py index 718a18bcbca..c97df13260f 100644 --- a/scripts/imitation_learning/robomimic/train.py +++ b/scripts/imitation_learning/robomimic/train.py @@ -59,6 +59,7 @@ # Third-party imports import gymnasium as gym import h5py +import importlib import json import numpy as np import os @@ -369,7 +370,18 @@ def main(args: argparse.Namespace): f" Please check that the gym registry has the entry point: '{cfg_entry_point_key}'." ) - with open(cfg_entry_point_file) as f: + # resolve module path if needed + if ":" in cfg_entry_point_file: + mod_name, file_name = cfg_entry_point_file.split(":") + mod = importlib.import_module(mod_name) + if mod.__file__ is None: + raise ValueError(f"Could not find module file for: '{mod_name}'") + mod_path = os.path.dirname(mod.__file__) + config_file = os.path.join(mod_path, file_name) + else: + config_file = cfg_entry_point_file + + with open(config_file) as f: ext_cfg = json.load(f) config = config_factory(ext_cfg["algo_name"]) # update config with external json - this will throw errors if diff --git a/source/isaaclab/config/extension.toml b/source/isaaclab/config/extension.toml index ae2cfe5f781..9d0173b3702 100644 --- a/source/isaaclab/config/extension.toml +++ b/source/isaaclab/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.47.9" +version = "0.47.10" # Description title = "Isaac Lab framework for Robot Learning" diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 62b6eb92a5d..b0f1719d722 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -1,6 +1,22 @@ Changelog --------- + +0.47.10 (2025-11-06) +~~~~~~~~~~~~~~~~~~~~ + +Added +^^^^^ + +* Added ``num_rerenders_on_reset`` parameter to ManagerBasedEnvCfg and DirectRLEnvCfg to configure the number + of render steps to perform after reset. This enables more control over DLSS rendering behavior after reset. + +Changed +^^^^^^^ + +* Added deprecation warning for ``rerender_on_reset`` parameter in ManagerBasedEnv and DirectRLEnv. + + 0.47.9 (2025-11-05) ~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab/isaaclab/envs/direct_rl_env.py b/source/isaaclab/isaaclab/envs/direct_rl_env.py index e43c4db7a28..a4452b707d7 100644 --- a/source/isaaclab/isaaclab/envs/direct_rl_env.py +++ b/source/isaaclab/isaaclab/envs/direct_rl_env.py @@ -11,6 +11,7 @@ import math import numpy as np import torch +import warnings import weakref from abc import abstractmethod from collections.abc import Sequence @@ -219,6 +220,20 @@ def __init__(self, cfg: DirectRLEnvCfg, render_mode: str | None = None, **kwargs # video matches the simulation self.metadata["render_fps"] = 1 / self.step_dt + # show deprecation message for rerender_on_reset + if self.cfg.rerender_on_reset: + msg = ( + "\033[93m\033[1m[DEPRECATION WARNING] DirectRLEnvCfg.rerender_on_reset is deprecated. Use" + " DirectRLEnvCfg.num_rerenders_on_reset instead.\033[0m" + ) + warnings.warn( + msg, + FutureWarning, + stacklevel=2, + ) + if self.cfg.num_rerenders_on_reset == 0: + self.cfg.num_rerenders_on_reset = 1 + # print the environment information print("[INFO]: Completed setting up the environment...") @@ -300,8 +315,9 @@ def reset(self, seed: int | None = None, options: dict[str, Any] | None = None) self.sim.forward() # if sensors are added to the scene, make sure we render to reflect changes in reset - if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset: - self.sim.render() + if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0: + for _ in range(self.cfg.num_rerenders_on_reset): + self.sim.render() if self.cfg.wait_for_textures and self.sim.has_rtx_sensors(): while SimulationManager.assets_loading(): @@ -377,8 +393,9 @@ def step(self, action: torch.Tensor) -> VecEnvStepReturn: if len(reset_env_ids) > 0: self._reset_idx(reset_env_ids) # if sensors are added to the scene, make sure we render to reflect changes in reset - if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset: - self.sim.render() + if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0: + for _ in range(self.cfg.num_rerenders_on_reset): + self.sim.render() # post-step: step interval event if self.cfg.events: diff --git a/source/isaaclab/isaaclab/envs/direct_rl_env_cfg.py b/source/isaaclab/isaaclab/envs/direct_rl_env_cfg.py index 33297a228af..b378beaa86f 100644 --- a/source/isaaclab/isaaclab/envs/direct_rl_env_cfg.py +++ b/source/isaaclab/isaaclab/envs/direct_rl_env_cfg.py @@ -222,6 +222,22 @@ class DirectRLEnvCfg: to reflect the latest states from the reset. This comes at a cost of performance as an additional render step will be performed after each time an environment is reset. + .. deprecated:: 2.3.1 + This attribute is deprecated and will be removed in the future. Please use + :attr:`num_rerenders_on_reset` instead. + + To get the same behaviour as setting this parameter to ``True`` or ``False``, set + :attr:`num_rerenders_on_reset` to 1 or 0, respectively. + """ + + num_rerenders_on_reset: int = 0 + """Number of render steps to perform after reset. Defaults to 0, which means no render step will be performed after reset. + + * When this is 0, no render step will be performed after reset. Data collected from sensors after performing reset will be stale and will not reflect the + latest states in simulation caused by the reset. + * When this is greater than 0, the specified number of extra render steps will be performed to update the sensor data + to reflect the latest states from the reset. This comes at a cost of performance as additional render + steps will be performed after each time an environment is reset. """ wait_for_textures: bool = True diff --git a/source/isaaclab/isaaclab/envs/manager_based_env.py b/source/isaaclab/isaaclab/envs/manager_based_env.py index 9ddc538aa41..455af1e2c6b 100644 --- a/source/isaaclab/isaaclab/envs/manager_based_env.py +++ b/source/isaaclab/isaaclab/envs/manager_based_env.py @@ -5,6 +5,7 @@ import builtins import torch +import warnings from collections.abc import Sequence from typing import Any @@ -190,6 +191,20 @@ def __init__(self, cfg: ManagerBasedEnvCfg): if self.cfg.export_io_descriptors: self.export_IO_descriptors() + # show deprecation message for rerender_on_reset + if self.cfg.rerender_on_reset: + msg = ( + "\033[93m\033[1m[DEPRECATION WARNING] ManagerBasedEnvCfg.rerender_on_reset is deprecated. Use" + " ManagerBasedEnvCfg.num_rerenders_on_reset instead.\033[0m" + ) + warnings.warn( + msg, + FutureWarning, + stacklevel=2, + ) + if self.cfg.num_rerenders_on_reset == 0: + self.cfg.num_rerenders_on_reset = 1 + def __del__(self): """Cleanup for the environment.""" self.close() @@ -353,8 +368,9 @@ def reset( self.scene.write_data_to_sim() self.sim.forward() # if sensors are added to the scene, make sure we render to reflect changes in reset - if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset: - self.sim.render() + if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0: + for _ in range(self.cfg.num_rerenders_on_reset): + self.sim.render() # trigger recorder terms for post-reset calls self.recorder_manager.record_post_reset(env_ids) @@ -413,8 +429,9 @@ def reset_to( self.sim.forward() # if sensors are added to the scene, make sure we render to reflect changes in reset - if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset: - self.sim.render() + if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0: + for _ in range(self.cfg.num_rerenders_on_reset): + self.sim.render() # trigger recorder terms for post-reset calls self.recorder_manager.record_post_reset(env_ids) diff --git a/source/isaaclab/isaaclab/envs/manager_based_env_cfg.py b/source/isaaclab/isaaclab/envs/manager_based_env_cfg.py index a7200a3d1d2..03353baf34d 100644 --- a/source/isaaclab/isaaclab/envs/manager_based_env_cfg.py +++ b/source/isaaclab/isaaclab/envs/manager_based_env_cfg.py @@ -115,6 +115,22 @@ class ManagerBasedEnvCfg: to reflect the latest states from the reset. This comes at a cost of performance as an additional render step will be performed after each time an environment is reset. + .. deprecated:: 2.3.1 + This attribute is deprecated and will be removed in the future. Please use + :attr:`num_rerenders_on_reset` instead. + + To get the same behaviour as setting this parameter to ``True`` or ``False``, set + :attr:`num_rerenders_on_reset` to 1 or 0, respectively. + """ + + num_rerenders_on_reset: int = 0 + """Number of render steps to perform after reset. Defaults to 0, which means no render step will be performed after reset. + + * When this is 0, no render step will be performed after reset. Data collected from sensors after performing reset will be stale and will not reflect the + latest states in simulation caused by the reset. + * When this is greater than 0, the specified number of extra render steps will be performed to update the sensor data + to reflect the latest states from the reset. This comes at a cost of performance as additional render + steps will be performed after each time an environment is reset. """ wait_for_textures: bool = True diff --git a/source/isaaclab/isaaclab/envs/manager_based_rl_env.py b/source/isaaclab/isaaclab/envs/manager_based_rl_env.py index 634bec4cae9..861072dec0a 100644 --- a/source/isaaclab/isaaclab/envs/manager_based_rl_env.py +++ b/source/isaaclab/isaaclab/envs/manager_based_rl_env.py @@ -222,8 +222,9 @@ def step(self, action: torch.Tensor) -> VecEnvStepReturn: self._reset_idx(reset_env_ids) # if sensors are added to the scene, make sure we render to reflect changes in reset - if self.sim.has_rtx_sensors() and self.cfg.rerender_on_reset: - self.sim.render() + if self.sim.has_rtx_sensors() and self.cfg.num_rerenders_on_reset > 0: + for _ in range(self.cfg.num_rerenders_on_reset): + self.sim.render() # trigger recorder terms for post-reset calls self.recorder_manager.record_post_reset(reset_env_ids) diff --git a/source/isaaclab_tasks/config/extension.toml b/source/isaaclab_tasks/config/extension.toml index 48067e77af3..bc01e841fdb 100644 --- a/source/isaaclab_tasks/config/extension.toml +++ b/source/isaaclab_tasks/config/extension.toml @@ -1,7 +1,7 @@ [package] # Note: Semantic Versioning is used: https://semver.org/ -version = "0.11.7" +version = "0.11.8" # Description title = "Isaac Lab Environments" diff --git a/source/isaaclab_tasks/docs/CHANGELOG.rst b/source/isaaclab_tasks/docs/CHANGELOG.rst index 54b472d70b3..30f8c52d218 100644 --- a/source/isaaclab_tasks/docs/CHANGELOG.rst +++ b/source/isaaclab_tasks/docs/CHANGELOG.rst @@ -1,6 +1,16 @@ Changelog --------- + +0.11.8 (2025-11-06) +~~~~~~~~~~~~~~~~~~~~ + +Changed +^^^^^^^ + +* Changed to use of ``num_rerenders_on_reset`` and ``DLAA`` in visuomotor imitation learning environments. + + 0.11.7 (2025-10-22) ~~~~~~~~~~~~~~~~~~~~ diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/exhaustpipe_gr1t2_base_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/exhaustpipe_gr1t2_base_env_cfg.py index 2d7a69653fa..d5cb566d468 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/exhaustpipe_gr1t2_base_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/exhaustpipe_gr1t2_base_env_cfg.py @@ -323,9 +323,9 @@ def __post_init__(self): self.sim.dt = 1 / 100 self.sim.render_interval = 2 - # # Set settings for camera rendering - self.rerender_on_reset = True - self.sim.render.antialiasing_mode = "OFF" # disable dlss + # Set settings for camera rendering + self.num_rerenders_on_reset = 3 + self.sim.render.antialiasing_mode = "DLAA" # Use DLAA for higher quality rendering # List of image observations in policy observations self.image_obs_list = ["robot_pov_cam"] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/nutpour_gr1t2_base_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/nutpour_gr1t2_base_env_cfg.py index 6aaf5defb38..f6176a305bf 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/nutpour_gr1t2_base_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_place/nutpour_gr1t2_base_env_cfg.py @@ -359,8 +359,8 @@ def __post_init__(self): self.sim.render_interval = 2 # Set settings for camera rendering - self.rerender_on_reset = True - self.sim.render.antialiasing_mode = "OFF" # disable dlss + self.num_rerenders_on_reset = 3 + self.sim.render.antialiasing_mode = "DLAA" # Use DLAA for higher quality rendering # List of image observations in policy observations self.image_obs_list = ["robot_pov_cam"] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/__init__.py index 18496397e04..bacb64d167e 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/__init__.py @@ -54,7 +54,7 @@ entry_point="isaaclab.envs:ManagerBasedRLEnv", kwargs={ "env_cfg_entry_point": f"{__name__}.stack_ik_rel_visuomotor_env_cfg:FrankaCubeStackVisuomotorEnvCfg", - "robomimic_bc_cfg_entry_point": f"{agents.__name__}:robomimic/bc_rnn_image_84.json", + "robomimic_bc_cfg_entry_point": f"{agents.__name__}:robomimic/bc_rnn_image_200.json", }, disable_env_checker=True, ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/agents/robomimic/bc_rnn_image_84.json b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/agents/robomimic/bc_rnn_image_200.json similarity index 98% rename from source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/agents/robomimic/bc_rnn_image_84.json rename to source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/agents/robomimic/bc_rnn_image_200.json index 94e722fd0b1..33117b90e3f 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/agents/robomimic/bc_rnn_image_84.json +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/agents/robomimic/bc_rnn_image_200.json @@ -196,8 +196,8 @@ }, "obs_randomizer_class": "CropRandomizer", "obs_randomizer_kwargs": { - "crop_height": 76, - "crop_width": 76, + "crop_height": 181, + "crop_width": 181, "num_crops": 1, "pos_enc": false } diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_visuomotor_cosmos_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_visuomotor_cosmos_env_cfg.py index e5b181abaef..4bd3f5a783b 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_visuomotor_cosmos_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_visuomotor_cosmos_env_cfg.py @@ -153,8 +153,8 @@ def __post_init__(self): ) # Set settings for camera rendering - self.rerender_on_reset = True - self.sim.render.antialiasing_mode = "OFF" # disable dlss + self.num_rerenders_on_reset = 1 + self.sim.render.antialiasing_mode = "OFF" # List of image observations in policy observations self.image_obs_list = ["table_cam", "wrist_cam"] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_visuomotor_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_visuomotor_env_cfg.py index 7f990c5fd3a..bcebaa93aef 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_visuomotor_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/franka/stack_ik_rel_visuomotor_env_cfg.py @@ -204,8 +204,8 @@ def __post_init__(self): self.scene.wrist_cam = CameraCfg( prim_path="{ENV_REGEX_NS}/Robot/panda_hand/wrist_cam", update_period=0.0, - height=84, - width=84, + height=200, + width=200, data_types=["rgb", "distance_to_image_plane"], spawn=sim_utils.PinholeCameraCfg( focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) @@ -219,8 +219,8 @@ def __post_init__(self): self.scene.table_cam = CameraCfg( prim_path="{ENV_REGEX_NS}/table_cam", update_period=0.0, - height=84, - width=84, + height=200, + width=200, data_types=["rgb", "distance_to_image_plane"], spawn=sim_utils.PinholeCameraCfg( focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 2) @@ -231,8 +231,8 @@ def __post_init__(self): ) # Set settings for camera rendering - self.rerender_on_reset = True - self.sim.render.antialiasing_mode = "OFF" # disable dlss + self.num_rerenders_on_reset = 3 + self.sim.render.antialiasing_mode = "DLAA" # Use DLAA for higher quality rendering # List of image observations in policy observations self.image_obs_list = ["table_cam", "wrist_cam"] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/galbot/stack_rmp_rel_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/galbot/stack_rmp_rel_env_cfg.py index 8eb970dc3e5..1ee49d9db18 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/galbot/stack_rmp_rel_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/config/galbot/stack_rmp_rel_env_cfg.py @@ -271,8 +271,8 @@ def __post_init__(self): ) # Set settings for camera rendering - self.rerender_on_reset = True - self.sim.render.antialiasing_mode = "OFF" # disable dlss + self.num_rerenders_on_reset = 3 + self.sim.render.antialiasing_mode = "DLAA" # Use DLAA for higher quality rendering # List of image observations in policy observations self.image_obs_list = ["ego_cam", "left_wrist_cam", "right_wrist_cam"]