From bdaca6a1754c793c811b191c819f7c91bbc47100 Mon Sep 17 00:00:00 2001 From: Mingxue Gu Date: Mon, 23 Mar 2026 03:48:40 +0000 Subject: [PATCH 1/7] Add assemble_trocar task for G129-Dex3 and fix reset rendering warmup in rlinf extension Made-with: Cursor --- .../isaaclab_contrib/rl/rlinf/extension.py | 27 +- .../manipulation/assemble_trocar/__init__.py | 44 ++ .../assemble_trocar/config/__init__.py | 24 + .../assemble_trocar/config/camera_config.py | 146 ++++ .../assemble_trocar/config/gr00t_config.py | 148 ++++ .../isaaclab_ppo_gr00t_assemble_trocar.yaml | 298 +++++++ .../assemble_trocar/config/robot_config.py | 323 ++++++++ .../assemble_trocar/g129_dex3_env_cfg.py | 444 +++++++++++ .../assemble_trocar/mdp/__init__.py | 51 ++ .../assemble_trocar/mdp/events.py | 274 +++++++ .../assemble_trocar/mdp/observations.py | 173 ++++ .../assemble_trocar/mdp/rewards.py | 736 ++++++++++++++++++ .../assemble_trocar/mdp/terminations.py | 94 +++ 13 files changed, 2781 insertions(+), 1 deletion(-) create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/gr00t_config.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/isaaclab_ppo_gr00t_assemble_trocar.yaml create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py create mode 100644 source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py diff --git a/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py b/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py index 89368c532109..83c05fe1b3e3 100644 --- a/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py +++ b/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py @@ -468,6 +468,32 @@ def make_env_isaaclab() -> tuple: isaac_env_cfg.scene.num_envs = self.cfg.init_params.num_envs env = gym.make(self.isaaclab_env_id, cfg=isaac_env_cfg, render_mode="rgb_array").unwrapped + + _original_reset = env.reset + _n_warmup = max(getattr(env.cfg, "num_rerenders_on_reset", 0), 1) + + def _patched_reset(*args, **kwargs): + obs, extras = _original_reset(*args, **kwargs) + try: + import isaaclab_physx.renderers.isaac_rtx_renderer_utils as _rtx_utils + + import omni.kit.app + + _app = omni.kit.app.get_app() + for _ in range(_n_warmup): + _rtx_utils._last_render_update_key = (0, -1) + env.sim.set_setting("/app/player/playSimulations", False) + _app.update() + env.sim.set_setting("/app/player/playSimulations", True) + env.scene.update(dt=0) + except ImportError: + pass + obs = env.observation_manager.compute(update_history=True) + env.obs_buf = obs + return obs, extras + + env.reset = _patched_reset + return env, sim_app return make_env_isaaclab @@ -481,7 +507,6 @@ def _wrap_obs(self, obs: dict) -> dict: - ``"extra_view_images"``: ``(B, N, H, W, C)`` — stacked extra cameras. - ``"states"``: ``(B, D)`` — concatenated state vector. - ``"task_descriptions"``: ``list[str]`` — task descriptions. - Config is read from the YAML file via :func:`_get_isaaclab_cfg`. Args: diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py new file mode 100644 index 000000000000..7fb2ef2f7fe6 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py @@ -0,0 +1,44 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# Copyright (c) 2022-2026, The Isaac Lab Project Developers. +# All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +"""Configuration for Install Trocar task with G129 + Dex3 robot. + +This module registers the Install Trocar task in IsaacLab's gymnasium registry, +allowing it to be discovered and used through IsaacLab's standard task interfaces. + +The environment configuration is imported from RLinf's task definitions to avoid +code duplication while enabling IsaacLab-native task discovery. +""" + +import gymnasium as gym + +from . import g129_dex3_env_cfg + +## +# Register Gym environments. +## + + +gym.register( + id="Isaac-Assemble-Trocar-G129-Dex3-RLinf-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": g129_dex3_env_cfg.G1AssembleTrocarEnvCfg, + }, + disable_env_checker=True, +) + +gym.register( + id="Isaac-Assemble-Trocar-G129-Dex3-RLinf-Eval-v0", + entry_point="isaaclab.envs:ManagerBasedRLEnv", + kwargs={ + "env_cfg_entry_point": g129_dex3_env_cfg.G1AssembleTrocarEvalEnvCfg, + }, + disable_env_checker=True, +) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py new file mode 100644 index 000000000000..4b621d481954 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py @@ -0,0 +1,24 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .camera_config import CameraBaseCfg, CameraPresets +from .robot_config import G1RobotPresets + +__all__ = ["G1RobotPresets", "CameraBaseCfg", "CameraPresets"] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py new file mode 100644 index 000000000000..4e1b78a85736 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py @@ -0,0 +1,146 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +public camera configuration +include the basic configuration for different types of cameras, support scene-specific parameter customization +""" + +from collections.abc import Sequence + +import isaaclab.sim as sim_utils +from isaaclab.sensors import CameraCfg, TiledCameraCfg +from isaaclab.utils import configclass + + +@configclass +class CameraBaseCfg: + """camera base configuration class + + provide the default configuration for different types of cameras, support scene-specific parameter customization + """ + + @classmethod + def get_camera_config( + cls, + prim_path: str = "/World/envs/env_.*/Robot/d435_link/front_cam", + update_period: float = 0.02, + height: int = 480, + width: int = 640, + focal_length: float = 7.6, + focus_distance: float = 400.0, + horizontal_aperture: float = 20.0, + clipping_range: tuple[float, float] = (0.1, 1.0e5), + pos_offset: tuple[float, float, float] = (0.0, 0.0, 0.0), + rot_offset: tuple[float, float, float, float] = (0.5, -0.5, 0.5, -0.5), + data_types: Sequence[str] | None = None, + ) -> CameraCfg: + """Get a pinhole camera configuration. + + Args: + prim_path: the path of the camera in the scene + update_period: update period (seconds) + height: image height (pixels) + width: image width (pixels) + focal_length: focal length + focus_distance: focus distance + horizontal_aperture: horizontal aperture + clipping_range: clipping range (near clipping plane, far clipping plane) + pos_offset: position offset (x, y, z) + rot_offset: rotation offset quaternion + data_types: data type list + + Returns: + CameraCfg: camera configuration + """ + if data_types is None: + data_types = ("rgb",) + + return TiledCameraCfg( + prim_path=prim_path, + update_period=update_period, + height=height, + width=width, + data_types=list(data_types), + spawn=sim_utils.PinholeCameraCfg( + focal_length=focal_length, + focus_distance=focus_distance, + horizontal_aperture=horizontal_aperture, + clipping_range=clipping_range, + ), + offset=TiledCameraCfg.OffsetCfg(pos=pos_offset, rot=rot_offset, convention="ros"), + ) + + +@configclass +class CameraPresets: + """camera preset configuration collection + + include the common camera configuration preset for different scenes + """ + + @classmethod + def g1_front_camera(cls, **overrides) -> CameraCfg: + params = { + "height": 224, + "width": 224, + "focal_length": 10.5, + "horizontal_aperture": 14.25, # Match original vertical FOV after crop + } + params.update(overrides) + return CameraBaseCfg.get_camera_config(**params) + + @classmethod + def left_dex3_wrist_camera(cls, **overrides) -> CameraCfg: + """left wrist camera configuration""" + params = { + "prim_path": "/World/envs/env_.*/Robot/left_hand_camera_base_link/left_wrist_camera", + "height": 224, + "width": 224, + "update_period": 0.02, + "data_types": ["rgb"], + "focal_length": 12.0, + "focus_distance": 400.0, + "horizontal_aperture": 14.25, # Match original vertical FOV after crop + "clipping_range": (0.1, 1.0e5), + "pos_offset": (-0.04012, -0.07441, 0.15711), + "rot_offset": (0.00539, 0.86024, 0.0424, 0.50809), + } + params.update(overrides) + return CameraBaseCfg.get_camera_config(**params) + + @classmethod + def right_dex3_wrist_camera(cls, **overrides) -> CameraCfg: + """right wrist camera configuration""" + params = { + "prim_path": "/World/envs/env_.*/Robot/right_hand_camera_base_link/right_wrist_camera", + "height": 224, + "width": 224, + "update_period": 0.02, + "data_types": ["rgb"], + "focal_length": 12.0, + "focus_distance": 400.0, + "horizontal_aperture": 14.25, # Match original vertical FOV after crop + "clipping_range": (0.1, 1.0e5), + "pos_offset": (-0.04012, 0.07441, 0.15711), + "rot_offset": (0.00539, 0.86024, 0.0424, 0.50809), + } + params.update(overrides) + return CameraBaseCfg.get_camera_config(**params) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/gr00t_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/gr00t_config.py new file mode 100644 index 000000000000..d8e670bdacbb --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/gr00t_config.py @@ -0,0 +1,148 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# Copyright (c) 2022-2026, The Isaac Lab Project Developers. +# All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +"""GR00T data configuration for IsaacLab tasks. + +This module defines customizable GR00T data configurations for different +embodiments. Users can create their own data config classes by subclassing +BaseDataConfig or copying/modifying the examples here. + +Example usage in run.sh: + export RLINF_DATA_CONFIG="policy.gr00t_config" + export RLINF_DATA_CONFIG_CLASS="policy.gr00t_config:IsaacLabDataConfig" +""" + +from gr00t.data.dataset import ModalityConfig +from gr00t.data.transform.base import ComposedModalityTransform +from gr00t.data.transform.concat import ConcatTransform +from gr00t.data.transform.state_action import StateActionSinCosTransform, StateActionToTensor, StateActionTransform +from gr00t.data.transform.video import VideoColorJitter, VideoToNumpy, VideoToTensor +from gr00t.experiment.data_config import DATA_CONFIG_MAP, BaseDataConfig +from gr00t.model.transforms import GR00TTransform + + +class IsaacLabDataConfig(BaseDataConfig): + """Generic GR00T data config for IsaacLab tasks with G1 + Dex3.""" + + # Video modality keys (from gr00t_mapping.video in RLINF_OBS_MAP_JSON) + video_keys = [ + "video.left_wrist_view", + "video.right_wrist_view", + "video.room_view", + ] + + # State modality keys (from gr00t_mapping.state in RLINF_OBS_MAP_JSON) + state_keys = [ + "state.left_arm", + "state.right_arm", + "state.left_hand", + "state.right_hand", + ] + + # Action modality keys (output from GR00T model) + action_keys = [ + "action.left_arm", + "action.right_arm", + "action.left_hand", + "action.right_hand", + ] + + # Language annotation key + language_keys = ["annotation.human.task_description"] + + # Observation and action indices + observation_indices = [0] + action_indices = list(range(16)) + + def modality_config(self) -> dict[str, ModalityConfig]: + """Define modality configurations for video, state, action, and language.""" + video_modality = ModalityConfig( + delta_indices=self.observation_indices, + modality_keys=self.video_keys, + ) + + state_modality = ModalityConfig( + delta_indices=self.observation_indices, + modality_keys=self.state_keys, + ) + + action_modality = ModalityConfig( + delta_indices=self.action_indices, + modality_keys=self.action_keys, + ) + + language_modality = ModalityConfig( + delta_indices=self.observation_indices, + modality_keys=self.language_keys, + ) + + return { + "video": video_modality, + "state": state_modality, + "action": action_modality, + "language": language_modality, + } + + def transform(self): + """Define the transform pipeline for processing observations and actions.""" + transforms = [ + # Video transforms + VideoToTensor(apply_to=self.video_keys), + # Disabled: camera already outputs 224×224 via TiledCameraCfg. + # To avoid VideoToTensor size-check errors, either: + # 1. Disable input size validation in VideoToTensor, OR + # 2. Set modality meta height/width to 224 to match actual input. + # Re-enable VideoCrop/VideoResize if camera resolution changes. + # VideoCrop(apply_to=self.video_keys, scale=0.95), + # VideoResize( + # apply_to=self.video_keys, + # height=224, + # width=224, + # interpolation="linear", + # ), + VideoColorJitter( + apply_to=self.video_keys, + brightness=0.3, + contrast=0.4, + saturation=0.5, + hue=0.08, + ), + VideoToNumpy(apply_to=self.video_keys), + # State transforms + StateActionToTensor(apply_to=self.state_keys), + StateActionSinCosTransform(apply_to=self.state_keys), + # Action transforms + StateActionToTensor(apply_to=self.action_keys), + StateActionTransform( + apply_to=self.action_keys, + normalization_modes={key: "min_max" for key in self.action_keys}, + ), + # Concat transforms + ConcatTransform( + video_concat_order=self.video_keys, + state_concat_order=self.state_keys, + action_concat_order=self.action_keys, + ), + # Model-specific transform + GR00TTransform( + state_horizon=len(self.observation_indices), + action_horizon=len(self.action_indices), + max_state_dim=64, + max_action_dim=32, + ), + ] + return ComposedModalityTransform(transforms=transforms) + + +# -------------------------------------------------------------------------- +# Register data configs into GR00T's DATA_CONFIG_MAP +# -------------------------------------------------------------------------- + +# This allows load_data_config("policy.gr00t_config:IsaacLabDataConfig") to work +DATA_CONFIG_MAP["isaaclab_g1_dex3"] = IsaacLabDataConfig() diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/isaaclab_ppo_gr00t_assemble_trocar.yaml b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/isaaclab_ppo_gr00t_assemble_trocar.yaml new file mode 100644 index 000000000000..5b060aa4220c --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/isaaclab_ppo_gr00t_assemble_trocar.yaml @@ -0,0 +1,298 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +defaults: + - override hydra/job_logging: stdout + +hydra: + run: + dir: . + output_subdir: null + +cluster: + num_nodes: 1 + component_placement: + actor,env,rollout: all + +runner: + task_type: embodied + logger: + log_path: "../results" + project_name: rlinf + experiment_name: "test_gr00t" + logger_backends: ["tensorboard"] # wandb, swanlab + + max_epochs: 1000 + max_steps: -1 + + only_eval: False + eval_policy_path: null # Optional: .pt file or None, if None, will use the checkpoint in rollout.model.model_path + val_check_interval: -1 + save_interval: 2 + seq_length: 4096 + max_prompt_length: 30 + + resume_dir: null + +algorithm: + normalize_advantages: True + kl_penalty: kl # how to estimate kl divergence: kl or kl_penalty + group_size: 1 + reward_coef: 1.0 + rollout_epoch: 2 + eval_rollout_epoch: 1 # set eval_rollout_epoch > 0 when enable runner.only_eval or runner.val_check_interval > 0 + + reward_type: chunk_level + logprob_type: chunk_level + entropy_type: chunk_level + + update_epoch: 4 + adv_type: gae + loss_type: actor_critic + loss_agg_func: "token-mean" + kl_beta: 0.0 + entropy_bonus: 0 + clip_ratio_high: 0.2 + clip_ratio_low: 0.2 + clip_ratio_c: 3.0 + value_clip: 0.2 + huber_delta: 10.0 + + gamma: 0.99 + gae_lambda: 0.95 + + filter_rewards: False + rewards_lower_bound: 0.1 + rewards_upper_bound: 0.9 + # params for generation + sampling_params: + do_sample: True + temperature_train: 1.0 + temperature_eval: 0.6 + top_k: 50 + top_p: 1.0 + repetition_penalty: 1.0 + add_BOS: False + + # length argument for autoregressive sampling + # max length means max amount of tokens to generate + length_params: + max_new_token: null + max_length: 1024 + min_length: 1 + +# --------------------------------------------------------------------------- +# Environment +# --------------------------------------------------------------------------- +env: + group_name: "EnvGroup" + channel: + name: "env_buffer_list" + queue_name: "obs_buffer" + queue_size: 0 + enable_offload: False + + train: + env_type: isaaclab + total_num_envs: 4 + auto_reset: False + ignore_terminations: False + use_rel_reward: True + seed: 0 + group_size: 1 + reward_coef: 1.0 + use_fixed_reset_state_ids: True + max_steps_per_rollout_epoch: 256 + max_episode_steps: 256 + video_cfg: + save_video: False + info_on_video: True + video_base_dir: ${runner.logger.log_path}/video/train + init_params: + id: "Isaac-Assemble-Trocar-G129-Dex3-RLinf-v0" + num_envs: null + max_episode_steps: ${env.train.max_episode_steps} + task_description: "assemble trocar from tray" + + # ======================================================================== + # IsaacLab -> RLinf -> GR00T observation/action mapping configuration + # This section defines how IsaacLab observations are converted to GR00T format + # ======================================================================== + isaaclab: &isaaclab_config # YAML anchor for reuse in eval + # Task description for language conditioning + task_description: "assemble trocar from tray" + + # --- IsaacLab -> RLinf observation mapping --- + # main_images: single camera key for main view + main_images: "front_camera" + # extra_view_images: list of camera keys to stack as (B, N, H, W, C) + extra_view_images: + - "left_wrist_camera" + - "right_wrist_camera" + # states: list of state specs with optional slicing + # Each entry can be a string (use full tensor) or dict with "key" and "slice" + states: + - key: "robot_joint_state" + slice: [15, 29] # G129 shoulder joints + - key: "robot_dex3_joint_state" + # slice: null # Use full tensor + + # --- RLinf -> GR00T format conversion --- + gr00t_mapping: + video: + main_images: "video.room_view" + extra_view_images: + - "video.left_wrist_view" + - "video.right_wrist_view" + state: + # Slice concatenated states into GR00T state keys + # Total states: 14 (shoulder) + 14 (dex3) = 28 dims + - gr00t_key: "state.left_arm" + slice: [0, 7] + - gr00t_key: "state.right_arm" + slice: [7, 14] + - gr00t_key: "state.left_hand" + slice: [14, 21] + - gr00t_key: "state.right_hand" + slice: [21, 28] + + # --- GR00T -> IsaacLab action conversion --- + action_mapping: + prefix_pad: 15 # Pad zeros at front for G129 body joints (not controlled) + suffix_pad: 0 + + # --- GR00T model configuration (single source of truth) --- + # actor.model.embodiment_tag and obs_converter_type reference these values via ${} + obs_converter_type: "dex3" + embodiment_tag: "new_embodiment" + embodiment_tag_id: 31 + data_config_class: "gr00t_config:IsaacLabDataConfig" + + eval: + env_type: isaaclab + total_num_envs: 4 + auto_reset: True + ignore_terminations: True + use_rel_reward: True + seed: 0 + group_size: 1 + reward_coef: 1.0 + use_fixed_reset_state_ids: True + max_steps_per_rollout_epoch: 256 + max_episode_steps: 256 + video_cfg: + save_video: True + info_on_video: True + video_base_dir: ${runner.logger.log_path}/video/eval + init_params: + id: "Isaac-Assemble-Trocar-G129-Dex3-RLinf-Eval-v0" + num_envs: null + max_episode_steps: ${env.eval.max_episode_steps} + task_description: "install trocar from box" + # Reuse IsaacLab config from train section via YAML anchor + isaaclab: *isaaclab_config + +# --------------------------------------------------------------------------- +# Rollout +# --------------------------------------------------------------------------- +rollout: + group_name: "RolloutGroup" + channel: + name: ${env.channel.name} + queue_name: "action_buffer" + queue_size: 0 + mode: "colocate" + backend: "huggingface" + enable_offload: True + pipeline_stage_num: 1 + + model: + model_path: "/mnt/ckpt/g1_install_trocar_sim_box_v3_60_train_bs32_1_gpus_cos_30k_tune_visual/" + precision: ${actor.model.precision} + obs_converter_type: ${env.train.isaaclab.obs_converter_type} + embodiment_tag: ${env.train.isaaclab.embodiment_tag} + +# --------------------------------------------------------------------------- +# Actor +# --------------------------------------------------------------------------- +actor: + group_name: "ActorGroup" + channel: + name: ${env.channel.name} + queue_name: "replay_buffer" + queue_size: 0 + training_backend: "fsdp" + micro_batch_size: 2 + global_batch_size: 4 + seed: 1234 + enable_offload: False + + model: + model_type: "gr00t" + model_path: "/mnt/ckpt/g1_install_trocar_sim_box_v3_60_train_bs32_1_gpus_cos_30k_tune_visual/" + precision: "bf16" + trust_remote_code: True + is_lora: false + action_dim: 28 + num_action_chunks: 1 + denoising_steps: 4 + policy_setup: "widowx_bridge" + obs_converter_type: ${env.train.isaaclab.obs_converter_type} + embodiment_tag: ${env.train.isaaclab.embodiment_tag} + add_value_head: True + rl_head_config: + joint_logprob: False + noise_method: "flow_sde" + ignore_last: False + safe_get_logprob: False + noise_anneal: False + noise_params: [0.7, 0.3, 400] + noise_level: 0.3 + add_value_head: ${actor.model.add_value_head} + chunk_critic_input: False + detach_critic_input: True + disable_dropout: True + use_vlm_value: False + value_vlm_mode: "mean_token" + padding_value: 850 + + optim: + lr: 5e-6 + value_lr: 1e-4 + adam_beta1: 0.9 + adam_beta2: 0.95 + adam_eps: 1.0e-08 + clip_grad: 1.0 + weight_decay: 0.01 + critic_warmup_steps: 0 + + fsdp_config: + strategy: "fsdp" + sharding_strategy: "full_shard" + gradient_checkpointing: False + cpu_offload: False + offload_pin_memory: False + reshard_after_forward: True + enable_gradient_accumulation: True + forward_prefetch: False + limit_all_gathers: False + backward_prefetch: null + use_orig_params: False + use_liger_kernel: False + fsdp_size: -1 + mixed_precision: + param_dtype: ${actor.model.precision} + reduce_dtype: ${actor.model.precision} + buffer_dtype: ${actor.model.precision} + amp: + enabled: False + precision: "bf16" + use_grad_scaler: False + +reward: + use_reward_model: False + +critic: + use_critic_model: False diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py new file mode 100644 index 000000000000..6e8678048f20 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py @@ -0,0 +1,323 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Robot configuration for the `install_trocar` task. + +This file is intentionally **minimal**: +- Supported robot: **Unitree G1 (29 DOF body)** +- Supported hands: **Dex3** + +The only public entry point expected by the task is +`G1RobotPresets.g1_29dof_dex3_base_fix(...)`. +""" + +import numpy as np + +import isaaclab.sim as sim_utils +from isaaclab.actuators import IdealPDActuatorCfg, ImplicitActuatorCfg +from isaaclab.assets import ArticulationCfg +from isaaclab.utils import configclass + +# Default joint positions for the supported setup (G1 29DOF + Dex3). +DEFAULT_JOINT_POS: dict[str, float] = { + # legs + "left_hip_pitch_joint": 0.0, + "left_hip_roll_joint": 0.0, + "left_hip_yaw_joint": 0.0, + "left_knee_joint": 0.0, + "left_ankle_pitch_joint": 0.0, + "left_ankle_roll_joint": 0.0, + "right_hip_pitch_joint": 0.0, + "right_hip_roll_joint": 0.0, + "right_hip_yaw_joint": 0.0, + "right_knee_joint": 0.0, + "right_ankle_pitch_joint": 0.0, + "right_ankle_roll_joint": 0.0, + # waist + "waist_yaw_joint": 0.0, + "waist_roll_joint": 0.0, + "waist_pitch_joint": 0.0, + # arms + "left_shoulder_pitch_joint": -0.754599, + "left_shoulder_roll_joint": 0.550010, + "left_shoulder_yaw_joint": -0.399298, + "left_elbow_joint": 0.278886, + "left_wrist_roll_joint": 0.320559, + "left_wrist_pitch_joint": -0.203525, + "left_wrist_yaw_joint": -0.387435, + "right_shoulder_pitch_joint": -0.340858, + "right_shoulder_roll_joint": -0.186152, + "right_shoulder_yaw_joint": 0.015023, + "right_elbow_joint": -0.777159, + "right_wrist_roll_joint": 0.019805, + "right_wrist_pitch_joint": 1.182285, + "right_wrist_yaw_joint": -0.022848, + # dex3 hands (left) + "left_hand_index_0_joint": -60.0 * np.pi / 180.0, + "left_hand_middle_0_joint": -60.0 * np.pi / 180.0, + "left_hand_thumb_0_joint": 0.0, + "left_hand_index_1_joint": -40.0 * np.pi / 180.0, + "left_hand_middle_1_joint": -40.0 * np.pi / 180.0, + "left_hand_thumb_1_joint": 0.0, + "left_hand_thumb_2_joint": 0.0, + # dexterous hand joint - right hand + "right_hand_index_0_joint": 60.0 * np.pi / 180.0, + "right_hand_middle_0_joint": 60.0 * np.pi / 180.0, + "right_hand_thumb_0_joint": 0.0, + "right_hand_index_1_joint": 40.0 * np.pi / 180.0, + "right_hand_middle_1_joint": 40.0 * np.pi / 180.0, + "right_hand_thumb_1_joint": 0.0, + "right_hand_thumb_2_joint": 0.0, +} + + +G129_CFG_WITH_DEX3_BASE_FIX = ArticulationCfg( + spawn=sim_utils.UsdFileCfg( + usd_path="/mnt/Data/lw_v3/robots/g1_29dof_with_dex3_base_fix.usd", + activate_contact_sensors=True, + rigid_props=sim_utils.RigidBodyPropertiesCfg( + disable_gravity=False, + retain_accelerations=False, + linear_damping=0.0, + angular_damping=0.0, + max_linear_velocity=1000.0, + max_angular_velocity=1000.0, + max_depenetration_velocity=1.0, + solver_position_iteration_count=4, + solver_velocity_iteration_count=0, + ), + articulation_props=sim_utils.ArticulationRootPropertiesCfg( + enabled_self_collisions=False, solver_position_iteration_count=4, solver_velocity_iteration_count=0 + ), + ), + prim_path="/World/envs/env_.*/Robot", + init_state=ArticulationCfg.InitialStateCfg( + pos=(0.0, 0.0, 0.75), + joint_pos={ + # legs joints + "left_hip_yaw_joint": 0.0, + "left_hip_roll_joint": 0.0, + "left_hip_pitch_joint": -0.05, + "left_knee_joint": 0.2, + "left_ankle_pitch_joint": -0.15, + "left_ankle_roll_joint": 0.0, + "right_hip_yaw_joint": 0.0, + "right_hip_roll_joint": 0.0, + "right_hip_pitch_joint": -0.05, + "right_knee_joint": 0.2, + "right_ankle_pitch_joint": -0.15, + "right_ankle_roll_joint": 0.0, + # waist joints + "waist_yaw_joint": 0.0, + "waist_roll_joint": 0.0, + "waist_pitch_joint": 0.0, + "left_shoulder_pitch_joint": 0.0, + "left_shoulder_roll_joint": 0.0, + "left_shoulder_yaw_joint": 0.0, + "left_elbow_joint": -0.3, + "left_wrist_roll_joint": 0.0, + "left_wrist_pitch_joint": 0.0, + "left_wrist_yaw_joint": 0.0, + "right_shoulder_pitch_joint": 0.0, + "right_shoulder_roll_joint": 0.0, + "right_shoulder_yaw_joint": 0.0, + "right_elbow_joint": -0.3, + "right_wrist_roll_joint": 0.0, + "right_wrist_pitch_joint": 0.0, + "right_wrist_yaw_joint": 0.0, + # fingers joints + "left_hand_index_0_joint": 0.0, + "left_hand_middle_0_joint": 0.0, + "left_hand_thumb_0_joint": 0.0, + "left_hand_index_1_joint": 0.0, + "left_hand_middle_1_joint": 0.0, + "left_hand_thumb_1_joint": 0.0, + "left_hand_thumb_2_joint": 0.0, + "right_hand_index_0_joint": 0.0, + "right_hand_middle_0_joint": 0.0, + "right_hand_thumb_0_joint": 0.0, + "right_hand_index_1_joint": 0.0, + "right_hand_middle_1_joint": 0.0, + "right_hand_thumb_1_joint": 0.0, + "right_hand_thumb_2_joint": 0.0, + }, + joint_vel={".*": 0.0}, + ), + soft_joint_pos_limit_factor=0.9, + actuators={ + "legs": IdealPDActuatorCfg( + joint_names_expr=[ + ".*_hip_yaw_joint", + ".*_hip_roll_joint", + ".*_hip_pitch_joint", + ".*_knee_joint", + ], + effort_limit={ + ".*_hip_yaw_joint": 88.0, + ".*_hip_roll_joint": 88.0, + ".*_hip_pitch_joint": 88.0, + ".*_knee_joint": 139.0, + }, + velocity_limit={ + ".*_hip_yaw_joint": 32.0, + ".*_hip_roll_joint": 32.0, + ".*_hip_pitch_joint": 32.0, + ".*_knee_joint": 20.0, + }, + stiffness={ + ".*_hip_yaw_joint": 150.0, + ".*_hip_roll_joint": 150.0, + ".*_hip_pitch_joint": 150.0, + ".*_knee_joint": 300.0, + }, + damping={ + ".*_hip_yaw_joint": 2.0, + ".*_hip_roll_joint": 2.0, + ".*_hip_pitch_joint": 2.0, + ".*_knee_joint": 4.0, + }, + armature={ + ".*_hip_.*": 0.03, + ".*_knee_joint": 0.03, + }, + ), + "feet": IdealPDActuatorCfg( + joint_names_expr=[".*_ankle_pitch_joint", ".*_ankle_roll_joint"], + stiffness={ + ".*_ankle_pitch_joint": 40.0, + ".*_ankle_roll_joint": 40.0, + }, + damping={ + ".*_ankle_pitch_joint": 2, + ".*_ankle_roll_joint": 2, + }, + effort_limit={ + ".*_ankle_pitch_joint": 50.0, + ".*_ankle_roll_joint": 50.0, + }, + velocity_limit={ + ".*_ankle_pitch_joint": 37.0, + ".*_ankle_roll_joint": 37.0, + }, + armature=0.03, + friction=0.03, + ), + "waist": ImplicitActuatorCfg( + joint_names_expr=["waist_yaw_joint", "waist_roll_joint", "waist_pitch_joint"], + effort_limit=1000.0, # set a large torque limit + velocity_limit=0.0, # set the velocity limit to 0 + stiffness={"waist_yaw_joint": 10000.0, "waist_roll_joint": 10000.0, "waist_pitch_joint": 10000.0}, + damping={"waist_yaw_joint": 10000.0, "waist_roll_joint": 10000.0, "waist_pitch_joint": 10000.0}, + armature=None, + ), + "arms": IdealPDActuatorCfg( + joint_names_expr=[ + ".*_shoulder_pitch_joint", + ".*_shoulder_roll_joint", + ".*_shoulder_yaw_joint", + ".*_elbow_joint", + ".*_wrist_.*_joint", + ], + effort_limit={ + ".*_shoulder_pitch_joint": 25.0, + ".*_shoulder_roll_joint": 25.0, + ".*_shoulder_yaw_joint": 25.0, + ".*_elbow_joint": 25.0, + ".*_wrist_roll_joint": 25.0, + ".*_wrist_pitch_joint": 5.0, + ".*_wrist_yaw_joint": 5.0, + }, + velocity_limit={ + ".*_shoulder_pitch_joint": 37.0, + ".*_shoulder_roll_joint": 37.0, + ".*_shoulder_yaw_joint": 37.0, + ".*_elbow_joint": 37.0, + ".*_wrist_roll_joint": 37.0, + ".*_wrist_pitch_joint": 22.0, + ".*_wrist_yaw_joint": 22.0, + }, + stiffness={ + ".*_shoulder_pitch_joint": 100.0, + ".*_shoulder_roll_joint": 100.0, + ".*_shoulder_yaw_joint": 40.0, + ".*_elbow_joint": 40.0, + ".*_wrist_.*_joint": 20.0, + }, + damping={ + ".*_shoulder_pitch_joint": 15.0, + ".*_shoulder_roll_joint": 15.0, + ".*_shoulder_yaw_joint": 8.0, + ".*_elbow_joint": 8.0, + ".*_wrist_.*_joint": 4.0, + }, + armature={".*_shoulder_.*": 0.03, ".*_elbow_.*": 0.03, ".*_wrist_.*_joint": 0.03}, + friction=0.03, + ), + # NOTE(peterd, 9/25/2025): The follow hand joint values are tested and working with Leapmotion and Mimic + "hands": IdealPDActuatorCfg( + joint_names_expr=[ + ".*_hand_.*", + ], + effort_limit=5.0, + velocity_limit=10.0, + stiffness=8.0, + damping=1.5, + armature=0.03, + friction=0.5, + ), + }, +) + + +def make_g1_29dof_dex3_cfg( + *, + prim_path: str = "/World/envs/env_.*/Robot", + init_pos: tuple[float, float, float] = (-0.15, 0.0, 0.744), + init_rot: tuple[float, float, float, float] = (0, 0, 0.7071, 0.7071), + custom_joint_pos: dict[str, float] | None = None, + base_config: ArticulationCfg = G129_CFG_WITH_DEX3_BASE_FIX, +) -> ArticulationCfg: + """Create the only supported robot articulation cfg for this task.""" + joint_pos = DEFAULT_JOINT_POS.copy() + if custom_joint_pos: + joint_pos.update(custom_joint_pos) + return base_config.replace( + prim_path=prim_path, + init_state=ArticulationCfg.InitialStateCfg( + pos=init_pos, + rot=init_rot, + joint_pos=joint_pos, + joint_vel={".*": 0.0}, + ), + ) + + +@configclass +class G1RobotPresets: + """G1 robot preset configuration collection""" + + @classmethod + def g1_29dof_dex3_base_fix( + cls, + init_pos: tuple[float, float, float] = (-0.15, 0.0, 0.76), + init_rot: tuple[float, float, float, float] = (0, 0, 0.7071, 0.7071), + ) -> ArticulationCfg: + """pick-place task configuration - dex3 hand""" + return make_g1_29dof_dex3_cfg(init_pos=init_pos, init_rot=init_rot) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py new file mode 100644 index 000000000000..0faf9da85ebc --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py @@ -0,0 +1,444 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from isaaclab_physx.physics import PhysxCfg + +import isaaclab.envs.mdp as base_mdp +import isaaclab.sim as sim_utils +from isaaclab.assets import ArticulationCfg, AssetBaseCfg, RigidObjectCfg +from isaaclab.envs import ManagerBasedRLEnvCfg, ViewerCfg +from isaaclab.managers import EventTermCfg, SceneEntityCfg +from isaaclab.managers import ObservationGroupCfg as ObsGroup +from isaaclab.managers import ObservationTermCfg as ObsTerm +from isaaclab.managers import RewardTermCfg as RewTerm +from isaaclab.managers import TerminationTermCfg as DoneTerm +from isaaclab.scene import InteractiveSceneCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import UsdFileCfg +from isaaclab.utils import configclass + +from isaaclab_tasks.manager_based.manipulation.assemble_trocar import mdp + +from isaaclab_tasks.manager_based.manipulation.assemble_trocar.config import ( # isort: skip + CameraPresets, + G1RobotPresets, +) + +joint_names = [ + "left_hip_pitch_joint", + "right_hip_pitch_joint", + "left_hip_roll_joint", + "right_hip_roll_joint", + "left_hip_yaw_joint", + "right_hip_yaw_joint", + "left_knee_joint", + "right_knee_joint", + "left_ankle_pitch_joint", + "right_ankle_pitch_joint", + "left_ankle_roll_joint", + "right_ankle_roll_joint", + "waist_yaw_joint", + "waist_roll_joint", + "waist_pitch_joint", + "left_shoulder_pitch_joint", + "left_shoulder_roll_joint", + "left_shoulder_yaw_joint", + "left_elbow_joint", + "left_wrist_roll_joint", + "left_wrist_pitch_joint", + "left_wrist_yaw_joint", + "right_shoulder_pitch_joint", + "right_shoulder_roll_joint", + "right_shoulder_yaw_joint", + "right_elbow_joint", + "right_wrist_roll_joint", + "right_wrist_pitch_joint", + "right_wrist_yaw_joint", + "left_hand_thumb_0_joint", + "left_hand_thumb_1_joint", + "left_hand_thumb_2_joint", + "left_hand_middle_0_joint", + "left_hand_middle_1_joint", + "left_hand_index_0_joint", + "left_hand_index_1_joint", + "right_hand_thumb_0_joint", + "right_hand_thumb_1_joint", + "right_hand_thumb_2_joint", + "right_hand_middle_0_joint", + "right_hand_middle_1_joint", + "right_hand_index_0_joint", + "right_hand_index_1_joint", +] +offset_dict = { + "left_elbow_joint": -0.3, + "right_elbow_joint": -0.3, +} + +# FIXME(mingxinz): revisit the USD_ROOT +USD_ROOT = ( + "https://isaac-dev.ov.nvidia.com/omni/web3/omniverse://isaac-dev.ov.nvidia.com/Library/IsaacHealthcare/0.5.0/Props/" +) + + +@configclass +class AssembleTrocarSceneCfg(InteractiveSceneCfg): + """Scene configuration for the assemble_trocar task (robot + objects + lights).""" + + # humanoid robot configuration + robot: ArticulationCfg = G1RobotPresets.g1_29dof_dex3_base_fix( + init_pos=(-1.84919, 1.94, 0.81168), init_rot=(0.0, 0.0, 0.0, 1.0) + ) + # add camera configuration + front_camera = CameraPresets.g1_front_camera() + left_wrist_camera = CameraPresets.left_dex3_wrist_camera() + right_wrist_camera = CameraPresets.right_dex3_wrist_camera() + + scene = AssetBaseCfg( + prim_path="/World/envs/env_.*/Scene", + spawn=UsdFileCfg( + usd_path=f"{USD_ROOT}/LightWheel/scene03.usd", + ), + ) + + trocar_1 = RigidObjectCfg( + prim_path="/World/envs/env_.*/trocar_1", + spawn=UsdFileCfg( + usd_path=f"{USD_ROOT}/LightWheel/Assets/Trocar002/Trocar002-xform-wo.usd", + collision_props=sim_utils.CollisionPropertiesCfg( + collision_enabled=True, + contact_offset=0.001, + rest_offset=-0.001, + ), + ), + init_state=RigidObjectCfg.InitialStateCfg( + pos=[-1.60202, 1.91362, 0.87183], + rot=[-0.0, 0.70711, 0.70711, 0.0], + ), + ) + + trocar_2 = RigidObjectCfg( + prim_path="/World/envs/env_.*/trocar_2", + spawn=UsdFileCfg( + usd_path=( + f"{USD_ROOT}/LightWheel/Assets/" + "DisposableLaparoscopicPunctureDevice001/" + "DisposableLaparoscopicPunctureDevice005-xform.usd" + ), + rigid_props=sim_utils.RigidBodyPropertiesCfg( + rigid_body_enabled=True, + disable_gravity=False, + ), + ), + init_state=RigidObjectCfg.InitialStateCfg( + rot=[-0.71475, -0.000243, 0.05853, 0.69692], pos=[-1.50635, 1.90997, 0.8631] + ), + ) + tray = ArticulationCfg( + prim_path="/World/envs/env_.*/surgical_tray", + spawn=UsdFileCfg( + usd_path=f"{USD_ROOT}/LightWheel/Assets/SurgicalTray001/SurgicalTray001.usd", + ), + init_state=ArticulationCfg.InitialStateCfg(pos=[-1.54919, 2.03365, 0.84554], rot=[0.0, 0.0, -0.70711, 0.70711]), + actuators={}, # Empty dict for passive articulation (no motors) + ) + + # Lights + light = AssetBaseCfg( + prim_path="/World/light", + spawn=sim_utils.DomeLightCfg( + color=(0.75, 0.75, 0.75), + intensity=1000.0, + ), + ) + + +## +# MDP settings +## +@configclass +class ActionsCfg: + """defines the action configuration related to robot control, using direct joint angle control""" + + joint_pos = mdp.JointPositionActionCfg( + asset_name="robot", + joint_names=joint_names, + scale=1.0, + use_default_offset=False, + offset=offset_dict, + preserve_order=True, + ) + + +@configclass +class ObservationsCfg: + """defines all available observation information""" + + @configclass + class PolicyCfg(ObsGroup): + """policy group observation configuration class + defines all state observation values for policy decision + inherit from ObsGroup base class + """ + + # robot joint state observation + robot_joint_state = ObsTerm(func=mdp.get_robot_body_joint_states) + # dex3 hand joint state observation + robot_dex3_joint_state = ObsTerm(func=mdp.get_robot_dex3_joint_states) + + def __post_init__(self): + """post initialization function + set the basic attributes of the observation group + """ + self.enable_corruption = False # disable observation value corruption + self.concatenate_terms = False # disable observation item connection + + @configclass + class CameraImagesCfg(ObsGroup): + """Observations from the robot's cameras.""" + + front_camera = ObsTerm( + func=base_mdp.image, + params={"sensor_cfg": SceneEntityCfg("front_camera"), "data_type": "rgb", "normalize": False}, + ) + left_wrist_camera = ObsTerm( + func=base_mdp.image, + params={"sensor_cfg": SceneEntityCfg("left_wrist_camera"), "data_type": "rgb", "normalize": False}, + ) + right_wrist_camera = ObsTerm( + func=base_mdp.image, + params={"sensor_cfg": SceneEntityCfg("right_wrist_camera"), "data_type": "rgb", "normalize": False}, + ) + + def __post_init__(self): + self.concatenate_terms = False + + # observation groups + # create policy observation group instance + policy: PolicyCfg = PolicyCfg() + camera_images: CameraImagesCfg = CameraImagesCfg() + + +@configclass +class TerminationsCfg: + """Termination conditions for the environment.""" + + # Time out termination + time_out = DoneTerm(func=mdp.time_out, time_out=True) + + # Task success termination (all stages completed) + task_success = DoneTerm( + func=mdp.task_success_termination, + time_out=False, # This is a success termination, not a failure + params={ + "print_log": False, + "success_stage": 4, + }, + ) + object_drop = DoneTerm( + func=mdp.object_drop_termination, + time_out=True, # Treat as timeout/failure + params={ + "drop_height_threshold": 0.5, # Objects below this Z height are considered dropped + "asset_cfg1": SceneEntityCfg("trocar_1"), + "asset_cfg2": SceneEntityCfg("trocar_2"), + }, + ) + + +@configclass +class RewardsCfg: + """Reward configuration for sparse reward mode. + + Each stage gives 1.0 reward on completion → Total reward for full task = 4.0 + This ensures clear reward signal for each stage transition. + """ + + # Stage 0: Lift trocars + lift_trocars = RewTerm( + func=mdp.lift_trocars_reward, + weight=1.0, # Give 1.0 reward when stage 0->1 completes + params={ + "table_height": 0.85483, + "lift_threshold": 0.15, + "asset_cfg1": SceneEntityCfg("trocar_1"), + "asset_cfg2": SceneEntityCfg("trocar_2"), + # Stage transition thresholds + "tip_align_threshold": 0.015, # Threshold for tip alignment (m) + "insertion_dist_threshold": 0.05, + "insertion_angle_threshold": 0.15, + "placement_x_min": -1.8, + "placement_x_max": -1.4, + "placement_y_min": 1.5, + "placement_y_max": 1.8, + "use_sparse_reward": True, + "print_log": False, + }, + ) + + # Stage 1: Tip alignment (find hole) + tip_alignment = RewTerm( + func=mdp.trocar_tip_alignment_reward, + weight=1.0, # Give 1.0 reward when stage 1->2 completes + params={ + "tip_dist_std": 0.02, # Std for tip distance reward shaping + "asset_cfg1": SceneEntityCfg("trocar_1"), + "asset_cfg2": SceneEntityCfg("trocar_2"), + "use_sparse_reward": True, + "print_log": False, + }, + ) + + # Stage 2: Insertion (push in) + insert_trocars = RewTerm( + func=mdp.trocar_insertion_reward, + weight=1.0, # Give 1.0 reward when stage 2->3 completes + params={ + "angle_std": 0.2, # Std for angle alignment reward + "angle_threshold": 0.10, # ~5.7 degrees tolerance for parallelism + "center_dist_std": 0.05, # Std for center distance reward + "asset_cfg1": SceneEntityCfg("trocar_1"), + "asset_cfg2": SceneEntityCfg("trocar_2"), + "use_sparse_reward": True, + "print_log": False, + }, + ) + + # Stage 3: Placement (place in tray) + placement_trocars = RewTerm( + func=mdp.trocar_placement_reward, + weight=1.0, # Give 1.0 reward when stage 3->4 completes + params={ + "x_min": -1.8, + "x_max": -1.4, + "y_min": 1.5, + "y_max": 1.8, + "asset_cfg1": SceneEntityCfg("trocar_1"), + "asset_cfg2": SceneEntityCfg("trocar_2"), + "use_sparse_reward": True, + "print_log": False, + }, + ) + + +@configclass +class EventCfg: + """Event configuration for scene reset.""" + + # Reset scene when episode terminates (timeout or success) + reset_scene = EventTermCfg(func=base_mdp.reset_scene_to_default, mode="reset") + + # Reset task stage tracker when environment resets + reset_task_stage = EventTermCfg(func=mdp.reset_task_stage, mode="reset") + + # Random rotation for tray and trocars + reset_tray_random_rotation = EventTermCfg( + func=mdp.reset_tray_with_random_rotation, + mode="reset", + params={ + "tray_cfg": SceneEntityCfg("tray"), + "trocar_1_cfg": SceneEntityCfg("trocar_1"), + "trocar_2_cfg": SceneEntityCfg("trocar_2"), + "rotation_range": [0, 10], + }, + ) + + +@configclass +class G1AssembleTrocarEnvCfg(ManagerBasedRLEnvCfg): + """Unitree G1 robot assemble trocar environment configuration class + inherits from ManagerBasedRLEnvCfg, defines all configuration parameters for the entire environment + """ + + # scene settings + scene: AssembleTrocarSceneCfg = AssembleTrocarSceneCfg( + num_envs=1, + env_spacing=6.0, + replicate_physics=True, + ) + # viewer settings + viewer: ViewerCfg = ViewerCfg( + eye=(-0.5, 2.4, 1.6), + lookat=(-5.4, 0.2, -1.2), + cam_prim_path="/OmniverseKit_Persp", + ) + # basic settings + observations: ObservationsCfg = ObservationsCfg() + actions: ActionsCfg = ActionsCfg() + # MDP settings + terminations: TerminationsCfg = TerminationsCfg() + events = EventCfg() + commands = None + rewards: RewardsCfg = RewardsCfg() + curriculum = None + + def __post_init__(self): + """Post initialization.""" + # general settings + self.decimation = 4 + self.episode_length_s = 20.0 + # simulation settings + self.sim.dt = 1 / 200 + self.sim.render_interval = self.decimation + self.sim.physics = PhysxCfg(bounce_threshold_velocity=0.01) + self.sim.render.enable_translucency = True + self.sim.render.carb_settings = { + "rtx.raytracing.fractionalCutoutOpacity": True, + } + self.sim.render.rendering_mode = "quality" + self.sim.render.antialiasing_mode = "DLAA" + + +@configclass +class EventCfgFixTrayRotation(EventCfg): + """Event configuration with a deterministic-but-different yaw per env index. + + This is useful for eval with many parallel envs: + - env 0..N-1 get different yaw angles, + - for a fixed global seed, the set of N angles is reproducible across runs/resets. + + Notes: + - Determinism is tied to torch's global seed (set by env reset seed in IsaacLab). + - Angle unit is degrees. + """ + + reset_tray_random_rotation = EventTermCfg( + func=mdp.reset_tray_with_random_rotation, + mode="reset", + params={ + "tray_cfg": SceneEntityCfg("tray"), + "trocar_1_cfg": SceneEntityCfg("trocar_1"), + "trocar_2_cfg": SceneEntityCfg("trocar_2"), + "rotation_range": [0, 10], + "deterministic_per_env": True, + # Use torch.initial_seed() by default to follow the env reset seed. + "deterministic_seed": None, + }, + ) + + +@configclass +class G1AssembleTrocarEvalEnvCfg(G1AssembleTrocarEnvCfg): + """Eval-friendly env cfg. + + This is currently an alias of `G1AssembleTrocarEnvCfg`, but registered under a + separate Gym id for compatibility with RLinf configs. + """ + + # Override events to enforce deterministic per-env tray yaw on every reset. + events: EventCfgFixTrayRotation = EventCfgFixTrayRotation() diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py new file mode 100644 index 000000000000..f2ecc6014215 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py @@ -0,0 +1,51 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""MDP utilities for the assemble_trocar task.""" + +from isaaclab.envs.mdp import JointPositionActionCfg, time_out + +from .events import reset_robot_to_default_joint_positions, reset_task_stage, reset_tray_with_random_rotation +from .observations import get_robot_body_joint_states, get_robot_dex3_joint_states +from .rewards import ( + lift_trocars_reward, + trocar_insertion_reward, + trocar_placement_reward, + trocar_tip_alignment_reward, + update_task_stage, +) +from .terminations import object_drop_termination, task_success_termination + +__all__ = [ + "JointPositionActionCfg", + "time_out", + "get_robot_body_joint_states", + "get_robot_dex3_joint_states", + "reset_tray_with_random_rotation", + "reset_robot_to_default_joint_positions", + "reset_task_stage", + "update_task_stage", + "lift_trocars_reward", + "trocar_tip_alignment_reward", + "trocar_insertion_reward", + "trocar_placement_reward", + "task_success_termination", + "object_drop_termination", +] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py new file mode 100644 index 000000000000..6462777d480e --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py @@ -0,0 +1,274 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Custom event functions for pick place surgical environment.""" + +from __future__ import annotations + +import math +from typing import TYPE_CHECKING + +import torch +import warp as wp + +from isaaclab.managers import SceneEntityCfg +from isaaclab.utils.math import quat_apply, quat_mul + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + +__all__ = [ + "reset_tray_with_random_rotation", + "reset_robot_to_default_joint_positions", + "reset_task_stage", +] + + +def reset_task_stage( + env: ManagerBasedRLEnv, + env_ids: torch.Tensor, + print_log: bool = False, +) -> None: + """Reset task stage to 0 for specified environments. + + This should be called during environment reset events. + Also resets all locked reward caches to maintain continuity. + + Args: + env: The environment instance + env_ids: Indices of environments to reset + print_log: If True, print debug information. + """ + if hasattr(env, "_task_stage"): + env._task_stage[env_ids] = 0 + + # Reset all locked reward caches (for dense rewards) + if hasattr(env, "_lift_reward_locked"): + env._lift_reward_locked[env_ids] = 0 + if hasattr(env, "_tip_reward_locked"): + env._tip_reward_locked[env_ids] = 0 + if hasattr(env, "_insertion_reward_locked"): + env._insertion_reward_locked[env_ids] = 0 + if hasattr(env, "_placement_reward_locked"): + env._placement_reward_locked[env_ids] = 0 + + # Reset all previous stage trackers (for sparse rewards) + if hasattr(env, "_prev_stage_lift"): + env._prev_stage_lift[env_ids] = 0 + if hasattr(env, "_prev_stage_tip"): + env._prev_stage_tip[env_ids] = 0 + if hasattr(env, "_prev_stage_insert"): + env._prev_stage_insert[env_ids] = 0 + if hasattr(env, "_prev_stage_place"): + env._prev_stage_place[env_ids] = 0 + + # Reset debug print tracker + if hasattr(env, "_last_debug_print_step"): + env._last_debug_print_step = -1 + + if print_log: + print(f"Reset task stage for {len(env_ids)} environment(s)") + + +def reset_tray_with_random_rotation( + env: ManagerBasedRLEnv, + env_ids: torch.Tensor, + tray_cfg: SceneEntityCfg, + trocar_1_cfg: SceneEntityCfg, + trocar_2_cfg: SceneEntityCfg, + rotation_range: tuple[float, float] | float = (-5.0, 5.0), # (min, max) degrees or ±value + deterministic_per_env: bool = False, + deterministic_seed: int | None = None, +): + """Reset tray with random rotation while keeping relative positions of trocars. + + This function: + 1. Applies a random yaw rotation within rotation_range to the tray + 2. Rotates trocar_1 and trocar_2 around the tray center to maintain relative positions + 3. Uses separate pose/velocity writes to ensure instant teleportation (no interpolation) + + Args: + env: The environment instance. + env_ids: The environment indices to reset. + tray_cfg: Scene entity config for the tray. + trocar_1_cfg: Scene entity config for trocar_1. + trocar_2_cfg: Scene entity config for trocar_2. + rotation_range: Rotation angle range in degrees. Can be: + - tuple (min, max): Random rotation between min and max degrees + - float value: Random rotation between -value and +value degrees + Examples: (0, 10), (-5, 15), 5.0 (equivalent to (-5, 5)) + """ + if len(env_ids) == 0: + return + + # Parse rotation_range parameter + if isinstance(rotation_range, (tuple, list)): + # User provided (min, max) range + min_angle_deg, max_angle_deg = rotation_range[0], rotation_range[1] + else: + # User provided single value (symmetric range ±value) + min_angle_deg, max_angle_deg = -rotation_range, rotation_range + + # Get assets + tray = env.scene[tray_cfg.name] + trocar_1 = env.scene[trocar_1_cfg.name] + trocar_2 = env.scene[trocar_2_cfg.name] + + # Get default states (initial positions from config) + # note: default_root_state is the local coordinate relative to the environment origin + tray_default_state = wp.to_torch(tray.data.default_root_state)[env_ids].clone() + trocar_1_default_state = wp.to_torch(trocar_1.data.default_root_state)[env_ids].clone() + trocar_2_default_state = wp.to_torch(trocar_2.data.default_root_state)[env_ids].clone() + + # get the world coordinate offset for each environment (multiple environment support) + env_origins = env.scene.env_origins[env_ids] # (num_envs, 3) + + # convert local coordinate to world coordinate + tray_default_state[:, :3] += env_origins + trocar_1_default_state[:, :3] += env_origins + trocar_2_default_state[:, :3] += env_origins + + # Tray center position (pivot point for rotation) - now is world coordinate + tray_center = tray_default_state[:, :3] # (num_envs, 3) + + # Generate yaw angles (in radians) + # Convert degrees to radians + min_angle_rad = min_angle_deg * math.pi / 180.0 + max_angle_rad = max_angle_deg * math.pi / 180.0 + + # Generate angles uniformly distributed in [min_angle, max_angle] + if deterministic_per_env: + # Derive a stable "random" number per env id, so each env gets a distinct yaw, + # but it is repeatable across resets/runs given the same seed + env_id. + # + # If deterministic_seed is not provided, we tie it to torch's global seed. + # IsaacLab typically seeds torch during env reset with the provided seed. + if deterministic_seed is None: + deterministic_seed = int(torch.initial_seed()) + u = _deterministic_uniform_0_1_from_ids(env, env_ids, deterministic_seed) # (num_envs,) + else: + u = torch.rand(len(env_ids), device=env.device) + random_yaw = u * (max_angle_rad - min_angle_rad) + min_angle_rad # (num_envs,) + + # Create rotation quaternion for yaw (rotation around Z-axis) + # XYZW: quat = [x, y, z, w] = [0, 0, sin(θ/2), cos(θ/2)] + half_angle = random_yaw / 2.0 + delta_quat = torch.zeros(len(env_ids), 4, device=env.device) + delta_quat[:, 2] = torch.sin(half_angle) # z + delta_quat[:, 3] = torch.cos(half_angle) # w + + # Apply rotation to tray quaternion + tray_new_quat = quat_mul(delta_quat, tray_default_state[:, 3:7]) + + # Update tray state + tray_new_state = tray_default_state.clone() + tray_new_state[:, 3:7] = tray_new_quat + + # Rotate trocar positions around tray center + trocar_1_relative_pos = trocar_1_default_state[:, :3] - tray_center + trocar_2_relative_pos = trocar_2_default_state[:, :3] - tray_center + + # Rotate relative positions using the delta quaternion + trocar_1_new_relative_pos = quat_apply(delta_quat, trocar_1_relative_pos) + trocar_2_new_relative_pos = quat_apply(delta_quat, trocar_2_relative_pos) + + # New absolute positions + trocar_1_new_state = trocar_1_default_state.clone() + trocar_2_new_state = trocar_2_default_state.clone() + + trocar_1_new_state[:, :3] = tray_center + trocar_1_new_relative_pos + trocar_2_new_state[:, :3] = tray_center + trocar_2_new_relative_pos + + # Also rotate trocar orientations + trocar_1_new_state[:, 3:7] = quat_mul(delta_quat, trocar_1_default_state[:, 3:7]) + trocar_2_new_state[:, 3:7] = quat_mul(delta_quat, trocar_2_default_state[:, 3:7]) + + zero_velocity = torch.zeros(len(env_ids), 6, device=env.device) # [lin_vel(3), ang_vel(3)] + + tray.write_root_pose_to_sim_index(root_pose=tray_new_state[:, :7], env_ids=env_ids) + trocar_1.write_root_pose_to_sim_index(root_pose=trocar_1_new_state[:, :7], env_ids=env_ids) + trocar_2.write_root_pose_to_sim_index(root_pose=trocar_2_new_state[:, :7], env_ids=env_ids) + + tray.write_root_velocity_to_sim_index(root_velocity=zero_velocity, env_ids=env_ids) + trocar_1.write_root_velocity_to_sim_index(root_velocity=zero_velocity, env_ids=env_ids) + trocar_2.write_root_velocity_to_sim_index(root_velocity=zero_velocity, env_ids=env_ids) + + +def _deterministic_uniform_0_1_from_ids( + env: ManagerBasedRLEnv, + ids: torch.Tensor, + seed: int, +) -> torch.Tensor: + """Deterministically map env ids -> floats in [0, 1) via a seeded lookup table. + + We generate a length-(env.num_envs) random table with a local torch.Generator + seeded by `seed`, then return table[ids]. This is deterministic and avoids + uint64 bitwise ops (which may not be supported on CPU). + """ + device = env.device + num_envs = int(env.num_envs) + seed = int(seed) + + cache = getattr(env, "_deterministic_u_table_cache", None) + cache_key = (seed, num_envs, str(device)) + if cache is None or cache.get("key") != cache_key: + gen = torch.Generator(device=device) + gen.manual_seed(seed & 0xFFFFFFFFFFFFFFFF) + u_table = torch.rand((num_envs,), generator=gen, device=device, dtype=torch.float32) + cache = {"key": cache_key, "u_table": u_table} + setattr(env, "_deterministic_u_table_cache", cache) + + return cache["u_table"][ids] + + +def reset_robot_to_default_joint_positions( + env: ManagerBasedRLEnv, + env_ids: torch.Tensor, + robot_cfg: SceneEntityCfg, +): + """Reset robot joint positions directly to default values. + + This function directly writes joint positions and velocities to the simulation, + bypassing the PD controller. This prevents the "drive to target" behavior + that causes arms to swing from 0 position to the target position. + + Args: + env: The environment instance. + env_ids: The environment indices to reset. + robot_cfg: Scene entity config for the robot. + """ + if len(env_ids) == 0: + return + + # Get robot asset + robot = env.scene[robot_cfg.name] + + # Get default joint positions and velocities + default_joint_pos = wp.to_torch(robot.data.default_joint_pos)[env_ids].clone() + default_joint_vel = wp.to_torch(robot.data.default_joint_vel)[env_ids].clone() + + # Directly write joint state to simulation (bypasses PD controller) + robot.write_joint_position_to_sim_index(position=default_joint_pos, env_ids=env_ids) + robot.write_joint_velocity_to_sim_index(velocity=default_joint_vel, env_ids=env_ids) + + # Also reset root state + default_root_state = wp.to_torch(robot.data.default_root_state)[env_ids].clone() + robot.write_root_pose_to_sim_index(root_pose=default_root_state[:, :7], env_ids=env_ids) + robot.write_root_velocity_to_sim_index(root_velocity=default_root_state[:, 7:13], env_ids=env_ids) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py new file mode 100644 index 000000000000..b3cd7917df43 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py @@ -0,0 +1,173 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +G1 29DOF (body) + Dex3 joint state helpers for the assemble_trocar task. + +Notes: +- DDS has been removed (simulation-only observations). +- These functions are designed to be used as Isaac Lab observation terms. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import torch +import warp as wp + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +# Observation cache: index tensors + preallocated output buffers (body joints) +_body_obs_cache = { + "device": None, + "batch": None, + "idx_t": None, + "idx_batch": None, + "pos_buf": None, + "vel_buf": None, + "torque_buf": None, + "combined_buf": None, +} + + +def get_robot_body_joint_states(env: ManagerBasedRLEnv) -> torch.Tensor: + """Return body joint states as a single tensor: [pos(29) | vel(29) | torque(29)].""" + joint_pos = wp.to_torch(env.scene["robot"].data.joint_pos) + joint_vel = wp.to_torch(env.scene["robot"].data.joint_vel) + joint_torque = wp.to_torch(env.scene["robot"].data.applied_torque) + device = joint_pos.device + batch = joint_pos.shape[0] + + # Precompute and cache column indices + global _body_obs_cache + if _body_obs_cache["device"] != device or _body_obs_cache["idx_t"] is None: + body_joint_indices = [ + 0, + 3, + 6, + 9, + 13, + 17, + 1, + 4, + 7, + 10, + 14, + 18, + 2, + 5, + 8, + 11, + 15, + 19, + 21, + 23, + 25, + 27, + 12, + 16, + 20, + 22, + 24, + 26, + 28, + ] + _body_obs_cache["idx_t"] = torch.tensor(body_joint_indices, dtype=torch.long, device=device) + _body_obs_cache["device"] = device + _body_obs_cache["batch"] = None # force re-init batch-shaped buffers + + idx_t = _body_obs_cache["idx_t"] + n = idx_t.numel() + + # Preallocate/reuse batch-shaped indices and output buffers + if _body_obs_cache["batch"] != batch or _body_obs_cache["idx_batch"] is None: + _body_obs_cache["idx_batch"] = idx_t.unsqueeze(0).expand(batch, n) + _body_obs_cache["pos_buf"] = torch.empty(batch, n, device=device, dtype=joint_pos.dtype) + _body_obs_cache["vel_buf"] = torch.empty(batch, n, device=device, dtype=joint_pos.dtype) + _body_obs_cache["torque_buf"] = torch.empty(batch, n, device=device, dtype=joint_pos.dtype) + _body_obs_cache["combined_buf"] = torch.empty(batch, n * 3, device=device, dtype=joint_pos.dtype) + _body_obs_cache["batch"] = batch + + idx_batch = _body_obs_cache["idx_batch"] + pos_buf = _body_obs_cache["pos_buf"] + vel_buf = _body_obs_cache["vel_buf"] + torque_buf = _body_obs_cache["torque_buf"] + combined_buf = _body_obs_cache["combined_buf"] + + # Fill buffers using gather(out=...) to avoid new tensor allocations + try: + torch.gather(joint_pos, 1, idx_batch, out=pos_buf) + torch.gather(joint_vel, 1, idx_batch, out=vel_buf) + torch.gather(joint_torque, 1, idx_batch, out=torque_buf) + except TypeError: + pos_buf.copy_(torch.gather(joint_pos, 1, idx_batch)) + vel_buf.copy_(torch.gather(joint_vel, 1, idx_batch)) + torque_buf.copy_(torch.gather(joint_torque, 1, idx_batch)) + + # Combine into a single buffer to avoid cat allocations + combined_buf[:, 0:n].copy_(pos_buf) + combined_buf[:, n : 2 * n].copy_(vel_buf) + combined_buf[:, 2 * n : 3 * n].copy_(torque_buf) + return combined_buf + + +# Observation cache: index tensors + preallocated output buffers (Dex3 hand joints) +_dex3_obs_cache = { + "device": None, + "batch": None, + "idx_t": None, + "idx_batch": None, + "pos_buf": None, +} + + +def get_robot_dex3_joint_states(env: ManagerBasedRLEnv) -> torch.Tensor: + """Return Dex3 joint positions [batch, 14].""" + joint_pos = wp.to_torch(env.scene["robot"].data.joint_pos) + device = joint_pos.device + batch = joint_pos.shape[0] + + global _dex3_obs_cache + if _dex3_obs_cache["device"] != device or _dex3_obs_cache["idx_t"] is None: + # Dex3 joint indices in the full robot joint vector (14 DOF) + dex3_joint_indices = [31, 37, 41, 30, 36, 29, 35, 34, 40, 42, 33, 39, 32, 38] + _dex3_obs_cache["idx_t"] = torch.tensor(dex3_joint_indices, dtype=torch.long, device=device) + _dex3_obs_cache["device"] = device + _dex3_obs_cache["batch"] = None + + idx_t = _dex3_obs_cache["idx_t"] + n = idx_t.numel() + + if _dex3_obs_cache["batch"] != batch or _dex3_obs_cache["idx_batch"] is None: + _dex3_obs_cache["idx_batch"] = idx_t.unsqueeze(0).expand(batch, n) + _dex3_obs_cache["pos_buf"] = torch.empty(batch, n, device=device, dtype=joint_pos.dtype) + _dex3_obs_cache["batch"] = batch + + idx_batch = _dex3_obs_cache["idx_batch"] + pos_buf = _dex3_obs_cache["pos_buf"] + + try: + torch.gather(joint_pos, 1, idx_batch, out=pos_buf) + except TypeError: + pos_buf.copy_(torch.gather(joint_pos, 1, idx_batch)) + + return pos_buf diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py new file mode 100644 index 000000000000..50ac38048715 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py @@ -0,0 +1,736 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import torch +import warp as wp + +from isaaclab.assets import RigidObject +from isaaclab.managers import SceneEntityCfg +from isaaclab.utils.math import quat_apply + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + +__all__ = [ + "update_task_stage", + "lift_trocars_reward", + "trocar_tip_alignment_reward", + "trocar_insertion_reward", + "trocar_placement_reward", +] + + +def get_task_stage(env: ManagerBasedRLEnv) -> torch.Tensor: + """Get or initialize task stage tracker for each environment. + + Stage 0: Initial state (need to lift) + Stage 1: Lifted (need to find hole - tip alignment) + Stage 2: Hole found (need to insert - push in) + Stage 3: Inserted (need to place) + Stage 4: Placed (task complete) + + Returns: + torch.Tensor: Current stage for each environment (num_envs,) + """ + if not hasattr(env, "_task_stage"): + env._task_stage = torch.zeros(env.num_envs, dtype=torch.long, device=env.device) + return env._task_stage + + +def should_print_debug(env: ManagerBasedRLEnv, print_interval: int = 50, print_log: bool = True) -> bool: + """Check if debug info should be printed based on episode step counter. + + Uses the environment's built-in episode_length_buf to track steps, + and ensures each step only prints once (first call). + + Args: + env: Environment instance + print_interval: Print every N steps + + Returns: + bool: True if should print (only on first call per step) + """ + # Hard gate: allow callers to disable all logs from this module. + if not print_log: + return False + + # Use environment's episode step counter (standard in Isaac Lab) + if not hasattr(env, "episode_length_buf"): + return False + + current_step = env.episode_length_buf[0].item() + + # Skip step 0 and non-interval steps + if current_step == 0 or current_step % print_interval != 0: + return False + + # Track last printed step to avoid duplicate prints in same step + if not hasattr(env, "_last_debug_print_step"): + env._last_debug_print_step = -1 + + # Only print once per step (on first function call) + if env._last_debug_print_step == current_step: + return False # Already printed this step + + # Mark this step as printed and return True + env._last_debug_print_step = current_step + return True + + +def update_task_stage( + env: ManagerBasedRLEnv, + asset_cfg1: SceneEntityCfg, + asset_cfg2: SceneEntityCfg, + table_height: float = 0.85483, + lift_threshold: float = 0.05, + tip_align_threshold: float = 0.015, + insertion_dist_threshold: float = 0.03, + insertion_angle_threshold: float = 0.15, + placement_x_min: float = -1.8, + placement_x_max: float = -1.4, + placement_y_min: float = 1.5, + placement_y_max: float = 1.8, + placement_z_min: float = 0.9, + print_log: bool = False, +) -> torch.Tensor: + """Update task stage based on current state. + + This function checks conditions and advances stages automatically. + Once a stage is completed, it never goes back. + """ + stage = get_task_stage(env) + + obj1: RigidObject = env.scene[asset_cfg1.name] + obj2: RigidObject = env.scene[asset_cfg2.name] + + pos1 = wp.to_torch(obj1.data.root_pos_w) + pos2 = wp.to_torch(obj2.data.root_pos_w) + quat1 = wp.to_torch(obj1.data.root_quat_w) + quat2 = wp.to_torch(obj2.data.root_quat_w) + + # Store old stage to detect changes (BEFORE any stage transitions) + old_stage = stage.clone() + + # Stage 0 -> 1: Check if lifted + target_z = table_height + lift_threshold + is_lifted_1 = pos1[:, 2] > target_z + is_lifted_2 = pos2[:, 2] > target_z + both_lifted = is_lifted_1 & is_lifted_2 + stage = torch.where((stage == 0) & both_lifted, torch.ones_like(stage), stage) + + # Stage 1 -> 2: Check if tips are aligned (hole found) + # Get tip positions + tip_pos1 = get_trocar_tip_position(env, asset_cfg1) + tip_pos2 = get_trocar_tip_position(env, asset_cfg2) + tip_dist = torch.norm(tip_pos1 - tip_pos2, dim=-1) + + # Tip alignment success + tip_aligned = tip_dist < tip_align_threshold + stage = torch.where((stage == 1) & tip_aligned, torch.full_like(stage, 2), stage) + + # Stage 2 -> 3: Check if inserted (parallel + center close) + # Get center distance + center_dist = torch.norm(pos1 - pos2, dim=-1) + + # Check alignment + target_axis1 = torch.tensor([0.0, 0.0, -1.0], device=env.device).repeat(env.num_envs, 1) + target_axis2 = torch.tensor([0.0, 0.0, -1.0], device=env.device).repeat(env.num_envs, 1) + axis1 = quat_apply(quat1, target_axis1) + axis2 = quat_apply(quat2, target_axis2) + dot_prod = torch.sum(axis1 * axis2, dim=-1) + abs_dot = torch.clamp(torch.abs(dot_prod), max=1.0) + angle = torch.acos(abs_dot) + + # Insertion success: parallel + center close + is_parallel = angle < insertion_angle_threshold + center_close = center_dist < insertion_dist_threshold + is_inserted = is_parallel & center_close + + stage = torch.where((stage == 2) & is_inserted, torch.full_like(stage, 3), stage) + + # Stage 3 -> 4: Check if placed in target zone + # Get environment origins to handle multi-env spatial offsets + env_origins = env.scene.env_origins # shape: (num_envs, 3) + + # Adjust target zone relative to each environment's origin + curr_x_min = env_origins[:, 0] + min(placement_x_min, placement_x_max) # (num_envs,) + curr_x_max = env_origins[:, 0] + max(placement_x_min, placement_x_max) + curr_y_min = env_origins[:, 1] + min(placement_y_min, placement_y_max) + curr_y_max = env_origins[:, 1] + max(placement_y_min, placement_y_max) + + in_zone_1 = ( + (pos1[:, 0] >= curr_x_min) + & (pos1[:, 0] <= curr_x_max) + & (pos1[:, 1] >= curr_y_min) + & (pos1[:, 1] <= curr_y_max) + & (pos1[:, 2] < placement_z_min) + ) + in_zone_2 = ( + (pos2[:, 0] >= curr_x_min) + & (pos2[:, 0] <= curr_x_max) + & (pos2[:, 1] >= curr_y_min) + & (pos2[:, 1] <= curr_y_max) + & (pos2[:, 2] < placement_z_min) + ) + both_in_zone = in_zone_1 & in_zone_2 + stage = torch.where((stage == 3) & both_in_zone, torch.full_like(stage, 4), stage) + + # Print stage transitions (AFTER all stage transitions - always print when stage changes) + if print_log and (stage != old_stage).any(): + for env_id in range(env.num_envs): + if stage[env_id] != old_stage[env_id]: + print(f"Env {env_id}: Stage {old_stage[env_id].item()} → {stage[env_id].item()}") + + env._task_stage = stage + return stage + + +def lift_trocars_reward( + env: ManagerBasedRLEnv, + table_height: float = 0.85483, + lift_threshold: float = 0.05, + asset_cfg1: SceneEntityCfg = SceneEntityCfg("trocar_1"), + asset_cfg2: SceneEntityCfg = SceneEntityCfg("trocar_2"), + tip_align_threshold: float = 0.015, + insertion_dist_threshold: float = 0.035, + insertion_angle_threshold: float = 0.17, + placement_x_min: float = -1.8, + placement_x_max: float = -1.4, + placement_y_min: float = 1.5, + placement_y_max: float = 1.8, + placement_z_min: float = 0.9, + use_sparse_reward: bool = True, + print_log: bool = False, +) -> torch.Tensor: + """Reward for lifting both trocars above the table. + + Only active in Stage 0. Once completed, this reward is locked at the achieved value. + + Args: + use_sparse_reward: If True, only give reward (1.0) when stage transitions from 0->1. + If False, give continuous reward based on current state. + print_log: If True, print debug information. + """ + # Update task stage first - check ALL stage transitions once per step + stage = update_task_stage( + env, + asset_cfg1, + asset_cfg2, + table_height, + lift_threshold, + tip_align_threshold, + insertion_dist_threshold, + insertion_angle_threshold, + placement_x_min, + placement_x_max, + placement_y_min, + placement_y_max, + placement_z_min, + print_log=print_log, + ) + + # Get the rigid objects from the scene + obj1: RigidObject = env.scene[asset_cfg1.name] + obj2: RigidObject = env.scene[asset_cfg2.name] + + # Get positions (num_envs, 3) + pos1 = wp.to_torch(obj1.data.root_pos_w) + pos2 = wp.to_torch(obj2.data.root_pos_w) + + target_z = table_height + lift_threshold + + # Check if lifted + is_lifted_1 = pos1[:, 2] > target_z + is_lifted_2 = pos2[:, 2] > target_z + both_lifted = is_lifted_1 & is_lifted_2 + + if use_sparse_reward: + # Sparse reward mode: give 1.0 ONLY when stage transitions from 0 to 1 + # Track previous stage + if not hasattr(env, "_prev_stage_lift"): + # Initialize prev_stage to current stage to avoid false positives on first call + env._prev_stage_lift = stage.clone() + + # Reward = 1.0 only on transition step (prev_stage=0, curr_stage=1) + stage_just_completed = (env._prev_stage_lift == 0) & (stage >= 1) + reward = torch.where( + stage_just_completed, + torch.ones(env.num_envs, device=env.device) / env.step_dt, + torch.zeros(env.num_envs, device=env.device), + ) + + # Update previous stage for next step + env._prev_stage_lift = stage.clone() + else: + # Dense reward mode: continuous reward with locking for continuity + # Initialize locked reward cache + if not hasattr(env, "_lift_reward_locked"): + env._lift_reward_locked = torch.zeros(env.num_envs, device=env.device) + + # Current reward value + current_reward = both_lifted.float() + + # Lock the reward when transitioning to stage 1 + env._lift_reward_locked = torch.where( + (stage >= 1) & (env._lift_reward_locked == 0), + current_reward, # Lock at current value when stage changes + env._lift_reward_locked, + ) + + # Stage 0: give reward based on current state + # Stage >= 1: return locked value (preserves continuity) + reward = torch.where(stage == 0, current_reward, env._lift_reward_locked) + + # Print debug info periodically (every 50 steps) + if should_print_debug(env, print_log=print_log): + mode_str = "Sparse" if use_sparse_reward else "Dense" + print( + f" Stage: {stage[0].item()}" + f" | Lift ({mode_str}): {reward[0].item():.2f}" + f" | z1: {pos1[0, 2]:.3f}" + f" | z2: {pos2[0, 2]:.3f}" + ) + + return reward + + +def get_trocar_tip_position( + env: ManagerBasedRLEnv, + asset_cfg: SceneEntityCfg = SceneEntityCfg("trocar_1"), +) -> torch.Tensor: + """Get trocar tip position (White_pos or Red_pos) in world coordinates. + + Calculates tip world position using trocar root's dynamic position and rotation, + plus the tip's relative offset. + + Args: + env: Environment instance + asset_cfg: Trocar asset configuration (trocar_1 or trocar_2) + + Returns: + torch.Tensor: Shape (num_envs, 3) - Position in world coordinates + """ + from pxr import Gf, Usd, UsdGeom + + import isaaclab.utils.math as math_utils + + # Cache the tip offset to avoid recalculating every step + cache_key = f"_tip_offset_{asset_cfg.name}" + if not hasattr(env, cache_key): + # Get tip's local offset relative to root (only calculate once, from USD) + # Note: Local offset is the same in all environments (same asset structure), so get from env_0 + stage = env.scene.stage + + if asset_cfg.name == "trocar_1": + tip_path = "/World/envs/env_0/trocar_1/Trocar002/White_pos" + root_path = "/World/envs/env_0/trocar_1" + elif asset_cfg.name == "trocar_2": + tip_path = "/World/envs/env_0/trocar_2/DisposableLaparoscopicPunctureDevice001/Red_pos" + root_path = "/World/envs/env_0/trocar_2" + else: + raise ValueError(f"Invalid asset configuration: {asset_cfg.name}") + + tip_prim = stage.GetPrimAtPath(tip_path) + root_prim = stage.GetPrimAtPath(root_path) + + if not tip_prim.IsValid(): + print(f"Warning: Tip prim not found at {tip_path}, using zero offset") + tip_offset_local = torch.zeros(3, dtype=torch.float32, device=env.device) + else: + tip_xform = UsdGeom.Xformable(tip_prim) + root_xform = UsdGeom.Xformable(root_prim) + + tip_world_transform = tip_xform.ComputeLocalToWorldTransform(Usd.TimeCode.Default()) + root_world_transform = root_xform.ComputeLocalToWorldTransform(Usd.TimeCode.Default()) + + tip_world_pos = tip_world_transform.ExtractTranslation() + root_world_pos = root_world_transform.ExtractTranslation() + + root_rotation_mat = root_world_transform.ExtractRotationMatrix() + root_rotation_quat = root_rotation_mat.ExtractRotation().GetQuat() + + tip_offset_world = Gf.Vec3d( + tip_world_pos[0] - root_world_pos[0], + tip_world_pos[1] - root_world_pos[1], + tip_world_pos[2] - root_world_pos[2], + ) + + # Convert world coordinate offset to root's local coordinate system + # Using inverse of root rotation: local_offset = root_quat^{-1} * world_offset + root_quat_inv = root_rotation_quat.GetInverse() + tip_offset_local_gf = root_quat_inv.Transform(tip_offset_world) + + tip_offset_local = torch.tensor( + [tip_offset_local_gf[0], tip_offset_local_gf[1], tip_offset_local_gf[2]], + dtype=torch.float32, + device=env.device, + ) + + print(f"Cached tip offset for {asset_cfg.name}: {tip_offset_local}") + + # Cache the offset + setattr(env, cache_key, tip_offset_local) + + tip_offset_local = getattr(env, cache_key) + + obj: RigidObject = env.scene[asset_cfg.name] + root_pos_w = wp.to_torch(obj.data.root_pos_w) # Shape: (num_envs, 3) + root_quat_w = wp.to_torch(obj.data.root_quat_w) # Shape: (num_envs, 4) XYZW + + tip_offset_local_batch = tip_offset_local.unsqueeze(0).repeat(env.num_envs, 1) + + tip_offset_world = math_utils.quat_apply(root_quat_w, tip_offset_local_batch) + tip_pos_world = root_pos_w + tip_offset_world + + return tip_pos_world # Shape: (num_envs, 3) + + +def trocar_tip_alignment_reward( + env: ManagerBasedRLEnv, + tip_dist_std: float = 0.02, # Std for tip distance reward + asset_cfg1: SceneEntityCfg = SceneEntityCfg("trocar_1"), + asset_cfg2: SceneEntityCfg = SceneEntityCfg("trocar_2"), + use_sparse_reward: bool = True, + print_log: bool = False, +) -> torch.Tensor: + """Reward for aligning trocar tips (Stage 1: Finding the hole). + + Reward based on tip distance - encourages bringing tips close together. + + Only active in Stage 1. Once completed (stage >= 2), this reward is locked at the achieved value. + + Args: + env: Environment instance + tip_dist_std: Standard deviation for tip distance reward shaping + asset_cfg1: Configuration for trocar 1 + asset_cfg2: Configuration for trocar 2 + use_sparse_reward: If True, only give reward (1.0) when stage >= 2. + If False, give continuous reward based on tip distance. + print_log: If True, print debug information. + + Returns: + torch.Tensor: Reward tensor (num_envs,) + """ + # Read current stage + stage = get_task_stage(env) + + # Get tip positions + tip_pos1 = get_trocar_tip_position(env, asset_cfg1) + tip_pos2 = get_trocar_tip_position(env, asset_cfg2) + + # Calculate tip distance + tip_dist = torch.norm(tip_pos1 - tip_pos2, dim=-1) # (num_envs,) + + if use_sparse_reward: + # Sparse reward mode: give 1.0 ONLY when stage transitions from 1 to 2 + # Track previous stage + if not hasattr(env, "_prev_stage_tip"): + # Initialize prev_stage to current stage to avoid false positives on first call + env._prev_stage_tip = stage.clone() + + # Reward = 1.0 only on transition step (prev_stage=1, curr_stage=2) + stage_just_completed = (env._prev_stage_tip == 1) & (stage >= 2) + reward = torch.where( + stage_just_completed, + torch.ones(env.num_envs, device=env.device) / env.step_dt, + torch.zeros(env.num_envs, device=env.device), + ) + + # Update previous stage for next step + env._prev_stage_tip = stage.clone() + else: + # Dense reward mode: continuous reward with locking for continuity + # Reward: exponential decay based on tip distance + tip_reward = torch.exp(-torch.square(tip_dist) / (2 * tip_dist_std**2)) + + # Initialize locked reward cache + if not hasattr(env, "_tip_reward_locked"): + env._tip_reward_locked = torch.zeros(env.num_envs, device=env.device) + + # Lock the reward when transitioning to stage 2 + env._tip_reward_locked = torch.where( + (stage >= 2) & (env._tip_reward_locked == 0), + tip_reward, # Lock at current value when stage changes + env._tip_reward_locked, + ) + + # Stage 0: no reward (not lifted yet) + # Stage 1: give reward based on tip distance + # Stage >= 2: return locked value (preserves continuity) + reward = torch.where( + stage < 1, + torch.zeros(env.num_envs, device=env.device), + torch.where(stage == 1, tip_reward, env._tip_reward_locked), + ) + + # Debug info + if should_print_debug(env, print_log=print_log) and stage[0].item() == 1: + mode_str = "Sparse" if use_sparse_reward else "Dense" + print( + f" └─ Stage 1 (Find Hole, {mode_str}):" + f" tip_pos_1=({tip_pos1[0, 0]:.3f}, {tip_pos1[0, 1]:.3f}, {tip_pos1[0, 2]:.3f})" + f" | tip_pos_2=({tip_pos2[0, 0]:.3f}, {tip_pos2[0, 1]:.3f}, {tip_pos2[0, 2]:.3f})" + f" | tip_d={tip_dist[0].item():.4f}" + f" | reward={reward[0].item():.3f}" + ) + + return reward + + +def trocar_insertion_reward( + env: ManagerBasedRLEnv, + angle_std: float = 0.2, # Std for angle alignment reward + angle_threshold: float = 0.15, # Tolerance for parallelism (radians) + center_dist_std: float = 0.05, # Std for center distance reward + asset_cfg1: SceneEntityCfg = SceneEntityCfg("trocar_1"), + asset_cfg2: SceneEntityCfg = SceneEntityCfg("trocar_2"), + use_sparse_reward: bool = True, + print_log: bool = False, +) -> torch.Tensor: + """Reward for inserting trocar_2 into trocar_1 (Stage 2: Pushing in). + + Reward based on: + 1. Orientation alignment (parallelism) + 2. Center distance (pushing in) + + Only active in Stage 2. Once completed (stage >= 3), this reward is locked at the achieved value. + + Args: + env: Environment instance + angle_std: Standard deviation for angle reward shaping + angle_threshold: Angle threshold for parallelism (radians) + center_dist_std: Standard deviation for center distance reward shaping + asset_cfg1: Configuration for trocar 1 + asset_cfg2: Configuration for trocar 2 + use_sparse_reward: If True, only give reward (1.0) when stage >= 3. + If False (default), give continuous reward based on alignment and distance. + print_log: If True, print debug information. + Returns: + torch.Tensor: Reward tensor (num_envs,) + """ + # Read current stage + stage = get_task_stage(env) + + obj1: RigidObject = env.scene[asset_cfg1.name] + obj2: RigidObject = env.scene[asset_cfg2.name] + + # Positions and Rotations + pos1 = wp.to_torch(obj1.data.root_pos_w) + quat1 = wp.to_torch(obj1.data.root_quat_w) + pos2 = wp.to_torch(obj2.data.root_pos_w) + quat2 = wp.to_torch(obj2.data.root_quat_w) + + # Calculate center distance + center_dist = torch.norm(pos1 - pos2, dim=-1) # (num_envs,) + + # Calculate alignment (parallelism) + target_axis1 = torch.tensor([0.0, 0.0, -1.0], device=env.device).repeat(env.num_envs, 1) + target_axis2 = torch.tensor([0.0, 0.0, -1.0], device=env.device).repeat(env.num_envs, 1) + + axis1 = quat_apply(quat1, target_axis1) + axis2 = quat_apply(quat2, target_axis2) + + dot_prod = torch.sum(axis1 * axis2, dim=-1) + abs_dot = torch.clamp(torch.abs(dot_prod), max=1.0) + angle = torch.acos(abs_dot) + + is_parallel = angle < angle_threshold + + if use_sparse_reward: + # Sparse reward mode: give 1.0 ONLY when stage transitions from 2 to 3 + # Track previous stage + if not hasattr(env, "_prev_stage_insert"): + # Initialize prev_stage to current stage to avoid false positives on first call + env._prev_stage_insert = stage.clone() + + # Reward = 1.0 only on transition step (prev_stage=2, curr_stage=3) + stage_just_completed = (env._prev_stage_insert == 2) & (stage >= 3) + reward = torch.where( + stage_just_completed, + torch.ones(env.num_envs, device=env.device) / env.step_dt, + torch.zeros(env.num_envs, device=env.device), + ) + + # Update previous stage for next step + env._prev_stage_insert = stage.clone() + else: + # Dense reward mode: continuous reward with locking for continuity + # Reward component 1: Alignment (parallelism) + excess_angle = torch.clamp(angle - angle_threshold, min=0.0) + align_reward = torch.exp(-torch.square(excess_angle) / (2 * angle_std**2)) + + # Reward component 2: Center distance (pushing in) + # Only reward center distance if already parallel + center_reward = torch.exp(-torch.square(center_dist) / (2 * center_dist_std**2)) + center_reward = torch.where(is_parallel, center_reward, torch.zeros_like(center_reward)) + + # Combined reward: alignment * center_distance + insertion_reward = align_reward * center_reward + + # Initialize locked reward cache + if not hasattr(env, "_insertion_reward_locked"): + env._insertion_reward_locked = torch.zeros(env.num_envs, device=env.device) + + # Lock the reward when transitioning to stage 3 + env._insertion_reward_locked = torch.where( + (stage >= 3) & (env._insertion_reward_locked == 0), + insertion_reward, # Lock at current value when stage changes + env._insertion_reward_locked, + ) + + # Stage < 2: no reward (not ready yet) + # Stage 2: give reward based on current state + # Stage >= 3: return locked value (preserves continuity) + reward = torch.where( + stage < 2, + torch.zeros(env.num_envs, device=env.device), + torch.where(stage == 2, insertion_reward, env._insertion_reward_locked), + ) + + # Debug info + if should_print_debug(env, print_log=print_log) and stage[0].item() == 2: + mode_str = "Sparse" if use_sparse_reward else "Dense" + print( + f" └─ Stage 2 (Push In, {mode_str}): angle={angle[0].item():.3f} | " + f"center_d={center_dist[0].item():.4f} | " + f"is_parallel={is_parallel.item()} | reward={reward[0].item():.3f}" + ) + + return reward + + +def trocar_placement_reward( + env: ManagerBasedRLEnv, + x_min: float = -1.8, + x_max: float = -1.4, + y_min: float = 1.5, + y_max: float = 1.8, + z_min: float = 0.9, + asset_cfg1: SceneEntityCfg = SceneEntityCfg("trocar_1"), + asset_cfg2: SceneEntityCfg = SceneEntityCfg("trocar_2"), + use_sparse_reward: bool = True, + print_log: bool = False, +) -> torch.Tensor: + """Reward for placing both trocars in the target tray region (Stage 3). + + Only active in Stage 3. Once completed (stage >= 4), this reward is locked at the achieved value. + + Args: + env: Environment instance + x_min, x_max: X bounds of target zone (relative to env origin) + y_min, y_max: Y bounds of target zone (relative to env origin) + z_min: Z threshold (below this is considered placed) + asset_cfg1: Configuration for trocar 1 + asset_cfg2: Configuration for trocar 2 + use_sparse_reward: If True, only give reward (1.0) when stage >= 4. + If False (default), give continuous reward based on placement status. + print_log: If True, print debug information. + + Returns: + torch.Tensor: Reward tensor (num_envs,) + """ + # Read current stage + stage = get_task_stage(env) + + # Get rigid objects + obj1: RigidObject = env.scene[asset_cfg1.name] + obj2: RigidObject = env.scene[asset_cfg2.name] + + # Get root positions (num_envs, 3) + pos1 = wp.to_torch(obj1.data.root_pos_w) + pos2 = wp.to_torch(obj2.data.root_pos_w) + + # Get environment origins to handle multi-env spatial offsets + env_origins = env.scene.env_origins # shape: (num_envs, 3) + + # Adjust target zone relative to each environment's origin + curr_x_min = env_origins[:, 0] + min(x_min, x_max) # shape: (num_envs,) + curr_x_max = env_origins[:, 0] + max(x_min, x_max) + curr_y_min = env_origins[:, 1] + min(y_min, y_max) + curr_y_max = env_origins[:, 1] + max(y_min, y_max) + + # Check bounds for object 1 + in_x_1 = (pos1[:, 0] >= curr_x_min) & (pos1[:, 0] <= curr_x_max) + in_y_1 = (pos1[:, 1] >= curr_y_min) & (pos1[:, 1] <= curr_y_max) + in_z_1 = pos1[:, 2] < z_min + in_zone_1 = in_x_1 & in_y_1 & in_z_1 + + # Check bounds for object 2 + in_x_2 = (pos2[:, 0] >= curr_x_min) & (pos2[:, 0] <= curr_x_max) + in_y_2 = (pos2[:, 1] >= curr_y_min) & (pos2[:, 1] <= curr_y_max) + in_z_2 = pos2[:, 2] < z_min + in_zone_2 = in_x_2 & in_y_2 & in_z_2 + + both_in_zone = in_zone_1 & in_zone_2 + + if use_sparse_reward: + # Sparse reward mode: give 1.0 ONLY when stage transitions from 3 to 4 + # Track previous stage + if not hasattr(env, "_prev_stage_place"): + # Initialize prev_stage to current stage to avoid false positives on first call + env._prev_stage_place = stage.clone() + + # Reward = 1.0 only on transition step (prev_stage=3, curr_stage=4) + stage_just_completed = (env._prev_stage_place == 3) & (stage >= 4) + reward = torch.where( + stage_just_completed, + torch.ones(env.num_envs, device=env.device) / env.step_dt, + torch.zeros(env.num_envs, device=env.device), + ) + + # Update previous stage for next step + env._prev_stage_place = stage.clone() + else: + # Dense reward mode: continuous reward with locking for continuity + placement_reward = both_in_zone.float() + + # Initialize locked reward cache + if not hasattr(env, "_placement_reward_locked"): + env._placement_reward_locked = torch.zeros(env.num_envs, device=env.device) + + # Lock the reward when transitioning to stage 4 + env._placement_reward_locked = torch.where( + (stage >= 4) & (env._placement_reward_locked == 0), + placement_reward, # Lock at current value when stage changes + env._placement_reward_locked, + ) + + # Stage < 3: no reward (not inserted yet) + # Stage 3: give reward based on current state + # Stage >= 4: return locked value (preserves continuity) + reward = torch.where( + stage < 3, + torch.zeros(env.num_envs, device=env.device), + torch.where(stage == 3, placement_reward, env._placement_reward_locked), + ) + + # Debug info + if should_print_debug(env, print_log=print_log) and stage[0].item() == 3: + mode_str = "Sparse" if use_sparse_reward else "Dense" + print( + f" └─ Stage 3 (Placement, {mode_str}): in_zone={both_in_zone[0].item()} | " + f"z1={pos1[0, 2]:.3f} | z2={pos2[0, 2]:.3f}" + ) + + return reward diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py new file mode 100644 index 000000000000..bf134ea10ab2 --- /dev/null +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py @@ -0,0 +1,94 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import torch +import warp as wp + +from isaaclab.assets import RigidObject +from isaaclab.managers import SceneEntityCfg + +from .rewards import get_task_stage + +if TYPE_CHECKING: + from isaaclab.envs import ManagerBasedRLEnv + + +def object_drop_termination( + env: ManagerBasedRLEnv, + drop_height_threshold: float = 0.5, + asset_cfg1: SceneEntityCfg = SceneEntityCfg("trocar_1"), + asset_cfg2: SceneEntityCfg = SceneEntityCfg("trocar_2"), + print_log: bool = False, +) -> torch.Tensor: + """Termination function that triggers when objects drop below threshold. + + This can be used as an alternative to auto-reset, marking the episode as terminated + so the training framework handles the reset. + + Args: + env: The environment instance + drop_height_threshold: Height below which objects are considered dropped + asset_cfg1: Configuration for first trocar + asset_cfg2: Configuration for second trocar + print_log: If True, print debug information. + Returns: + Boolean tensor indicating which environments should terminate due to drops + """ + # Get rigid objects + obj1: RigidObject = env.scene[asset_cfg1.name] + obj2: RigidObject = env.scene[asset_cfg2.name] + + # Get positions + pos1 = wp.to_torch(obj1.data.root_pos_w) + pos2 = wp.to_torch(obj2.data.root_pos_w) + + # Check if either object has dropped + dropped_1 = pos1[:, 2] < drop_height_threshold + dropped_2 = pos2[:, 2] < drop_height_threshold + + dropped = dropped_1 | dropped_2 + + if print_log and dropped.any(): + print(f"Drop termination triggered for {dropped.sum().item()} environment(s)") + + return dropped + + +def task_success_termination( + env: ManagerBasedRLEnv, + success_stage: int = 4, + print_log: bool = False, +) -> torch.Tensor: + """Termination condition: task is complete when stage reaches 4. + + Returns: + torch.Tensor: Boolean tensor indicating which environments should terminate (num_envs,) + """ + stage = get_task_stage(env) + task_complete = stage >= success_stage + + if print_log and task_complete.any(): + print(f"Task completed in {task_complete.sum().item()} environment(s)!") + + return task_complete From 983b43ff1c59ced93d85cf93c9b867e098b26e52 Mon Sep 17 00:00:00 2001 From: Mingxue Gu Date: Tue, 24 Mar 2026 09:49:07 +0000 Subject: [PATCH 2/7] Update assets path --- .../assemble_trocar/config/robot_config.py | 4 +++- .../assemble_trocar/g129_dex3_env_cfg.py | 14 ++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py index 6e8678048f20..06e8ccaeaac5 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py @@ -35,6 +35,8 @@ from isaaclab.assets import ArticulationCfg from isaaclab.utils import configclass +HEALTHCARE_S3 = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/Healthcare/0.5.0/132c82d" + # Default joint positions for the supported setup (G1 29DOF + Dex3). DEFAULT_JOINT_POS: dict[str, float] = { # legs @@ -90,7 +92,7 @@ G129_CFG_WITH_DEX3_BASE_FIX = ArticulationCfg( spawn=sim_utils.UsdFileCfg( - usd_path="/mnt/Data/lw_v3/robots/g1_29dof_with_dex3_base_fix.usd", + usd_path=f"{HEALTHCARE_S3}/Robots/UnitreeG1/g1_29dof_with_dex3_base_fix/g1_29dof_with_dex3_base_fix.usd", activate_contact_sensors=True, rigid_props=sim_utils.RigidBodyPropertiesCfg( disable_gravity=False, diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py index 0faf9da85ebc..6db79038b2a9 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py @@ -90,10 +90,8 @@ "right_elbow_joint": -0.3, } -# FIXME(mingxinz): revisit the USD_ROOT -USD_ROOT = ( - "https://isaac-dev.ov.nvidia.com/omni/web3/omniverse://isaac-dev.ov.nvidia.com/Library/IsaacHealthcare/0.5.0/Props/" -) +HEALTHCARE_S3 = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/Healthcare/0.5.0/132c82d" +USD_ROOT = f"{HEALTHCARE_S3}/Props/LightWheel" @configclass @@ -112,14 +110,14 @@ class AssembleTrocarSceneCfg(InteractiveSceneCfg): scene = AssetBaseCfg( prim_path="/World/envs/env_.*/Scene", spawn=UsdFileCfg( - usd_path=f"{USD_ROOT}/LightWheel/scene03.usd", + usd_path=f"{USD_ROOT}/scene03.usd", ), ) trocar_1 = RigidObjectCfg( prim_path="/World/envs/env_.*/trocar_1", spawn=UsdFileCfg( - usd_path=f"{USD_ROOT}/LightWheel/Assets/Trocar002/Trocar002-xform-wo.usd", + usd_path=f"{USD_ROOT}/Assets/Trocar002/Trocar002-xform-wo.usd", collision_props=sim_utils.CollisionPropertiesCfg( collision_enabled=True, contact_offset=0.001, @@ -136,7 +134,7 @@ class AssembleTrocarSceneCfg(InteractiveSceneCfg): prim_path="/World/envs/env_.*/trocar_2", spawn=UsdFileCfg( usd_path=( - f"{USD_ROOT}/LightWheel/Assets/" + f"{USD_ROOT}/Assets/" "DisposableLaparoscopicPunctureDevice001/" "DisposableLaparoscopicPunctureDevice005-xform.usd" ), @@ -152,7 +150,7 @@ class AssembleTrocarSceneCfg(InteractiveSceneCfg): tray = ArticulationCfg( prim_path="/World/envs/env_.*/surgical_tray", spawn=UsdFileCfg( - usd_path=f"{USD_ROOT}/LightWheel/Assets/SurgicalTray001/SurgicalTray001.usd", + usd_path=f"{USD_ROOT}/Assets/SurgicalTray001/SurgicalTray001.usd", ), init_state=ArticulationCfg.InitialStateCfg(pos=[-1.54919, 2.03365, 0.84554], rot=[0.0, 0.0, -0.70711, 0.70711]), actuators={}, # Empty dict for passive articulation (no motors) From b03d761df92c44b49fbea94c3cdcb71367b664ae Mon Sep 17 00:00:00 2001 From: Mingxue Gu Date: Mon, 30 Mar 2026 06:26:27 +0000 Subject: [PATCH 3/7] Fix format and headers --- .../isaaclab_contrib/rl/rlinf/extension.py | 24 +++++++------------ .../manipulation/assemble_trocar/__init__.py | 17 ++++--------- .../assemble_trocar/config/__init__.py | 15 ------------ .../assemble_trocar/config/camera_config.py | 15 ------------ .../assemble_trocar/config/gr00t_config.py | 4 ---- .../isaaclab_ppo_gr00t_assemble_trocar.yaml | 4 ++-- .../assemble_trocar/config/robot_config.py | 15 ------------ .../assemble_trocar/g129_dex3_env_cfg.py | 17 +------------ .../assemble_trocar/mdp/__init__.py | 15 ------------ .../assemble_trocar/mdp/events.py | 15 ------------ .../assemble_trocar/mdp/observations.py | 14 ----------- .../assemble_trocar/mdp/rewards.py | 15 ------------ .../assemble_trocar/mdp/terminations.py | 15 ------------ 13 files changed, 16 insertions(+), 169 deletions(-) diff --git a/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py b/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py index 83c05fe1b3e3..2c3b70428b13 100644 --- a/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py +++ b/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py @@ -470,24 +470,18 @@ def make_env_isaaclab() -> tuple: env = gym.make(self.isaaclab_env_id, cfg=isaac_env_cfg, render_mode="rgb_array").unwrapped _original_reset = env.reset - _n_warmup = max(getattr(env.cfg, "num_rerenders_on_reset", 0), 1) + + import omni.kit.app + + _app = omni.kit.app.get_app() def _patched_reset(*args, **kwargs): obs, extras = _original_reset(*args, **kwargs) - try: - import isaaclab_physx.renderers.isaac_rtx_renderer_utils as _rtx_utils - - import omni.kit.app - - _app = omni.kit.app.get_app() - for _ in range(_n_warmup): - _rtx_utils._last_render_update_key = (0, -1) - env.sim.set_setting("/app/player/playSimulations", False) - _app.update() - env.sim.set_setting("/app/player/playSimulations", True) - env.scene.update(dt=0) - except ImportError: - pass + env.sim.set_setting("/app/player/playSimulations", False) + _app.update() + env.sim.set_setting("/app/player/playSimulations", True) + for sensor in env.scene.sensors.values(): + sensor.update(dt=0.0, force_recompute=True) obs = env.observation_manager.compute(update_history=True) env.obs_buf = obs return obs, extras diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py index 7fb2ef2f7fe6..5c1f1f496b15 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py @@ -3,42 +3,33 @@ # # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2022-2026, The Isaac Lab Project Developers. -# All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause - """Configuration for Install Trocar task with G129 + Dex3 robot. This module registers the Install Trocar task in IsaacLab's gymnasium registry, allowing it to be discovered and used through IsaacLab's standard task interfaces. - -The environment configuration is imported from RLinf's task definitions to avoid -code duplication while enabling IsaacLab-native task discovery. """ import gymnasium as gym -from . import g129_dex3_env_cfg - ## # Register Gym environments. ## gym.register( - id="Isaac-Assemble-Trocar-G129-Dex3-RLinf-v0", + id="Isaac-Assemble-Trocar-G129-Dex3-v0", entry_point="isaaclab.envs:ManagerBasedRLEnv", kwargs={ - "env_cfg_entry_point": g129_dex3_env_cfg.G1AssembleTrocarEnvCfg, + "env_cfg_entry_point": f"{__name__}.g129_dex3_env_cfg:G1AssembleTrocarEnvCfg", }, disable_env_checker=True, ) gym.register( - id="Isaac-Assemble-Trocar-G129-Dex3-RLinf-Eval-v0", + id="Isaac-Assemble-Trocar-G129-Dex3-Eval-v0", entry_point="isaaclab.envs:ManagerBasedRLEnv", kwargs={ - "env_cfg_entry_point": g129_dex3_env_cfg.G1AssembleTrocarEvalEnvCfg, + "env_cfg_entry_point": f"{__name__}.g129_dex3_env_cfg:G1AssembleTrocarEvalEnvCfg", }, disable_env_checker=True, ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py index 4b621d481954..43eb229b697d 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py @@ -3,21 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - from .camera_config import CameraBaseCfg, CameraPresets from .robot_config import G1RobotPresets diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py index 4e1b78a85736..a93379945944 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py @@ -3,21 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """ public camera configuration include the basic configuration for different types of cameras, support scene-specific parameter customization diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/gr00t_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/gr00t_config.py index d8e670bdacbb..540b0edbc3a0 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/gr00t_config.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/gr00t_config.py @@ -3,10 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# Copyright (c) 2022-2026, The Isaac Lab Project Developers. -# All rights reserved. -# SPDX-License-Identifier: BSD-3-Clause - """GR00T data configuration for IsaacLab tasks. This module defines customizable GR00T data configurations for different diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/isaaclab_ppo_gr00t_assemble_trocar.yaml b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/isaaclab_ppo_gr00t_assemble_trocar.yaml index 5b060aa4220c..b130a12a8a53 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/isaaclab_ppo_gr00t_assemble_trocar.yaml +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/isaaclab_ppo_gr00t_assemble_trocar.yaml @@ -111,7 +111,7 @@ env: info_on_video: True video_base_dir: ${runner.logger.log_path}/video/train init_params: - id: "Isaac-Assemble-Trocar-G129-Dex3-RLinf-v0" + id: "Isaac-Assemble-Trocar-G129-Dex3-v0" num_envs: null max_episode_steps: ${env.train.max_episode_steps} task_description: "assemble trocar from tray" @@ -187,7 +187,7 @@ env: info_on_video: True video_base_dir: ${runner.logger.log_path}/video/eval init_params: - id: "Isaac-Assemble-Trocar-G129-Dex3-RLinf-Eval-v0" + id: "Isaac-Assemble-Trocar-G129-Dex3-Eval-v0" num_envs: null max_episode_steps: ${env.eval.max_episode_steps} task_description: "install trocar from box" diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py index 06e8ccaeaac5..dd820a675980 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py @@ -3,21 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """Robot configuration for the `install_trocar` task. This file is intentionally **minimal**: diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py index 6db79038b2a9..c77bea7f2e94 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py @@ -3,21 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - from isaaclab_physx.physics import PhysxCfg import isaaclab.envs.mdp as base_mdp @@ -380,7 +365,7 @@ class G1AssembleTrocarEnvCfg(ManagerBasedRLEnvCfg): actions: ActionsCfg = ActionsCfg() # MDP settings terminations: TerminationsCfg = TerminationsCfg() - events = EventCfg() + events: EventCfg = EventCfg() commands = None rewards: RewardsCfg = RewardsCfg() curriculum = None diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py index f2ecc6014215..4de5284dfe23 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py @@ -3,21 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """MDP utilities for the assemble_trocar task.""" from isaaclab.envs.mdp import JointPositionActionCfg, time_out diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py index 6462777d480e..1e66e69b4c99 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py @@ -3,21 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """Custom event functions for pick place surgical environment.""" from __future__ import annotations diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py index b3cd7917df43..c58a4553a44d 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py @@ -3,20 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. """ G1 29DOF (body) + Dex3 joint state helpers for the assemble_trocar task. diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py index 50ac38048715..f635c74a1309 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py @@ -3,21 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - from __future__ import annotations from typing import TYPE_CHECKING diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py index bf134ea10ab2..8c9b18765847 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py @@ -3,21 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - from __future__ import annotations from typing import TYPE_CHECKING From d78227d9e227d4877b56b8a95b5fc00bd5ab739c Mon Sep 17 00:00:00 2001 From: mingxueg Date: Wed, 6 May 2026 10:35:25 +0000 Subject: [PATCH 4/7] refactor robot config, migrate to .torch API, remove _patch_reset , change to Cameracfg, and restructure task registration --- .../isaaclab_assets/robots/unitree.py | 202 ++++++++++++++- .../isaaclab_contrib/rl/rlinf/extension.py | 32 +-- .../manipulation/assemble_trocar/__init__.py | 31 +-- .../assemble_trocar/config/__init__.py | 4 +- .../assemble_trocar/config/camera_config.py | 6 +- .../assemble_trocar/config/robot_config.py | 239 +++--------------- .../assemble_trocar/g129_dex3_env_cfg.py | 2 + .../assemble_trocar/mdp/events.py | 13 +- .../assemble_trocar/mdp/observations.py | 76 ++---- .../assemble_trocar/mdp/rewards.py | 33 +-- .../assemble_trocar/mdp/terminations.py | 6 +- 11 files changed, 300 insertions(+), 344 deletions(-) diff --git a/source/isaaclab_assets/isaaclab_assets/robots/unitree.py b/source/isaaclab_assets/isaaclab_assets/robots/unitree.py index 7a02c6eff294..8e4f692ca6df 100644 --- a/source/isaaclab_assets/isaaclab_assets/robots/unitree.py +++ b/source/isaaclab_assets/isaaclab_assets/robots/unitree.py @@ -21,10 +21,12 @@ """ import isaaclab.sim as sim_utils -from isaaclab.actuators import ActuatorNetMLPCfg, DCMotorCfg, ImplicitActuatorCfg +from isaaclab.actuators import ActuatorNetMLPCfg, DCMotorCfg, IdealPDActuatorCfg, ImplicitActuatorCfg from isaaclab.assets.articulation import ArticulationCfg from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR, ISAACLAB_NUCLEUS_DIR +HEALTHCARE_S3 = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/Healthcare/0.5.0/132c82d" + ## # Configuration - Actuators. ## @@ -609,3 +611,201 @@ damping=0.2, armature=0.001, ) + + +G129_CFG_WITH_DEX3_BASE_FIX = ArticulationCfg( + spawn=sim_utils.UsdFileCfg( + usd_path=f"{HEALTHCARE_S3}/Robots/UnitreeG1/g1_29dof_with_dex3_base_fix/g1_29dof_with_dex3_base_fix.usd", + activate_contact_sensors=False, + rigid_props=sim_utils.RigidBodyPropertiesCfg( + disable_gravity=False, + retain_accelerations=False, + linear_damping=0.0, + angular_damping=0.0, + max_linear_velocity=1000.0, + max_angular_velocity=1000.0, + max_depenetration_velocity=1.0, + solver_position_iteration_count=4, + solver_velocity_iteration_count=0, + ), + articulation_props=sim_utils.ArticulationRootPropertiesCfg( + enabled_self_collisions=False, solver_position_iteration_count=4, solver_velocity_iteration_count=0 + ), + ), + prim_path="/World/envs/env_.*/Robot", + init_state=ArticulationCfg.InitialStateCfg( + pos=(0.0, 0.0, 0.75), + joint_pos={ + "left_hip_yaw_joint": 0.0, + "left_hip_roll_joint": 0.0, + "left_hip_pitch_joint": -0.05, + "left_knee_joint": 0.2, + "left_ankle_pitch_joint": -0.15, + "left_ankle_roll_joint": 0.0, + "right_hip_yaw_joint": 0.0, + "right_hip_roll_joint": 0.0, + "right_hip_pitch_joint": -0.05, + "right_knee_joint": 0.2, + "right_ankle_pitch_joint": -0.15, + "right_ankle_roll_joint": 0.0, + "waist_yaw_joint": 0.0, + "waist_roll_joint": 0.0, + "waist_pitch_joint": 0.0, + "left_shoulder_pitch_joint": 0.0, + "left_shoulder_roll_joint": 0.0, + "left_shoulder_yaw_joint": 0.0, + "left_elbow_joint": -0.3, + "left_wrist_roll_joint": 0.0, + "left_wrist_pitch_joint": 0.0, + "left_wrist_yaw_joint": 0.0, + "right_shoulder_pitch_joint": 0.0, + "right_shoulder_roll_joint": 0.0, + "right_shoulder_yaw_joint": 0.0, + "right_elbow_joint": -0.3, + "right_wrist_roll_joint": 0.0, + "right_wrist_pitch_joint": 0.0, + "right_wrist_yaw_joint": 0.0, + "left_hand_index_0_joint": 0.0, + "left_hand_middle_0_joint": 0.0, + "left_hand_thumb_0_joint": 0.0, + "left_hand_index_1_joint": 0.0, + "left_hand_middle_1_joint": 0.0, + "left_hand_thumb_1_joint": 0.0, + "left_hand_thumb_2_joint": 0.0, + "right_hand_index_0_joint": 0.0, + "right_hand_middle_0_joint": 0.0, + "right_hand_thumb_0_joint": 0.0, + "right_hand_index_1_joint": 0.0, + "right_hand_middle_1_joint": 0.0, + "right_hand_thumb_1_joint": 0.0, + "right_hand_thumb_2_joint": 0.0, + }, + joint_vel={".*": 0.0}, + ), + soft_joint_pos_limit_factor=0.9, + actuators={ + "legs": IdealPDActuatorCfg( + joint_names_expr=[ + ".*_hip_yaw_joint", + ".*_hip_roll_joint", + ".*_hip_pitch_joint", + ".*_knee_joint", + ], + effort_limit={ + ".*_hip_yaw_joint": 88.0, + ".*_hip_roll_joint": 88.0, + ".*_hip_pitch_joint": 88.0, + ".*_knee_joint": 139.0, + }, + velocity_limit={ + ".*_hip_yaw_joint": 32.0, + ".*_hip_roll_joint": 32.0, + ".*_hip_pitch_joint": 32.0, + ".*_knee_joint": 20.0, + }, + stiffness={ + ".*_hip_yaw_joint": 150.0, + ".*_hip_roll_joint": 150.0, + ".*_hip_pitch_joint": 150.0, + ".*_knee_joint": 300.0, + }, + damping={ + ".*_hip_yaw_joint": 2.0, + ".*_hip_roll_joint": 2.0, + ".*_hip_pitch_joint": 2.0, + ".*_knee_joint": 4.0, + }, + armature={ + ".*_hip_.*": 0.03, + ".*_knee_joint": 0.03, + }, + ), + "feet": IdealPDActuatorCfg( + joint_names_expr=[".*_ankle_pitch_joint", ".*_ankle_roll_joint"], + stiffness={ + ".*_ankle_pitch_joint": 40.0, + ".*_ankle_roll_joint": 40.0, + }, + damping={ + ".*_ankle_pitch_joint": 2, + ".*_ankle_roll_joint": 2, + }, + effort_limit={ + ".*_ankle_pitch_joint": 50.0, + ".*_ankle_roll_joint": 50.0, + }, + velocity_limit={ + ".*_ankle_pitch_joint": 37.0, + ".*_ankle_roll_joint": 37.0, + }, + armature=0.03, + friction=0.03, + ), + "waist": ImplicitActuatorCfg( + joint_names_expr=["waist_yaw_joint", "waist_roll_joint", "waist_pitch_joint"], + effort_limit=1000.0, + velocity_limit=0.0, + stiffness={"waist_yaw_joint": 10000.0, "waist_roll_joint": 10000.0, "waist_pitch_joint": 10000.0}, + damping={"waist_yaw_joint": 10000.0, "waist_roll_joint": 10000.0, "waist_pitch_joint": 10000.0}, + armature=None, + ), + "arms": IdealPDActuatorCfg( + joint_names_expr=[ + ".*_shoulder_pitch_joint", + ".*_shoulder_roll_joint", + ".*_shoulder_yaw_joint", + ".*_elbow_joint", + ".*_wrist_.*_joint", + ], + effort_limit={ + ".*_shoulder_pitch_joint": 25.0, + ".*_shoulder_roll_joint": 25.0, + ".*_shoulder_yaw_joint": 25.0, + ".*_elbow_joint": 25.0, + ".*_wrist_roll_joint": 25.0, + ".*_wrist_pitch_joint": 5.0, + ".*_wrist_yaw_joint": 5.0, + }, + velocity_limit={ + ".*_shoulder_pitch_joint": 37.0, + ".*_shoulder_roll_joint": 37.0, + ".*_shoulder_yaw_joint": 37.0, + ".*_elbow_joint": 37.0, + ".*_wrist_roll_joint": 37.0, + ".*_wrist_pitch_joint": 22.0, + ".*_wrist_yaw_joint": 22.0, + }, + stiffness={ + ".*_shoulder_pitch_joint": 100.0, + ".*_shoulder_roll_joint": 100.0, + ".*_shoulder_yaw_joint": 40.0, + ".*_elbow_joint": 40.0, + ".*_wrist_.*_joint": 20.0, + }, + damping={ + ".*_shoulder_pitch_joint": 15.0, + ".*_shoulder_roll_joint": 15.0, + ".*_shoulder_yaw_joint": 8.0, + ".*_elbow_joint": 8.0, + ".*_wrist_.*_joint": 4.0, + }, + armature={".*_shoulder_.*": 0.03, ".*_elbow_.*": 0.03, ".*_wrist_.*_joint": 0.03}, + friction=0.03, + ), + "hands": IdealPDActuatorCfg( + joint_names_expr=[ + ".*_hand_.*", + ], + effort_limit=5.0, + velocity_limit=10.0, + stiffness=8.0, + damping=1.5, + armature=0.03, + friction=0.5, + ), + }, +) +"""Configuration for the Unitree G1 29DOF robot with Dex3 hands and fixed base. + +This configuration is designed for high-precision manipulation tasks such as trocar assembly. +""" diff --git a/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py b/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py index 2c3b70428b13..1defd1a0d503 100644 --- a/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py +++ b/source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/extension.py @@ -440,6 +440,19 @@ def __init__(self, cfg, num_envs: int, seed_offset: int, total_num_processes: in """ super().__init__(cfg, num_envs, seed_offset, total_num_processes, worker_info) + def _record_metrics(self, step_reward, terminations, infos): + """Override to use terminations (task completion) for success_once.""" + + episode_info = {} + self.returns += step_reward + self.success_once = self.success_once | terminations.bool() + episode_info["success_once"] = self.success_once.clone() + episode_info["return"] = self.returns.clone() + episode_info["episode_len"] = self.elapsed_steps.clone() + episode_info["reward"] = episode_info["return"] / episode_info["episode_len"] + infos["episode"] = episode_info + return infos + def _make_env_function(self) -> collections.abc.Callable: """Create the environment factory function. @@ -469,25 +482,6 @@ def make_env_isaaclab() -> tuple: env = gym.make(self.isaaclab_env_id, cfg=isaac_env_cfg, render_mode="rgb_array").unwrapped - _original_reset = env.reset - - import omni.kit.app - - _app = omni.kit.app.get_app() - - def _patched_reset(*args, **kwargs): - obs, extras = _original_reset(*args, **kwargs) - env.sim.set_setting("/app/player/playSimulations", False) - _app.update() - env.sim.set_setting("/app/player/playSimulations", True) - for sensor in env.scene.sensors.values(): - sensor.update(dt=0.0, force_recompute=True) - obs = env.observation_manager.compute(update_history=True) - env.obs_buf = obs - return obs, extras - - env.reset = _patched_reset - return env, sim_app return make_env_isaaclab diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py index 5c1f1f496b15..624d02269813 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/__init__.py @@ -3,33 +3,4 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Configuration for Install Trocar task with G129 + Dex3 robot. - -This module registers the Install Trocar task in IsaacLab's gymnasium registry, -allowing it to be discovered and used through IsaacLab's standard task interfaces. -""" - -import gymnasium as gym - -## -# Register Gym environments. -## - - -gym.register( - id="Isaac-Assemble-Trocar-G129-Dex3-v0", - entry_point="isaaclab.envs:ManagerBasedRLEnv", - kwargs={ - "env_cfg_entry_point": f"{__name__}.g129_dex3_env_cfg:G1AssembleTrocarEnvCfg", - }, - disable_env_checker=True, -) - -gym.register( - id="Isaac-Assemble-Trocar-G129-Dex3-Eval-v0", - entry_point="isaaclab.envs:ManagerBasedRLEnv", - kwargs={ - "env_cfg_entry_point": f"{__name__}.g129_dex3_env_cfg:G1AssembleTrocarEvalEnvCfg", - }, - disable_env_checker=True, -) +"""Configurations for the assemble trocar environments.""" diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py index 43eb229b697d..cd8c26c840a5 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/__init__.py @@ -4,6 +4,6 @@ # SPDX-License-Identifier: BSD-3-Clause from .camera_config import CameraBaseCfg, CameraPresets -from .robot_config import G1RobotPresets +from .robot_config import G1_29DOF_BODY_JOINT_INDICES, G1_DEX3_JOINT_INDICES, G1RobotPresets -__all__ = ["G1RobotPresets", "CameraBaseCfg", "CameraPresets"] +__all__ = ["G1_29DOF_BODY_JOINT_INDICES", "G1_DEX3_JOINT_INDICES", "G1RobotPresets", "CameraBaseCfg", "CameraPresets"] diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py index a93379945944..405948726034 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/camera_config.py @@ -11,7 +11,7 @@ from collections.abc import Sequence import isaaclab.sim as sim_utils -from isaaclab.sensors import CameraCfg, TiledCameraCfg +from isaaclab.sensors import CameraCfg from isaaclab.utils import configclass @@ -58,7 +58,7 @@ def get_camera_config( if data_types is None: data_types = ("rgb",) - return TiledCameraCfg( + return CameraCfg( prim_path=prim_path, update_period=update_period, height=height, @@ -70,7 +70,7 @@ def get_camera_config( horizontal_aperture=horizontal_aperture, clipping_range=clipping_range, ), - offset=TiledCameraCfg.OffsetCfg(pos=pos_offset, rot=rot_offset, convention="ros"), + offset=CameraCfg.OffsetCfg(pos=pos_offset, rot=rot_offset, convention="ros"), ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py index dd820a675980..81c60741b784 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config/robot_config.py @@ -15,12 +15,47 @@ import numpy as np -import isaaclab.sim as sim_utils -from isaaclab.actuators import IdealPDActuatorCfg, ImplicitActuatorCfg from isaaclab.assets import ArticulationCfg from isaaclab.utils import configclass -HEALTHCARE_S3 = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/Healthcare/0.5.0/132c82d" +from isaaclab_assets.robots.unitree import G129_CFG_WITH_DEX3_BASE_FIX + +# Joint indices in the full robot joint vector for observation extraction. +# Body joints: 29 DOF (legs, waist, arms, wrists) +G1_29DOF_BODY_JOINT_INDICES: list[int] = [ + 0, + 3, + 6, + 9, + 13, + 17, + 1, + 4, + 7, + 10, + 14, + 18, + 2, + 5, + 8, + 11, + 15, + 19, + 21, + 23, + 25, + 27, + 12, + 16, + 20, + 22, + 24, + 26, + 28, +] + +# Dex3 hand joints: 14 DOF (left + right) +G1_DEX3_JOINT_INDICES: list[int] = [31, 37, 41, 30, 36, 29, 35, 34, 40, 42, 33, 39, 32, 38] # Default joint positions for the supported setup (G1 29DOF + Dex3). DEFAULT_JOINT_POS: dict[str, float] = { @@ -75,204 +110,6 @@ } -G129_CFG_WITH_DEX3_BASE_FIX = ArticulationCfg( - spawn=sim_utils.UsdFileCfg( - usd_path=f"{HEALTHCARE_S3}/Robots/UnitreeG1/g1_29dof_with_dex3_base_fix/g1_29dof_with_dex3_base_fix.usd", - activate_contact_sensors=True, - rigid_props=sim_utils.RigidBodyPropertiesCfg( - disable_gravity=False, - retain_accelerations=False, - linear_damping=0.0, - angular_damping=0.0, - max_linear_velocity=1000.0, - max_angular_velocity=1000.0, - max_depenetration_velocity=1.0, - solver_position_iteration_count=4, - solver_velocity_iteration_count=0, - ), - articulation_props=sim_utils.ArticulationRootPropertiesCfg( - enabled_self_collisions=False, solver_position_iteration_count=4, solver_velocity_iteration_count=0 - ), - ), - prim_path="/World/envs/env_.*/Robot", - init_state=ArticulationCfg.InitialStateCfg( - pos=(0.0, 0.0, 0.75), - joint_pos={ - # legs joints - "left_hip_yaw_joint": 0.0, - "left_hip_roll_joint": 0.0, - "left_hip_pitch_joint": -0.05, - "left_knee_joint": 0.2, - "left_ankle_pitch_joint": -0.15, - "left_ankle_roll_joint": 0.0, - "right_hip_yaw_joint": 0.0, - "right_hip_roll_joint": 0.0, - "right_hip_pitch_joint": -0.05, - "right_knee_joint": 0.2, - "right_ankle_pitch_joint": -0.15, - "right_ankle_roll_joint": 0.0, - # waist joints - "waist_yaw_joint": 0.0, - "waist_roll_joint": 0.0, - "waist_pitch_joint": 0.0, - "left_shoulder_pitch_joint": 0.0, - "left_shoulder_roll_joint": 0.0, - "left_shoulder_yaw_joint": 0.0, - "left_elbow_joint": -0.3, - "left_wrist_roll_joint": 0.0, - "left_wrist_pitch_joint": 0.0, - "left_wrist_yaw_joint": 0.0, - "right_shoulder_pitch_joint": 0.0, - "right_shoulder_roll_joint": 0.0, - "right_shoulder_yaw_joint": 0.0, - "right_elbow_joint": -0.3, - "right_wrist_roll_joint": 0.0, - "right_wrist_pitch_joint": 0.0, - "right_wrist_yaw_joint": 0.0, - # fingers joints - "left_hand_index_0_joint": 0.0, - "left_hand_middle_0_joint": 0.0, - "left_hand_thumb_0_joint": 0.0, - "left_hand_index_1_joint": 0.0, - "left_hand_middle_1_joint": 0.0, - "left_hand_thumb_1_joint": 0.0, - "left_hand_thumb_2_joint": 0.0, - "right_hand_index_0_joint": 0.0, - "right_hand_middle_0_joint": 0.0, - "right_hand_thumb_0_joint": 0.0, - "right_hand_index_1_joint": 0.0, - "right_hand_middle_1_joint": 0.0, - "right_hand_thumb_1_joint": 0.0, - "right_hand_thumb_2_joint": 0.0, - }, - joint_vel={".*": 0.0}, - ), - soft_joint_pos_limit_factor=0.9, - actuators={ - "legs": IdealPDActuatorCfg( - joint_names_expr=[ - ".*_hip_yaw_joint", - ".*_hip_roll_joint", - ".*_hip_pitch_joint", - ".*_knee_joint", - ], - effort_limit={ - ".*_hip_yaw_joint": 88.0, - ".*_hip_roll_joint": 88.0, - ".*_hip_pitch_joint": 88.0, - ".*_knee_joint": 139.0, - }, - velocity_limit={ - ".*_hip_yaw_joint": 32.0, - ".*_hip_roll_joint": 32.0, - ".*_hip_pitch_joint": 32.0, - ".*_knee_joint": 20.0, - }, - stiffness={ - ".*_hip_yaw_joint": 150.0, - ".*_hip_roll_joint": 150.0, - ".*_hip_pitch_joint": 150.0, - ".*_knee_joint": 300.0, - }, - damping={ - ".*_hip_yaw_joint": 2.0, - ".*_hip_roll_joint": 2.0, - ".*_hip_pitch_joint": 2.0, - ".*_knee_joint": 4.0, - }, - armature={ - ".*_hip_.*": 0.03, - ".*_knee_joint": 0.03, - }, - ), - "feet": IdealPDActuatorCfg( - joint_names_expr=[".*_ankle_pitch_joint", ".*_ankle_roll_joint"], - stiffness={ - ".*_ankle_pitch_joint": 40.0, - ".*_ankle_roll_joint": 40.0, - }, - damping={ - ".*_ankle_pitch_joint": 2, - ".*_ankle_roll_joint": 2, - }, - effort_limit={ - ".*_ankle_pitch_joint": 50.0, - ".*_ankle_roll_joint": 50.0, - }, - velocity_limit={ - ".*_ankle_pitch_joint": 37.0, - ".*_ankle_roll_joint": 37.0, - }, - armature=0.03, - friction=0.03, - ), - "waist": ImplicitActuatorCfg( - joint_names_expr=["waist_yaw_joint", "waist_roll_joint", "waist_pitch_joint"], - effort_limit=1000.0, # set a large torque limit - velocity_limit=0.0, # set the velocity limit to 0 - stiffness={"waist_yaw_joint": 10000.0, "waist_roll_joint": 10000.0, "waist_pitch_joint": 10000.0}, - damping={"waist_yaw_joint": 10000.0, "waist_roll_joint": 10000.0, "waist_pitch_joint": 10000.0}, - armature=None, - ), - "arms": IdealPDActuatorCfg( - joint_names_expr=[ - ".*_shoulder_pitch_joint", - ".*_shoulder_roll_joint", - ".*_shoulder_yaw_joint", - ".*_elbow_joint", - ".*_wrist_.*_joint", - ], - effort_limit={ - ".*_shoulder_pitch_joint": 25.0, - ".*_shoulder_roll_joint": 25.0, - ".*_shoulder_yaw_joint": 25.0, - ".*_elbow_joint": 25.0, - ".*_wrist_roll_joint": 25.0, - ".*_wrist_pitch_joint": 5.0, - ".*_wrist_yaw_joint": 5.0, - }, - velocity_limit={ - ".*_shoulder_pitch_joint": 37.0, - ".*_shoulder_roll_joint": 37.0, - ".*_shoulder_yaw_joint": 37.0, - ".*_elbow_joint": 37.0, - ".*_wrist_roll_joint": 37.0, - ".*_wrist_pitch_joint": 22.0, - ".*_wrist_yaw_joint": 22.0, - }, - stiffness={ - ".*_shoulder_pitch_joint": 100.0, - ".*_shoulder_roll_joint": 100.0, - ".*_shoulder_yaw_joint": 40.0, - ".*_elbow_joint": 40.0, - ".*_wrist_.*_joint": 20.0, - }, - damping={ - ".*_shoulder_pitch_joint": 15.0, - ".*_shoulder_roll_joint": 15.0, - ".*_shoulder_yaw_joint": 8.0, - ".*_elbow_joint": 8.0, - ".*_wrist_.*_joint": 4.0, - }, - armature={".*_shoulder_.*": 0.03, ".*_elbow_.*": 0.03, ".*_wrist_.*_joint": 0.03}, - friction=0.03, - ), - # NOTE(peterd, 9/25/2025): The follow hand joint values are tested and working with Leapmotion and Mimic - "hands": IdealPDActuatorCfg( - joint_names_expr=[ - ".*_hand_.*", - ], - effort_limit=5.0, - velocity_limit=10.0, - stiffness=8.0, - damping=1.5, - armature=0.03, - friction=0.5, - ), - }, -) - - def make_g1_29dof_dex3_cfg( *, prim_path: str = "/World/envs/env_.*/Robot", diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py index c77bea7f2e94..adcefd80600c 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py @@ -370,6 +370,8 @@ class G1AssembleTrocarEnvCfg(ManagerBasedRLEnvCfg): rewards: RewardsCfg = RewardsCfg() curriculum = None + num_rerenders_on_reset: int = 1 + def __post_init__(self): """Post initialization.""" # general settings diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py index 1e66e69b4c99..2ed7e39422b7 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py @@ -11,7 +11,6 @@ from typing import TYPE_CHECKING import torch -import warp as wp from isaaclab.managers import SceneEntityCfg from isaaclab.utils.math import quat_apply, quat_mul @@ -118,9 +117,9 @@ def reset_tray_with_random_rotation( # Get default states (initial positions from config) # note: default_root_state is the local coordinate relative to the environment origin - tray_default_state = wp.to_torch(tray.data.default_root_state)[env_ids].clone() - trocar_1_default_state = wp.to_torch(trocar_1.data.default_root_state)[env_ids].clone() - trocar_2_default_state = wp.to_torch(trocar_2.data.default_root_state)[env_ids].clone() + tray_default_state = tray.data.default_root_state.torch[env_ids].clone() + trocar_1_default_state = trocar_1.data.default_root_state.torch[env_ids].clone() + trocar_2_default_state = trocar_2.data.default_root_state.torch[env_ids].clone() # get the world coordinate offset for each environment (multiple environment support) env_origins = env.scene.env_origins[env_ids] # (num_envs, 3) @@ -246,14 +245,14 @@ def reset_robot_to_default_joint_positions( robot = env.scene[robot_cfg.name] # Get default joint positions and velocities - default_joint_pos = wp.to_torch(robot.data.default_joint_pos)[env_ids].clone() - default_joint_vel = wp.to_torch(robot.data.default_joint_vel)[env_ids].clone() + default_joint_pos = robot.data.default_joint_pos.torch[env_ids].clone() + default_joint_vel = robot.data.default_joint_vel.torch[env_ids].clone() # Directly write joint state to simulation (bypasses PD controller) robot.write_joint_position_to_sim_index(position=default_joint_pos, env_ids=env_ids) robot.write_joint_velocity_to_sim_index(velocity=default_joint_vel, env_ids=env_ids) # Also reset root state - default_root_state = wp.to_torch(robot.data.default_root_state)[env_ids].clone() + default_root_state = robot.data.default_root_state.torch[env_ids].clone() robot.write_root_pose_to_sim_index(root_pose=default_root_state[:, :7], env_ids=env_ids) robot.write_root_velocity_to_sim_index(root_velocity=default_root_state[:, 7:13], env_ids=env_ids) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py index c58a4553a44d..06c037ba3d68 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/observations.py @@ -16,7 +16,11 @@ from typing import TYPE_CHECKING import torch -import warp as wp + +from isaaclab_tasks.manager_based.manipulation.assemble_trocar.config import ( + G1_29DOF_BODY_JOINT_INDICES, + G1_DEX3_JOINT_INDICES, +) if TYPE_CHECKING: from isaaclab.envs import ManagerBasedRLEnv @@ -37,54 +41,22 @@ def get_robot_body_joint_states(env: ManagerBasedRLEnv) -> torch.Tensor: """Return body joint states as a single tensor: [pos(29) | vel(29) | torque(29)].""" - joint_pos = wp.to_torch(env.scene["robot"].data.joint_pos) - joint_vel = wp.to_torch(env.scene["robot"].data.joint_vel) - joint_torque = wp.to_torch(env.scene["robot"].data.applied_torque) + robot_data = env.scene["robot"].data + joint_pos = robot_data.joint_pos.torch + joint_vel = robot_data.joint_vel.torch + joint_torque = robot_data.applied_torque.torch device = joint_pos.device batch = joint_pos.shape[0] - # Precompute and cache column indices global _body_obs_cache if _body_obs_cache["device"] != device or _body_obs_cache["idx_t"] is None: - body_joint_indices = [ - 0, - 3, - 6, - 9, - 13, - 17, - 1, - 4, - 7, - 10, - 14, - 18, - 2, - 5, - 8, - 11, - 15, - 19, - 21, - 23, - 25, - 27, - 12, - 16, - 20, - 22, - 24, - 26, - 28, - ] - _body_obs_cache["idx_t"] = torch.tensor(body_joint_indices, dtype=torch.long, device=device) + _body_obs_cache["idx_t"] = torch.tensor(G1_29DOF_BODY_JOINT_INDICES, dtype=torch.long, device=device) _body_obs_cache["device"] = device - _body_obs_cache["batch"] = None # force re-init batch-shaped buffers + _body_obs_cache["batch"] = None idx_t = _body_obs_cache["idx_t"] n = idx_t.numel() - # Preallocate/reuse batch-shaped indices and output buffers if _body_obs_cache["batch"] != batch or _body_obs_cache["idx_batch"] is None: _body_obs_cache["idx_batch"] = idx_t.unsqueeze(0).expand(batch, n) _body_obs_cache["pos_buf"] = torch.empty(batch, n, device=device, dtype=joint_pos.dtype) @@ -99,17 +71,10 @@ def get_robot_body_joint_states(env: ManagerBasedRLEnv) -> torch.Tensor: torque_buf = _body_obs_cache["torque_buf"] combined_buf = _body_obs_cache["combined_buf"] - # Fill buffers using gather(out=...) to avoid new tensor allocations - try: - torch.gather(joint_pos, 1, idx_batch, out=pos_buf) - torch.gather(joint_vel, 1, idx_batch, out=vel_buf) - torch.gather(joint_torque, 1, idx_batch, out=torque_buf) - except TypeError: - pos_buf.copy_(torch.gather(joint_pos, 1, idx_batch)) - vel_buf.copy_(torch.gather(joint_vel, 1, idx_batch)) - torque_buf.copy_(torch.gather(joint_torque, 1, idx_batch)) - - # Combine into a single buffer to avoid cat allocations + torch.gather(joint_pos, 1, idx_batch, out=pos_buf) + torch.gather(joint_vel, 1, idx_batch, out=vel_buf) + torch.gather(joint_torque, 1, idx_batch, out=torque_buf) + combined_buf[:, 0:n].copy_(pos_buf) combined_buf[:, n : 2 * n].copy_(vel_buf) combined_buf[:, 2 * n : 3 * n].copy_(torque_buf) @@ -128,15 +93,13 @@ def get_robot_body_joint_states(env: ManagerBasedRLEnv) -> torch.Tensor: def get_robot_dex3_joint_states(env: ManagerBasedRLEnv) -> torch.Tensor: """Return Dex3 joint positions [batch, 14].""" - joint_pos = wp.to_torch(env.scene["robot"].data.joint_pos) + joint_pos = env.scene["robot"].data.joint_pos.torch device = joint_pos.device batch = joint_pos.shape[0] global _dex3_obs_cache if _dex3_obs_cache["device"] != device or _dex3_obs_cache["idx_t"] is None: - # Dex3 joint indices in the full robot joint vector (14 DOF) - dex3_joint_indices = [31, 37, 41, 30, 36, 29, 35, 34, 40, 42, 33, 39, 32, 38] - _dex3_obs_cache["idx_t"] = torch.tensor(dex3_joint_indices, dtype=torch.long, device=device) + _dex3_obs_cache["idx_t"] = torch.tensor(G1_DEX3_JOINT_INDICES, dtype=torch.long, device=device) _dex3_obs_cache["device"] = device _dex3_obs_cache["batch"] = None @@ -151,9 +114,6 @@ def get_robot_dex3_joint_states(env: ManagerBasedRLEnv) -> torch.Tensor: idx_batch = _dex3_obs_cache["idx_batch"] pos_buf = _dex3_obs_cache["pos_buf"] - try: - torch.gather(joint_pos, 1, idx_batch, out=pos_buf) - except TypeError: - pos_buf.copy_(torch.gather(joint_pos, 1, idx_batch)) + torch.gather(joint_pos, 1, idx_batch, out=pos_buf) return pos_buf diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py index f635c74a1309..4caba39808e9 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py @@ -8,7 +8,6 @@ from typing import TYPE_CHECKING import torch -import warp as wp from isaaclab.assets import RigidObject from isaaclab.managers import SceneEntityCfg @@ -109,11 +108,10 @@ def update_task_stage( obj1: RigidObject = env.scene[asset_cfg1.name] obj2: RigidObject = env.scene[asset_cfg2.name] - pos1 = wp.to_torch(obj1.data.root_pos_w) - pos2 = wp.to_torch(obj2.data.root_pos_w) - quat1 = wp.to_torch(obj1.data.root_quat_w) - quat2 = wp.to_torch(obj2.data.root_quat_w) - + pos1 = obj1.data.root_pos_w.torch + pos2 = obj2.data.root_pos_w.torch + quat1 = obj1.data.root_quat_w.torch + quat2 = obj2.data.root_quat_w.torch # Store old stage to detect changes (BEFORE any stage transitions) old_stage = stage.clone() @@ -240,9 +238,8 @@ def lift_trocars_reward( obj2: RigidObject = env.scene[asset_cfg2.name] # Get positions (num_envs, 3) - pos1 = wp.to_torch(obj1.data.root_pos_w) - pos2 = wp.to_torch(obj2.data.root_pos_w) - + pos1 = obj1.data.root_pos_w.torch + pos2 = obj2.data.root_pos_w.torch target_z = table_height + lift_threshold # Check if lifted @@ -380,8 +377,8 @@ def get_trocar_tip_position( tip_offset_local = getattr(env, cache_key) obj: RigidObject = env.scene[asset_cfg.name] - root_pos_w = wp.to_torch(obj.data.root_pos_w) # Shape: (num_envs, 3) - root_quat_w = wp.to_torch(obj.data.root_quat_w) # Shape: (num_envs, 4) XYZW + root_pos_w = obj.data.root_pos_w.torch # Shape: (num_envs, 3) + root_quat_w = obj.data.root_quat_w.torch # Shape: (num_envs, 4) XYZW tip_offset_local_batch = tip_offset_local.unsqueeze(0).repeat(env.num_envs, 1) @@ -521,11 +518,10 @@ def trocar_insertion_reward( obj2: RigidObject = env.scene[asset_cfg2.name] # Positions and Rotations - pos1 = wp.to_torch(obj1.data.root_pos_w) - quat1 = wp.to_torch(obj1.data.root_quat_w) - pos2 = wp.to_torch(obj2.data.root_pos_w) - quat2 = wp.to_torch(obj2.data.root_quat_w) - + pos1 = obj1.data.root_pos_w.torch + quat1 = obj1.data.root_quat_w.torch + pos2 = obj2.data.root_pos_w.torch + quat2 = obj2.data.root_quat_w.torch # Calculate center distance center_dist = torch.norm(pos1 - pos2, dim=-1) # (num_envs,) @@ -643,9 +639,8 @@ def trocar_placement_reward( obj2: RigidObject = env.scene[asset_cfg2.name] # Get root positions (num_envs, 3) - pos1 = wp.to_torch(obj1.data.root_pos_w) - pos2 = wp.to_torch(obj2.data.root_pos_w) - + pos1 = obj1.data.root_pos_w.torch + pos2 = obj2.data.root_pos_w.torch # Get environment origins to handle multi-env spatial offsets env_origins = env.scene.env_origins # shape: (num_envs, 3) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py index 8c9b18765847..02257843fd33 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py @@ -8,7 +8,6 @@ from typing import TYPE_CHECKING import torch -import warp as wp from isaaclab.assets import RigidObject from isaaclab.managers import SceneEntityCfg @@ -45,9 +44,8 @@ def object_drop_termination( obj2: RigidObject = env.scene[asset_cfg2.name] # Get positions - pos1 = wp.to_torch(obj1.data.root_pos_w) - pos2 = wp.to_torch(obj2.data.root_pos_w) - + pos1 = obj1.data.root_pos_w.torch + pos2 = obj2.data.root_pos_w.torch # Check if either object has dropped dropped_1 = pos1[:, 2] < drop_height_threshold dropped_2 = pos2[:, 2] < drop_height_threshold From e0baa88a340bc1f9e27392d6b40bc67a6a687aa1 Mon Sep 17 00:00:00 2001 From: mingxueg Date: Thu, 7 May 2026 03:45:31 +0000 Subject: [PATCH 5/7] Add documentation for assemble trocar environment and RLinf RL post-training --- .../tasks/manipulation/g1_assemble_trocar.jpg | Bin 0 -> 476908 bytes .../experimental-features/bleeding-edge.rst | 141 ++++++++++++++++++ docs/source/overview/environments.rst | 9 ++ .../reinforcement_learning/rlinf/README.md | 10 +- 4 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 docs/source/_static/tasks/manipulation/g1_assemble_trocar.jpg diff --git a/docs/source/_static/tasks/manipulation/g1_assemble_trocar.jpg b/docs/source/_static/tasks/manipulation/g1_assemble_trocar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad62167a29332177e8b88a2c18e9e299ca13e7a4 GIT binary patch literal 476908 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%0ARdMwbq#Hs5@h<25S~k< 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 z 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Ⓢm2eggOv;cVJlOCKA?C{u= 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Ⓢ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 is a flexible and scalable open-source RL infrastructure designed for +Embodied and Agentic AI. This integration enables **reinforcement learning fine-tuning of Vision-Language-Action +(VLA) models** (e.g., GR00T, OpenVLA) on Isaac Lab simulation tasks. + +The typical workflow follows three stages: + +1. **Data collection** — Collect demonstration data from the Isaac Lab environment (e.g., via teleoperation or scripted policy). +2. **Base model training** — Train a VLA base model (e.g., GR00T) on the collected demonstrations using supervised learning. +3. **RL fine-tuning** — Fine-tune the pretrained VLA model on the Isaac Lab task using RLinf with PPO / Actor-Critic / SAC. + +Overview +~~~~~~~~ + +The RLinf integration allows Isaac Lab users to: + +- Fine-tune pretrained VLA models on Isaac Lab tasks using PPO / Actor-Critic / SAC +- Leverage RLinf's FSDP-based distributed training across multiple GPUs/nodes +- Define observation/action mappings from Isaac Lab to GR00T format via a single YAML config +- Register Isaac Lab tasks into RLinf without modifying RLinf source code + +Architecture +~~~~~~~~~~~~ + +.. code-block:: text + + ┌────────────────────────────────────────────────────────────────┐ + │ RLinf Runner │ + │ (EmbodiedRunner / EvalRunner) │ + ├────────────────┬──────────────────────┬────────────────────────┤ + │ Actor Worker │ Rollout Worker │ Env Worker │ + │ (FSDP) │ (HF Inference) │ (IsaacLab Sim) │ + │ │ │ │ + │ Policy │ Multi-step rollout │ IsaacLabGenericEnv │ + │ Update │ with VLA model │ ├─ _make_env_function │ + │ │ │ ├─ _wrap_obs │ + │ │ │ └─ _wrap_action │ + └────────────────┴──────────────────────┴────────────────────────┘ + +**Data flow:** + +1. ``EnvWorker`` runs Isaac Lab simulation and converts observations to RLinf format +2. ``RolloutWorker`` runs VLA model inference (e.g., GR00T) to produce actions +3. Actions are converted back to Isaac Lab format and stepped in the environment +4. ``ActorWorker`` updates the VLA model with PPO/actor-critic loss via FSDP + +Prerequisites +~~~~~~~~~~~~~ + +- **Isaac Lab** installed and configured +- **Isaac-GR00T** repo (for VLA inference and data transforms) +- A **pretrained VLA checkpoint** in HuggingFace format +- Multi-GPU setup recommended (FSDP requires at least 1 GPU) + +Installation +~~~~~~~~~~~~ + +From the Isaac Lab root directory: + +.. code-block:: bash + + # Install isaaclab_contrib with the RLinf extra + pip install -e "source/isaaclab_contrib[rlinf]" --ignore-requires-python + + # Install Isaac-GR00T (pinned version) + git clone https://github.com/NVIDIA/Isaac-GR00T.git + cd Isaac-GR00T + git checkout 4af2b622892f7dcb5aae5a3fb70bcb02dc217b96 + pip install -e .[base] --no-deps + cd ../ + +Quick Start +~~~~~~~~~~~ + +**Training** — RL fine-tuning of a pretrained VLA model: + +.. code-block:: bash + + python scripts/reinforcement_learning/rlinf/train.py \ + --task Isaac-Assemble-Trocar-G129-Dex3-v0 \ + --config_path source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config \ + --config_name isaaclab_ppo_gr00t_assemble_trocar + +**Evaluation** — Evaluate a trained checkpoint with video recording: + +.. code-block:: bash + + python scripts/reinforcement_learning/rlinf/play.py \ + --task Isaac-Assemble-Trocar-G129-Dex3-Eval-v0 \ + --model_path /path/to/checkpoint \ + --config_path source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/config \ + --config_name isaaclab_ppo_gr00t_assemble_trocar \ + --video + +Configuration +~~~~~~~~~~~~~ + +All configuration lives in a **single YAML file** loaded by `Hydra `_. +The key configuration block is the ``env.train.isaaclab`` section, which defines how Isaac Lab observations +are converted to GR00T format: + +.. code-block:: yaml + + isaaclab: &isaaclab_config + task_description: "assemble trocar from tray" + + # IsaacLab → RLinf observation mapping + main_images: "front_camera" + extra_view_images: + - "left_wrist_camera" + - "right_wrist_camera" + states: + - key: "robot_joint_state" + slice: [15, 29] + - key: "robot_dex3_joint_state" + + # GR00T → IsaacLab action conversion + action_mapping: + prefix_pad: 15 + suffix_pad: 0 + +Key Files +~~~~~~~~~ + +.. code-block:: text + + scripts/reinforcement_learning/rlinf/ + ├── README.md # Detailed documentation + ├── train.py # Training entry point + ├── play.py # Evaluation entry point + └── cli_args.py # Shared CLI argument definitions + + source/isaaclab_contrib/isaaclab_contrib/rl/rlinf/ + ├── __init__.py + └── extension.py # Task registration, obs/action conversion + +For detailed configuration options, CLI arguments, and how to add new tasks, +see `scripts/reinforcement_learning/rlinf/README.md `_. diff --git a/docs/source/overview/environments.rst b/docs/source/overview/environments.rst index c1bce52597e4..2116b393e297 100644 --- a/docs/source/overview/environments.rst +++ b/docs/source/overview/environments.rst @@ -204,6 +204,8 @@ for the lift-cube environment: +-------------------------+------------------------------+-----------------------------------------------------------------------------+------------------------------+ | |cabi_openarm_uni| | |cabi_openarm_uni-link| | Grasp the handle of a cabinet's drawer and open it with the OpenArm robot | | +-------------------------+------------------------------+-----------------------------------------------------------------------------+------------------------------+ + | |g1_assemble_trocar| | |g1_assemble_trocar-link| | Assemble trocar with a Unitree G1 humanoid robot with Dex3 hands | | + +-------------------------+------------------------------+-----------------------------------------------------------------------------+------------------------------+ .. |reach-franka| image:: ../_static/tasks/manipulation/franka_reach.jpg .. |reach-ur10| image:: ../_static/tasks/manipulation/ur10_reach.jpg @@ -228,6 +230,7 @@ for the lift-cube environment: .. |reach_openarm_uni| image:: ../_static/tasks/manipulation/openarm_uni_reach.jpg .. |lift_openarm_uni| image:: ../_static/tasks/manipulation/openarm_uni_lift.jpg .. |cabi_openarm_uni| image:: ../_static/tasks/manipulation/openarm_uni_open_drawer.jpg +.. |g1_assemble_trocar| image:: ../_static/tasks/manipulation/g1_assemble_trocar.jpg .. |reach-franka-link| replace:: `Isaac-Reach-Franka-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/franka/joint_pos_env_cfg.py>`__ .. |reach-ur10-link| replace:: `Isaac-Reach-UR10-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/ur_10/joint_pos_env_cfg.py>`__ @@ -261,6 +264,7 @@ for the lift-cube environment: .. |reach_openarm_uni-link| replace:: `Isaac-Reach-OpenArm-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/openarm/unimanual/joint_pos_env_cfg.py>`__ .. |lift_openarm_uni-link| replace:: `Isaac-Lift-Cube-OpenArm-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/lift/config/openarm/joint_pos_env_cfg.py>`__ .. |cabi_openarm_uni-link| replace:: `Isaac-Open-Drawer-OpenArm-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/cabinet/config/openarm/joint_pos_env_cfg.py>`__ +.. |g1_assemble_trocar-link| replace:: `Isaac-Assemble-Trocar-G129-Dex3-v0 <../../../source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py>`__ Contact-rich Manipulation @@ -763,6 +767,11 @@ inferencing, including reading from an already trained checkpoint and disabling - Manager Based - **rsl_rl** (PPO), **rl_games** (PPO), **skrl** (PPO), **sb3** (PPO) - ``newton_mjwarp``, ``physx`` + * - Isaac-Assemble-Trocar-G129-Dex3-v0 + - Isaac-Assemble-Trocar-G129-Dex3-Eval-v0 + - Manager Based + - **rlinf** (PPO) + - * - Isaac-Cart-Double-Pendulum-Direct-v0 - - Direct diff --git a/scripts/reinforcement_learning/rlinf/README.md b/scripts/reinforcement_learning/rlinf/README.md index 4ca96ba4fd2c..725079782f97 100644 --- a/scripts/reinforcement_learning/rlinf/README.md +++ b/scripts/reinforcement_learning/rlinf/README.md @@ -81,7 +81,7 @@ python train.py python train.py --config_name isaaclab_ppo_gr00t_assemble_trocar # Training with task override -python train.py --task Isaac-Assemble-Trocar-G129-Dex3-RLinf-v0 +python train.py --task Isaac-Assemble-Trocar-G129-Dex3-v0 # Training with custom settings python train.py --num_envs 64 --max_epochs 1000 @@ -94,13 +94,13 @@ python train.py --list_tasks ```bash # Evaluate a trained checkpoint -python play.py --model_path /path/to/checkpoint +python play.py --task Isaac-Assemble-Trocar-G129-Dex3-Eval-v0 --model_path /path/to/checkpoint # Evaluate with video recording -python play.py --model_path /path/to/checkpoint --video +python play.py --task Isaac-Assemble-Trocar-G129-Dex3-Eval-v0 --model_path /path/to/checkpoint --video # Evaluate with specific number of environments -python play.py --model_path /path/to/checkpoint --num_envs 8 +python play.py --task Isaac-Assemble-Trocar-G129-Dex3-Eval-v0 --model_path /path/to/checkpoint --num_envs 8 ``` ## Configuration @@ -132,7 +132,7 @@ env: total_num_envs: 4 max_episode_steps: 256 init_params: - id: "Isaac-Assemble-Trocar-G129-Dex3-RLinf-v0" + id: "Isaac-Assemble-Trocar-G129-Dex3-v0" isaaclab: &isaaclab_config # IsaacLab ↔ RLinf mapping (see below) ... eval: From 99c6bfa107cd28aec3fb9b4297f1ea6351a5598b Mon Sep 17 00:00:00 2001 From: mingxueg Date: Thu, 7 May 2026 06:33:36 +0000 Subject: [PATCH 6/7] add changelog and fix lint --- docs/source/experimental-features/bleeding-edge.rst | 2 +- .../changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst | 5 +++++ .../changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst | 5 +++++ .../changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst | 7 +++++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 source/isaaclab_assets/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst create mode 100644 source/isaaclab_contrib/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst create mode 100644 source/isaaclab_tasks/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst diff --git a/docs/source/experimental-features/bleeding-edge.rst b/docs/source/experimental-features/bleeding-edge.rst index 2b472327b8cc..860c08611d1e 100644 --- a/docs/source/experimental-features/bleeding-edge.rst +++ b/docs/source/experimental-features/bleeding-edge.rst @@ -149,4 +149,4 @@ Key Files └── extension.py # Task registration, obs/action conversion For detailed configuration options, CLI arguments, and how to add new tasks, -see `scripts/reinforcement_learning/rlinf/README.md `_. +see ``scripts/reinforcement_learning/rlinf/README.md``. diff --git a/source/isaaclab_assets/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst b/source/isaaclab_assets/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst new file mode 100644 index 000000000000..2a79e0a27d50 --- /dev/null +++ b/source/isaaclab_assets/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst @@ -0,0 +1,5 @@ +Added +^^^^^ + +* Added :class:`~isaaclab_assets.robots.unitree.G129_CFG_WITH_DEX3_BASE_FIX` robot configuration + for the Unitree G1 29-DOF with Dex3 hands. diff --git a/source/isaaclab_contrib/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst b/source/isaaclab_contrib/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst new file mode 100644 index 000000000000..062bce25b772 --- /dev/null +++ b/source/isaaclab_contrib/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst @@ -0,0 +1,5 @@ +Fixed +^^^^^ + +* Removed ``_patched_reset`` monkey-patch in RLinf extension; use + ``num_rerenders_on_reset`` env config instead. diff --git a/source/isaaclab_tasks/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst b/source/isaaclab_tasks/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst new file mode 100644 index 000000000000..f5d918d3680f --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/Adds-Assemble-Trocar-task-Based-RLinf.rst @@ -0,0 +1,7 @@ +Added +^^^^^ + +* Added ``Isaac-Assemble-Trocar-G129-Dex3-v0`` and + ``Isaac-Assemble-Trocar-G129-Dex3-Eval-v0`` manipulation tasks: a Unitree G1 + 29-DOF humanoid with Dex3 hands assembles a trocar from a tray, trained via + RL post-training of a VLA model using RLinf. From 348464be90c960de1b05d3b5213f8a5d84d667ca Mon Sep 17 00:00:00 2001 From: mingxueg Date: Sun, 10 May 2026 15:59:23 +0000 Subject: [PATCH 7/7] Replace monkey-patched env attributes with AssembleTrocarState dataclass, remove implicit ordering dependencies between reward functions, migrate deprecated data.default_root_state to default_root_pose/default_root_vel, replace all print() calls with standard logging, and switch mdp/__init__.py to lazy_export() --- .../assemble_trocar/g129_dex3_env_cfg.py | 33 +- .../assemble_trocar/mdp/__init__.py | 30 +- .../assemble_trocar/mdp/events.py | 115 +++-- .../assemble_trocar/mdp/rewards.py | 420 +++++++----------- .../assemble_trocar/mdp/terminations.py | 7 +- 5 files changed, 255 insertions(+), 350 deletions(-) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py index adcefd80600c..50e58134f14c 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/g129_dex3_env_cfg.py @@ -248,27 +248,42 @@ class TerminationsCfg: class RewardsCfg: """Reward configuration for sparse reward mode. - Each stage gives 1.0 reward on completion → Total reward for full task = 4.0 + Each stage gives 1.0 reward on completion -> Total reward for full task = 4.0 This ensures clear reward signal for each stage transition. + + ``update_stage`` runs first (weight=0) to advance the task stage before any + reward term reads it, removing implicit ordering dependencies. """ - # Stage 0: Lift trocars - lift_trocars = RewTerm( - func=mdp.lift_trocars_reward, - weight=1.0, # Give 1.0 reward when stage 0->1 completes + # Stage machine — weight=0, runs before all reward terms to update task stage + update_stage = RewTerm( + func=mdp.update_task_stage, + weight=0.0, params={ - "table_height": 0.85483, - "lift_threshold": 0.15, "asset_cfg1": SceneEntityCfg("trocar_1"), "asset_cfg2": SceneEntityCfg("trocar_2"), - # Stage transition thresholds - "tip_align_threshold": 0.015, # Threshold for tip alignment (m) + "table_height": 0.85483, + "lift_threshold": 0.15, + "tip_align_threshold": 0.015, "insertion_dist_threshold": 0.05, "insertion_angle_threshold": 0.15, "placement_x_min": -1.8, "placement_x_max": -1.4, "placement_y_min": 1.5, "placement_y_max": 1.8, + "print_log": False, + }, + ) + + # Stage 0: Lift trocars + lift_trocars = RewTerm( + func=mdp.lift_trocars_reward, + weight=1.0, + params={ + "table_height": 0.85483, + "lift_threshold": 0.15, + "asset_cfg1": SceneEntityCfg("trocar_1"), + "asset_cfg2": SceneEntityCfg("trocar_2"), "use_sparse_reward": True, "print_log": False, }, diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py index 4de5284dfe23..d428ed46f7b4 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/__init__.py @@ -5,32 +5,6 @@ """MDP utilities for the assemble_trocar task.""" -from isaaclab.envs.mdp import JointPositionActionCfg, time_out +from isaaclab.utils.module import lazy_export -from .events import reset_robot_to_default_joint_positions, reset_task_stage, reset_tray_with_random_rotation -from .observations import get_robot_body_joint_states, get_robot_dex3_joint_states -from .rewards import ( - lift_trocars_reward, - trocar_insertion_reward, - trocar_placement_reward, - trocar_tip_alignment_reward, - update_task_stage, -) -from .terminations import object_drop_termination, task_success_termination - -__all__ = [ - "JointPositionActionCfg", - "time_out", - "get_robot_body_joint_states", - "get_robot_dex3_joint_states", - "reset_tray_with_random_rotation", - "reset_robot_to_default_joint_positions", - "reset_task_stage", - "update_task_stage", - "lift_trocars_reward", - "trocar_tip_alignment_reward", - "trocar_insertion_reward", - "trocar_placement_reward", - "task_success_termination", - "object_drop_termination", -] +lazy_export() diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py index 2ed7e39422b7..92214471ac09 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/events.py @@ -7,6 +7,7 @@ from __future__ import annotations +import logging import math from typing import TYPE_CHECKING @@ -18,6 +19,8 @@ if TYPE_CHECKING: from isaaclab.envs import ManagerBasedRLEnv +logger = logging.getLogger(__name__) + __all__ = [ "reset_tray_with_random_rotation", "reset_robot_to_default_joint_positions", @@ -38,37 +41,30 @@ def reset_task_stage( Args: env: The environment instance env_ids: Indices of environments to reset - print_log: If True, print debug information. + print_log: If True, log debug information. """ - if hasattr(env, "_task_stage"): - env._task_stage[env_ids] = 0 - - # Reset all locked reward caches (for dense rewards) - if hasattr(env, "_lift_reward_locked"): - env._lift_reward_locked[env_ids] = 0 - if hasattr(env, "_tip_reward_locked"): - env._tip_reward_locked[env_ids] = 0 - if hasattr(env, "_insertion_reward_locked"): - env._insertion_reward_locked[env_ids] = 0 - if hasattr(env, "_placement_reward_locked"): - env._placement_reward_locked[env_ids] = 0 - - # Reset all previous stage trackers (for sparse rewards) - if hasattr(env, "_prev_stage_lift"): - env._prev_stage_lift[env_ids] = 0 - if hasattr(env, "_prev_stage_tip"): - env._prev_stage_tip[env_ids] = 0 - if hasattr(env, "_prev_stage_insert"): - env._prev_stage_insert[env_ids] = 0 - if hasattr(env, "_prev_stage_place"): - env._prev_stage_place[env_ids] = 0 - - # Reset debug print tracker - if hasattr(env, "_last_debug_print_step"): - env._last_debug_print_step = -1 + from .rewards import get_assemble_trocar_state + + s = get_assemble_trocar_state(env) + s.task_stage[env_ids] = 0 + + # Reset dense-reward locked caches + s.lift_reward_locked[env_ids] = 0 + s.tip_reward_locked[env_ids] = 0 + s.insertion_reward_locked[env_ids] = 0 + s.placement_reward_locked[env_ids] = 0 + + # Reset sparse-reward previous-stage trackers + s.prev_stage_lift[env_ids] = 0 + s.prev_stage_tip[env_ids] = 0 + s.prev_stage_insert[env_ids] = 0 + s.prev_stage_place[env_ids] = 0 + + # Reset debug throttle + s.last_debug_print_step = -1 if print_log: - print(f"Reset task stage for {len(env_ids)} environment(s)") + logger.debug("Reset task stage for %d environment(s)", len(env_ids)) def reset_tray_with_random_rotation( @@ -115,22 +111,20 @@ def reset_tray_with_random_rotation( trocar_1 = env.scene[trocar_1_cfg.name] trocar_2 = env.scene[trocar_2_cfg.name] - # Get default states (initial positions from config) - # note: default_root_state is the local coordinate relative to the environment origin - tray_default_state = tray.data.default_root_state.torch[env_ids].clone() - trocar_1_default_state = trocar_1.data.default_root_state.torch[env_ids].clone() - trocar_2_default_state = trocar_2.data.default_root_state.torch[env_ids].clone() + # Get default poses and velocities (local coordinates relative to env origin) + tray_default_pose = tray.data.default_root_pose.torch[env_ids].clone() + trocar_1_default_pose = trocar_1.data.default_root_pose.torch[env_ids].clone() + trocar_2_default_pose = trocar_2.data.default_root_pose.torch[env_ids].clone() - # get the world coordinate offset for each environment (multiple environment support) env_origins = env.scene.env_origins[env_ids] # (num_envs, 3) - # convert local coordinate to world coordinate - tray_default_state[:, :3] += env_origins - trocar_1_default_state[:, :3] += env_origins - trocar_2_default_state[:, :3] += env_origins + # Convert local coordinate to world coordinate + tray_default_pose[:, :3] += env_origins + trocar_1_default_pose[:, :3] += env_origins + trocar_2_default_pose[:, :3] += env_origins - # Tray center position (pivot point for rotation) - now is world coordinate - tray_center = tray_default_state[:, :3] # (num_envs, 3) + # Tray center position (pivot point for rotation) - now in world coordinates + tray_center = tray_default_pose[:, :3] # (num_envs, 3) # Generate yaw angles (in radians) # Convert degrees to radians @@ -159,36 +153,36 @@ def reset_tray_with_random_rotation( delta_quat[:, 3] = torch.cos(half_angle) # w # Apply rotation to tray quaternion - tray_new_quat = quat_mul(delta_quat, tray_default_state[:, 3:7]) + tray_new_quat = quat_mul(delta_quat, tray_default_pose[:, 3:7]) - # Update tray state - tray_new_state = tray_default_state.clone() - tray_new_state[:, 3:7] = tray_new_quat + # Update tray pose + tray_new_pose = tray_default_pose.clone() + tray_new_pose[:, 3:7] = tray_new_quat # Rotate trocar positions around tray center - trocar_1_relative_pos = trocar_1_default_state[:, :3] - tray_center - trocar_2_relative_pos = trocar_2_default_state[:, :3] - tray_center + trocar_1_relative_pos = trocar_1_default_pose[:, :3] - tray_center + trocar_2_relative_pos = trocar_2_default_pose[:, :3] - tray_center # Rotate relative positions using the delta quaternion trocar_1_new_relative_pos = quat_apply(delta_quat, trocar_1_relative_pos) trocar_2_new_relative_pos = quat_apply(delta_quat, trocar_2_relative_pos) - # New absolute positions - trocar_1_new_state = trocar_1_default_state.clone() - trocar_2_new_state = trocar_2_default_state.clone() + # New absolute poses + trocar_1_new_pose = trocar_1_default_pose.clone() + trocar_2_new_pose = trocar_2_default_pose.clone() - trocar_1_new_state[:, :3] = tray_center + trocar_1_new_relative_pos - trocar_2_new_state[:, :3] = tray_center + trocar_2_new_relative_pos + trocar_1_new_pose[:, :3] = tray_center + trocar_1_new_relative_pos + trocar_2_new_pose[:, :3] = tray_center + trocar_2_new_relative_pos # Also rotate trocar orientations - trocar_1_new_state[:, 3:7] = quat_mul(delta_quat, trocar_1_default_state[:, 3:7]) - trocar_2_new_state[:, 3:7] = quat_mul(delta_quat, trocar_2_default_state[:, 3:7]) + trocar_1_new_pose[:, 3:7] = quat_mul(delta_quat, trocar_1_default_pose[:, 3:7]) + trocar_2_new_pose[:, 3:7] = quat_mul(delta_quat, trocar_2_default_pose[:, 3:7]) zero_velocity = torch.zeros(len(env_ids), 6, device=env.device) # [lin_vel(3), ang_vel(3)] - tray.write_root_pose_to_sim_index(root_pose=tray_new_state[:, :7], env_ids=env_ids) - trocar_1.write_root_pose_to_sim_index(root_pose=trocar_1_new_state[:, :7], env_ids=env_ids) - trocar_2.write_root_pose_to_sim_index(root_pose=trocar_2_new_state[:, :7], env_ids=env_ids) + tray.write_root_pose_to_sim_index(root_pose=tray_new_pose, env_ids=env_ids) + trocar_1.write_root_pose_to_sim_index(root_pose=trocar_1_new_pose, env_ids=env_ids) + trocar_2.write_root_pose_to_sim_index(root_pose=trocar_2_new_pose, env_ids=env_ids) tray.write_root_velocity_to_sim_index(root_velocity=zero_velocity, env_ids=env_ids) trocar_1.write_root_velocity_to_sim_index(root_velocity=zero_velocity, env_ids=env_ids) @@ -252,7 +246,8 @@ def reset_robot_to_default_joint_positions( robot.write_joint_position_to_sim_index(position=default_joint_pos, env_ids=env_ids) robot.write_joint_velocity_to_sim_index(velocity=default_joint_vel, env_ids=env_ids) - # Also reset root state - default_root_state = robot.data.default_root_state.torch[env_ids].clone() - robot.write_root_pose_to_sim_index(root_pose=default_root_state[:, :7], env_ids=env_ids) - robot.write_root_velocity_to_sim_index(root_velocity=default_root_state[:, 7:13], env_ids=env_ids) + # Also reset root pose and velocity + default_root_pose = robot.data.default_root_pose.torch[env_ids].clone() + default_root_vel = robot.data.default_root_vel.torch[env_ids].clone() + robot.write_root_pose_to_sim_index(root_pose=default_root_pose, env_ids=env_ids) + robot.write_root_velocity_to_sim_index(root_velocity=default_root_vel, env_ids=env_ids) diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py index 4caba39808e9..504d9caba67d 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/rewards.py @@ -5,6 +5,8 @@ from __future__ import annotations +import logging +from dataclasses import dataclass, field from typing import TYPE_CHECKING import torch @@ -16,7 +18,10 @@ if TYPE_CHECKING: from isaaclab.envs import ManagerBasedRLEnv +logger = logging.getLogger(__name__) + __all__ = [ + "AssembleTrocarState", "update_task_stage", "lift_trocars_reward", "trocar_tip_alignment_reward", @@ -25,60 +30,79 @@ ] -def get_task_stage(env: ManagerBasedRLEnv) -> torch.Tensor: - """Get or initialize task stage tracker for each environment. +@dataclass +class AssembleTrocarState: + """Namespaced task state for the assemble-trocar environment. - Stage 0: Initial state (need to lift) - Stage 1: Lifted (need to find hole - tip alignment) - Stage 2: Hole found (need to insert - push in) - Stage 3: Inserted (need to place) - Stage 4: Placed (task complete) + Holds per-env stage tracking, reward caches, and debug bookkeeping. + Attached to the env as ``env.assemble_trocar_state`` and initialised + lazily on first access via :func:`get_assemble_trocar_state`. - Returns: - torch.Tensor: Current stage for each environment (num_envs,) + Stage semantics: + 0 - Initial (need to lift) + 1 - Lifted (need to find hole / tip alignment) + 2 - Hole found (need to insert / push in) + 3 - Inserted (need to place) + 4 - Placed (task complete) """ - if not hasattr(env, "_task_stage"): - env._task_stage = torch.zeros(env.num_envs, dtype=torch.long, device=env.device) - return env._task_stage + task_stage: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + # Sparse-reward previous-stage trackers (one per reward term) + prev_stage_lift: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + prev_stage_tip: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + prev_stage_insert: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + prev_stage_place: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + # Dense-reward locked caches + lift_reward_locked: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + tip_reward_locked: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + insertion_reward_locked: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + placement_reward_locked: torch.Tensor = field(default_factory=lambda: torch.empty(0)) + # Cached tip offsets (populated on first call to get_trocar_tip_position) + tip_offset_trocar_1: torch.Tensor | None = None + tip_offset_trocar_2: torch.Tensor | None = None + # Debug throttle + last_debug_print_step: int = -1 + + +def get_assemble_trocar_state(env: ManagerBasedRLEnv) -> AssembleTrocarState: + """Get or lazily initialise the :class:`AssembleTrocarState` on *env*.""" + if not hasattr(env, "assemble_trocar_state"): + s = AssembleTrocarState( + task_stage=torch.zeros(env.num_envs, dtype=torch.long, device=env.device), + prev_stage_lift=torch.zeros(env.num_envs, dtype=torch.long, device=env.device), + prev_stage_tip=torch.zeros(env.num_envs, dtype=torch.long, device=env.device), + prev_stage_insert=torch.zeros(env.num_envs, dtype=torch.long, device=env.device), + prev_stage_place=torch.zeros(env.num_envs, dtype=torch.long, device=env.device), + lift_reward_locked=torch.zeros(env.num_envs, device=env.device), + tip_reward_locked=torch.zeros(env.num_envs, device=env.device), + insertion_reward_locked=torch.zeros(env.num_envs, device=env.device), + placement_reward_locked=torch.zeros(env.num_envs, device=env.device), + ) + env.assemble_trocar_state = s + return env.assemble_trocar_state -def should_print_debug(env: ManagerBasedRLEnv, print_interval: int = 50, print_log: bool = True) -> bool: - """Check if debug info should be printed based on episode step counter. - Uses the environment's built-in episode_length_buf to track steps, - and ensures each step only prints once (first call). +def get_task_stage(env: ManagerBasedRLEnv) -> torch.Tensor: + """Return the current per-env task stage tensor.""" + return get_assemble_trocar_state(env).task_stage - Args: - env: Environment instance - print_interval: Print every N steps - Returns: - bool: True if should print (only on first call per step) - """ - # Hard gate: allow callers to disable all logs from this module. +def should_print_debug(env: ManagerBasedRLEnv, print_interval: int = 50, print_log: bool = True) -> bool: + """Check if debug info should be logged based on episode step counter.""" if not print_log: return False - - # Use environment's episode step counter (standard in Isaac Lab) if not hasattr(env, "episode_length_buf"): return False current_step = env.episode_length_buf[0].item() - - # Skip step 0 and non-interval steps if current_step == 0 or current_step % print_interval != 0: return False - # Track last printed step to avoid duplicate prints in same step - if not hasattr(env, "_last_debug_print_step"): - env._last_debug_print_step = -1 - - # Only print once per step (on first function call) - if env._last_debug_print_step == current_step: - return False # Already printed this step + state = get_assemble_trocar_state(env) + if state.last_debug_print_step == current_step: + return False - # Mark this step as printed and return True - env._last_debug_print_step = current_step + state.last_debug_print_step = current_step return True @@ -102,8 +126,11 @@ def update_task_stage( This function checks conditions and advances stages automatically. Once a stage is completed, it never goes back. + Returns a zero-valued tensor (num_envs,) so it can be used as a + weight=0 reward term to run before the actual reward terms. """ - stage = get_task_stage(env) + state = get_assemble_trocar_state(env) + stage = state.task_stage obj1: RigidObject = env.scene[asset_cfg1.name] obj2: RigidObject = env.scene[asset_cfg2.name] @@ -183,10 +210,10 @@ def update_task_stage( if print_log and (stage != old_stage).any(): for env_id in range(env.num_envs): if stage[env_id] != old_stage[env_id]: - print(f"Env {env_id}: Stage {old_stage[env_id].item()} → {stage[env_id].item()}") + logger.debug("Env %d: Stage %d → %d", env_id, old_stage[env_id].item(), stage[env_id].item()) - env._task_stage = stage - return stage + state.task_stage = stage + return torch.zeros(env.num_envs, device=env.device) def lift_trocars_reward( @@ -195,14 +222,6 @@ def lift_trocars_reward( lift_threshold: float = 0.05, asset_cfg1: SceneEntityCfg = SceneEntityCfg("trocar_1"), asset_cfg2: SceneEntityCfg = SceneEntityCfg("trocar_2"), - tip_align_threshold: float = 0.015, - insertion_dist_threshold: float = 0.035, - insertion_angle_threshold: float = 0.17, - placement_x_min: float = -1.8, - placement_x_max: float = -1.4, - placement_y_min: float = 1.5, - placement_y_max: float = 1.8, - placement_z_min: float = 0.9, use_sparse_reward: bool = True, print_log: bool = False, ) -> torch.Tensor: @@ -213,85 +232,48 @@ def lift_trocars_reward( Args: use_sparse_reward: If True, only give reward (1.0) when stage transitions from 0->1. If False, give continuous reward based on current state. - print_log: If True, print debug information. + print_log: If True, log debug information. """ - # Update task stage first - check ALL stage transitions once per step - stage = update_task_stage( - env, - asset_cfg1, - asset_cfg2, - table_height, - lift_threshold, - tip_align_threshold, - insertion_dist_threshold, - insertion_angle_threshold, - placement_x_min, - placement_x_max, - placement_y_min, - placement_y_max, - placement_z_min, - print_log=print_log, - ) + s = get_assemble_trocar_state(env) + stage = s.task_stage - # Get the rigid objects from the scene obj1: RigidObject = env.scene[asset_cfg1.name] obj2: RigidObject = env.scene[asset_cfg2.name] - # Get positions (num_envs, 3) pos1 = obj1.data.root_pos_w.torch pos2 = obj2.data.root_pos_w.torch target_z = table_height + lift_threshold - # Check if lifted is_lifted_1 = pos1[:, 2] > target_z is_lifted_2 = pos2[:, 2] > target_z both_lifted = is_lifted_1 & is_lifted_2 if use_sparse_reward: - # Sparse reward mode: give 1.0 ONLY when stage transitions from 0 to 1 - # Track previous stage - if not hasattr(env, "_prev_stage_lift"): - # Initialize prev_stage to current stage to avoid false positives on first call - env._prev_stage_lift = stage.clone() - - # Reward = 1.0 only on transition step (prev_stage=0, curr_stage=1) - stage_just_completed = (env._prev_stage_lift == 0) & (stage >= 1) + stage_just_completed = (s.prev_stage_lift == 0) & (stage >= 1) reward = torch.where( stage_just_completed, torch.ones(env.num_envs, device=env.device) / env.step_dt, torch.zeros(env.num_envs, device=env.device), ) - - # Update previous stage for next step - env._prev_stage_lift = stage.clone() + s.prev_stage_lift = stage.clone() else: - # Dense reward mode: continuous reward with locking for continuity - # Initialize locked reward cache - if not hasattr(env, "_lift_reward_locked"): - env._lift_reward_locked = torch.zeros(env.num_envs, device=env.device) - - # Current reward value current_reward = both_lifted.float() - - # Lock the reward when transitioning to stage 1 - env._lift_reward_locked = torch.where( - (stage >= 1) & (env._lift_reward_locked == 0), - current_reward, # Lock at current value when stage changes - env._lift_reward_locked, + s.lift_reward_locked = torch.where( + (stage >= 1) & (s.lift_reward_locked == 0), + current_reward, + s.lift_reward_locked, ) + reward = torch.where(stage == 0, current_reward, s.lift_reward_locked) - # Stage 0: give reward based on current state - # Stage >= 1: return locked value (preserves continuity) - reward = torch.where(stage == 0, current_reward, env._lift_reward_locked) - - # Print debug info periodically (every 50 steps) if should_print_debug(env, print_log=print_log): mode_str = "Sparse" if use_sparse_reward else "Dense" - print( - f" Stage: {stage[0].item()}" - f" | Lift ({mode_str}): {reward[0].item():.2f}" - f" | z1: {pos1[0, 2]:.3f}" - f" | z2: {pos2[0, 2]:.3f}" + logger.debug( + " Stage: %d | Lift (%s): %.2f | z1: %.3f | z2: %.3f", + stage[0].item(), + mode_str, + reward[0].item(), + pos1[0, 2], + pos2[0, 2], ) return reward @@ -317,12 +299,16 @@ def get_trocar_tip_position( import isaaclab.utils.math as math_utils - # Cache the tip offset to avoid recalculating every step - cache_key = f"_tip_offset_{asset_cfg.name}" - if not hasattr(env, cache_key): - # Get tip's local offset relative to root (only calculate once, from USD) - # Note: Local offset is the same in all environments (same asset structure), so get from env_0 - stage = env.scene.stage + # Cache the tip offset to avoid recalculating every step. + # The local offset from root to tip is a static geometric property of the USD + # asset and is identical across all replicated envs. We read it once from env_0's + # USD prim, then apply it per-env at runtime using each env's dynamic root pose. + s = get_assemble_trocar_state(env) + cache_attr = f"tip_offset_{asset_cfg.name}" + tip_offset_local = getattr(s, cache_attr, None) + + if tip_offset_local is None: + usd_stage = env.scene.stage if asset_cfg.name == "trocar_1": tip_path = "/World/envs/env_0/trocar_1/Trocar002/White_pos" @@ -333,11 +319,11 @@ def get_trocar_tip_position( else: raise ValueError(f"Invalid asset configuration: {asset_cfg.name}") - tip_prim = stage.GetPrimAtPath(tip_path) - root_prim = stage.GetPrimAtPath(root_path) + tip_prim = usd_stage.GetPrimAtPath(tip_path) + root_prim = usd_stage.GetPrimAtPath(root_path) if not tip_prim.IsValid(): - print(f"Warning: Tip prim not found at {tip_path}, using zero offset") + logger.warning("Tip prim not found at %s, using zero offset", tip_path) tip_offset_local = torch.zeros(3, dtype=torch.float32, device=env.device) else: tip_xform = UsdGeom.Xformable(tip_prim) @@ -358,8 +344,6 @@ def get_trocar_tip_position( tip_world_pos[2] - root_world_pos[2], ) - # Convert world coordinate offset to root's local coordinate system - # Using inverse of root rotation: local_offset = root_quat^{-1} * world_offset root_quat_inv = root_rotation_quat.GetInverse() tip_offset_local_gf = root_quat_inv.Transform(tip_offset_world) @@ -369,12 +353,9 @@ def get_trocar_tip_position( device=env.device, ) - print(f"Cached tip offset for {asset_cfg.name}: {tip_offset_local}") + logger.debug("Cached tip offset for %s: %s", asset_cfg.name, tip_offset_local) - # Cache the offset - setattr(env, cache_key, tip_offset_local) - - tip_offset_local = getattr(env, cache_key) + setattr(s, cache_attr, tip_offset_local) obj: RigidObject = env.scene[asset_cfg.name] root_pos_w = obj.data.root_pos_w.torch # Shape: (num_envs, 3) @@ -414,67 +395,49 @@ def trocar_tip_alignment_reward( Returns: torch.Tensor: Reward tensor (num_envs,) """ - # Read current stage - stage = get_task_stage(env) + s = get_assemble_trocar_state(env) + stage = s.task_stage - # Get tip positions tip_pos1 = get_trocar_tip_position(env, asset_cfg1) tip_pos2 = get_trocar_tip_position(env, asset_cfg2) - - # Calculate tip distance - tip_dist = torch.norm(tip_pos1 - tip_pos2, dim=-1) # (num_envs,) + tip_dist = torch.norm(tip_pos1 - tip_pos2, dim=-1) if use_sparse_reward: - # Sparse reward mode: give 1.0 ONLY when stage transitions from 1 to 2 - # Track previous stage - if not hasattr(env, "_prev_stage_tip"): - # Initialize prev_stage to current stage to avoid false positives on first call - env._prev_stage_tip = stage.clone() - - # Reward = 1.0 only on transition step (prev_stage=1, curr_stage=2) - stage_just_completed = (env._prev_stage_tip == 1) & (stage >= 2) + stage_just_completed = (s.prev_stage_tip == 1) & (stage >= 2) reward = torch.where( stage_just_completed, torch.ones(env.num_envs, device=env.device) / env.step_dt, torch.zeros(env.num_envs, device=env.device), ) - - # Update previous stage for next step - env._prev_stage_tip = stage.clone() + s.prev_stage_tip = stage.clone() else: - # Dense reward mode: continuous reward with locking for continuity - # Reward: exponential decay based on tip distance tip_reward = torch.exp(-torch.square(tip_dist) / (2 * tip_dist_std**2)) - - # Initialize locked reward cache - if not hasattr(env, "_tip_reward_locked"): - env._tip_reward_locked = torch.zeros(env.num_envs, device=env.device) - - # Lock the reward when transitioning to stage 2 - env._tip_reward_locked = torch.where( - (stage >= 2) & (env._tip_reward_locked == 0), - tip_reward, # Lock at current value when stage changes - env._tip_reward_locked, + s.tip_reward_locked = torch.where( + (stage >= 2) & (s.tip_reward_locked == 0), + tip_reward, + s.tip_reward_locked, ) - - # Stage 0: no reward (not lifted yet) - # Stage 1: give reward based on tip distance - # Stage >= 2: return locked value (preserves continuity) reward = torch.where( stage < 1, torch.zeros(env.num_envs, device=env.device), - torch.where(stage == 1, tip_reward, env._tip_reward_locked), + torch.where(stage == 1, tip_reward, s.tip_reward_locked), ) # Debug info if should_print_debug(env, print_log=print_log) and stage[0].item() == 1: mode_str = "Sparse" if use_sparse_reward else "Dense" - print( - f" └─ Stage 1 (Find Hole, {mode_str}):" - f" tip_pos_1=({tip_pos1[0, 0]:.3f}, {tip_pos1[0, 1]:.3f}, {tip_pos1[0, 2]:.3f})" - f" | tip_pos_2=({tip_pos2[0, 0]:.3f}, {tip_pos2[0, 1]:.3f}, {tip_pos2[0, 2]:.3f})" - f" | tip_d={tip_dist[0].item():.4f}" - f" | reward={reward[0].item():.3f}" + logger.debug( + " Stage 1 (Find Hole, %s): tip_pos_1=(%.3f, %.3f, %.3f)" + " | tip_pos_2=(%.3f, %.3f, %.3f) | tip_d=%.4f | reward=%.3f", + mode_str, + tip_pos1[0, 0], + tip_pos1[0, 1], + tip_pos1[0, 2], + tip_pos2[0, 0], + tip_pos2[0, 1], + tip_pos2[0, 2], + tip_dist[0].item(), + reward[0].item(), ) return reward @@ -511,21 +474,18 @@ def trocar_insertion_reward( Returns: torch.Tensor: Reward tensor (num_envs,) """ - # Read current stage - stage = get_task_stage(env) + s = get_assemble_trocar_state(env) + stage = s.task_stage obj1: RigidObject = env.scene[asset_cfg1.name] obj2: RigidObject = env.scene[asset_cfg2.name] - # Positions and Rotations pos1 = obj1.data.root_pos_w.torch quat1 = obj1.data.root_quat_w.torch pos2 = obj2.data.root_pos_w.torch quat2 = obj2.data.root_quat_w.torch - # Calculate center distance - center_dist = torch.norm(pos1 - pos2, dim=-1) # (num_envs,) + center_dist = torch.norm(pos1 - pos2, dim=-1) - # Calculate alignment (parallelism) target_axis1 = torch.tensor([0.0, 0.0, -1.0], device=env.device).repeat(env.num_envs, 1) target_axis2 = torch.tensor([0.0, 0.0, -1.0], device=env.device).repeat(env.num_envs, 1) @@ -535,67 +495,44 @@ def trocar_insertion_reward( dot_prod = torch.sum(axis1 * axis2, dim=-1) abs_dot = torch.clamp(torch.abs(dot_prod), max=1.0) angle = torch.acos(abs_dot) - is_parallel = angle < angle_threshold if use_sparse_reward: - # Sparse reward mode: give 1.0 ONLY when stage transitions from 2 to 3 - # Track previous stage - if not hasattr(env, "_prev_stage_insert"): - # Initialize prev_stage to current stage to avoid false positives on first call - env._prev_stage_insert = stage.clone() - - # Reward = 1.0 only on transition step (prev_stage=2, curr_stage=3) - stage_just_completed = (env._prev_stage_insert == 2) & (stage >= 3) + stage_just_completed = (s.prev_stage_insert == 2) & (stage >= 3) reward = torch.where( stage_just_completed, torch.ones(env.num_envs, device=env.device) / env.step_dt, torch.zeros(env.num_envs, device=env.device), ) - - # Update previous stage for next step - env._prev_stage_insert = stage.clone() + s.prev_stage_insert = stage.clone() else: - # Dense reward mode: continuous reward with locking for continuity - # Reward component 1: Alignment (parallelism) excess_angle = torch.clamp(angle - angle_threshold, min=0.0) align_reward = torch.exp(-torch.square(excess_angle) / (2 * angle_std**2)) - - # Reward component 2: Center distance (pushing in) - # Only reward center distance if already parallel center_reward = torch.exp(-torch.square(center_dist) / (2 * center_dist_std**2)) center_reward = torch.where(is_parallel, center_reward, torch.zeros_like(center_reward)) - - # Combined reward: alignment * center_distance insertion_reward = align_reward * center_reward - # Initialize locked reward cache - if not hasattr(env, "_insertion_reward_locked"): - env._insertion_reward_locked = torch.zeros(env.num_envs, device=env.device) - - # Lock the reward when transitioning to stage 3 - env._insertion_reward_locked = torch.where( - (stage >= 3) & (env._insertion_reward_locked == 0), - insertion_reward, # Lock at current value when stage changes - env._insertion_reward_locked, + s.insertion_reward_locked = torch.where( + (stage >= 3) & (s.insertion_reward_locked == 0), + insertion_reward, + s.insertion_reward_locked, ) - - # Stage < 2: no reward (not ready yet) - # Stage 2: give reward based on current state - # Stage >= 3: return locked value (preserves continuity) reward = torch.where( stage < 2, torch.zeros(env.num_envs, device=env.device), - torch.where(stage == 2, insertion_reward, env._insertion_reward_locked), + torch.where(stage == 2, insertion_reward, s.insertion_reward_locked), ) # Debug info if should_print_debug(env, print_log=print_log) and stage[0].item() == 2: mode_str = "Sparse" if use_sparse_reward else "Dense" - print( - f" └─ Stage 2 (Push In, {mode_str}): angle={angle[0].item():.3f} | " - f"center_d={center_dist[0].item():.4f} | " - f"is_parallel={is_parallel.item()} | reward={reward[0].item():.3f}" + logger.debug( + " Stage 2 (Push In, %s): angle=%.3f | center_d=%.4f | is_parallel=%s | reward=%.3f", + mode_str, + angle[0].item(), + center_dist[0].item(), + is_parallel[0].item(), + reward[0].item(), ) return reward @@ -631,86 +568,67 @@ def trocar_placement_reward( Returns: torch.Tensor: Reward tensor (num_envs,) """ - # Read current stage - stage = get_task_stage(env) + s = get_assemble_trocar_state(env) + stage = s.task_stage - # Get rigid objects obj1: RigidObject = env.scene[asset_cfg1.name] obj2: RigidObject = env.scene[asset_cfg2.name] - # Get root positions (num_envs, 3) pos1 = obj1.data.root_pos_w.torch pos2 = obj2.data.root_pos_w.torch - # Get environment origins to handle multi-env spatial offsets - env_origins = env.scene.env_origins # shape: (num_envs, 3) + env_origins = env.scene.env_origins - # Adjust target zone relative to each environment's origin - curr_x_min = env_origins[:, 0] + min(x_min, x_max) # shape: (num_envs,) + curr_x_min = env_origins[:, 0] + min(x_min, x_max) curr_x_max = env_origins[:, 0] + max(x_min, x_max) curr_y_min = env_origins[:, 1] + min(y_min, y_max) curr_y_max = env_origins[:, 1] + max(y_min, y_max) - # Check bounds for object 1 - in_x_1 = (pos1[:, 0] >= curr_x_min) & (pos1[:, 0] <= curr_x_max) - in_y_1 = (pos1[:, 1] >= curr_y_min) & (pos1[:, 1] <= curr_y_max) - in_z_1 = pos1[:, 2] < z_min - in_zone_1 = in_x_1 & in_y_1 & in_z_1 - - # Check bounds for object 2 - in_x_2 = (pos2[:, 0] >= curr_x_min) & (pos2[:, 0] <= curr_x_max) - in_y_2 = (pos2[:, 1] >= curr_y_min) & (pos2[:, 1] <= curr_y_max) - in_z_2 = pos2[:, 2] < z_min - in_zone_2 = in_x_2 & in_y_2 & in_z_2 - + in_zone_1 = ( + (pos1[:, 0] >= curr_x_min) + & (pos1[:, 0] <= curr_x_max) + & (pos1[:, 1] >= curr_y_min) + & (pos1[:, 1] <= curr_y_max) + & (pos1[:, 2] < z_min) + ) + in_zone_2 = ( + (pos2[:, 0] >= curr_x_min) + & (pos2[:, 0] <= curr_x_max) + & (pos2[:, 1] >= curr_y_min) + & (pos2[:, 1] <= curr_y_max) + & (pos2[:, 2] < z_min) + ) both_in_zone = in_zone_1 & in_zone_2 if use_sparse_reward: - # Sparse reward mode: give 1.0 ONLY when stage transitions from 3 to 4 - # Track previous stage - if not hasattr(env, "_prev_stage_place"): - # Initialize prev_stage to current stage to avoid false positives on first call - env._prev_stage_place = stage.clone() - - # Reward = 1.0 only on transition step (prev_stage=3, curr_stage=4) - stage_just_completed = (env._prev_stage_place == 3) & (stage >= 4) + stage_just_completed = (s.prev_stage_place == 3) & (stage >= 4) reward = torch.where( stage_just_completed, torch.ones(env.num_envs, device=env.device) / env.step_dt, torch.zeros(env.num_envs, device=env.device), ) - - # Update previous stage for next step - env._prev_stage_place = stage.clone() + s.prev_stage_place = stage.clone() else: - # Dense reward mode: continuous reward with locking for continuity placement_reward = both_in_zone.float() - - # Initialize locked reward cache - if not hasattr(env, "_placement_reward_locked"): - env._placement_reward_locked = torch.zeros(env.num_envs, device=env.device) - - # Lock the reward when transitioning to stage 4 - env._placement_reward_locked = torch.where( - (stage >= 4) & (env._placement_reward_locked == 0), - placement_reward, # Lock at current value when stage changes - env._placement_reward_locked, + s.placement_reward_locked = torch.where( + (stage >= 4) & (s.placement_reward_locked == 0), + placement_reward, + s.placement_reward_locked, ) - - # Stage < 3: no reward (not inserted yet) - # Stage 3: give reward based on current state - # Stage >= 4: return locked value (preserves continuity) reward = torch.where( stage < 3, torch.zeros(env.num_envs, device=env.device), - torch.where(stage == 3, placement_reward, env._placement_reward_locked), + torch.where(stage == 3, placement_reward, s.placement_reward_locked), ) # Debug info if should_print_debug(env, print_log=print_log) and stage[0].item() == 3: mode_str = "Sparse" if use_sparse_reward else "Dense" - print( - f" └─ Stage 3 (Placement, {mode_str}): in_zone={both_in_zone[0].item()} | " - f"z1={pos1[0, 2]:.3f} | z2={pos2[0, 2]:.3f}" + logger.debug( + " Stage 3 (Placement, %s): in_zone=%s | z1=%.3f | z2=%.3f", + mode_str, + both_in_zone[0].item(), + pos1[0, 2], + pos2[0, 2], ) return reward diff --git a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py index 02257843fd33..12b70ae473bd 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/assemble_trocar/mdp/terminations.py @@ -5,6 +5,7 @@ from __future__ import annotations +import logging from typing import TYPE_CHECKING import torch @@ -17,6 +18,8 @@ if TYPE_CHECKING: from isaaclab.envs import ManagerBasedRLEnv +logger = logging.getLogger(__name__) + def object_drop_termination( env: ManagerBasedRLEnv, @@ -53,7 +56,7 @@ def object_drop_termination( dropped = dropped_1 | dropped_2 if print_log and dropped.any(): - print(f"Drop termination triggered for {dropped.sum().item()} environment(s)") + logger.debug("Drop termination triggered for %d environment(s)", dropped.sum().item()) return dropped @@ -72,6 +75,6 @@ def task_success_termination( task_complete = stage >= success_stage if print_log and task_complete.any(): - print(f"Task completed in {task_complete.sum().item()} environment(s)!") + logger.info("Task completed in %d environment(s)!", task_complete.sum().item()) return task_complete