From 2d532849936399e69f0a3f75e4ab3f3b4ee2d483 Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Mon, 25 Aug 2025 17:23:08 +0800 Subject: [PATCH 1/9] update deeproboticslab changes --- .../robot_lab/assets/deeprobotics.py | 8 ++-- .../deeprobotics_lite3/rough_env_cfg.py | 44 +++++++++++-------- .../wheeled/deeprobotics_m20/rough_env_cfg.py | 2 +- .../locomotion/velocity/mdp/rewards.py | 26 +++++------ .../locomotion/velocity/velocity_env_cfg.py | 35 ++++++++++----- 5 files changed, 66 insertions(+), 49 deletions(-) diff --git a/source/robot_lab/robot_lab/assets/deeprobotics.py b/source/robot_lab/robot_lab/assets/deeprobotics.py index 8d6a1abf..557784f9 100644 --- a/source/robot_lab/robot_lab/assets/deeprobotics.py +++ b/source/robot_lab/robot_lab/assets/deeprobotics.py @@ -33,7 +33,7 @@ max_depenetration_velocity=1.0, ), articulation_props=sim_utils.ArticulationRootPropertiesCfg( - enabled_self_collisions=False, solver_position_iteration_count=4, solver_velocity_iteration_count=0 + enabled_self_collisions=False, solver_position_iteration_count=4, solver_velocity_iteration_count=1 ), ), init_state=ArticulationCfg.InitialStateCfg( @@ -45,7 +45,7 @@ }, joint_vel={".*": 0.0}, ), - soft_joint_pos_limit_factor=0.9, + soft_joint_pos_limit_factor=0.99, actuators={ "Hip": DCMotorCfg( joint_names_expr=[".*_Hip[X,Y]_joint"], @@ -88,7 +88,7 @@ max_depenetration_velocity=1.0, ), articulation_props=sim_utils.ArticulationRootPropertiesCfg( - enabled_self_collisions=False, solver_position_iteration_count=4, solver_velocity_iteration_count=0 + enabled_self_collisions=False, solver_position_iteration_count=4, solver_velocity_iteration_count=1 ), ), init_state=ArticulationCfg.InitialStateCfg( @@ -103,7 +103,7 @@ }, joint_vel={".*": 0.0}, ), - soft_joint_pos_limit_factor=0.9, + soft_joint_pos_limit_factor=0.99, actuators={ "joint": DCMotorCfg( joint_names_expr=[".*hipx_joint", ".*hipy_joint", ".*knee_joint"], diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py index f6aca499..f7964947 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py @@ -32,6 +32,7 @@ def __post_init__(self): self.scene.robot = DEEPROBOTICS_LITE3_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") self.scene.height_scanner.prim_path = "{ENV_REGEX_NS}/Robot/" + self.base_link_name self.scene.height_scanner_base.prim_path = "{ENV_REGEX_NS}/Robot/" + self.base_link_name + self.scene.height_scanner.pattern_cfg.resolution = 0.07 # ------------------------------Observations------------------------------ self.observations.policy.base_lin_vel.scale = 2.0 @@ -71,6 +72,11 @@ def __post_init__(self): self.events.randomize_rigid_body_mass.params["asset_cfg"].body_names = [self.base_link_name] self.events.randomize_com_positions.params["asset_cfg"].body_names = [self.base_link_name] self.events.randomize_apply_external_force_torque.params["asset_cfg"].body_names = [self.base_link_name] + self.events.randomize_apply_external_force_torque = None + self.events.randomize_push_robot = None + self.scene.terrain.terrain_generator.sub_terrains["boxes"].grid_height_range = (0.025, 0.1) + self.scene.terrain.terrain_generator.sub_terrains["random_rough"].noise_range = (0.01, 0.06) + self.scene.terrain.terrain_generator.sub_terrains["random_rough"].noise_step = 0.01 # ------------------------------Rewards------------------------------ # General @@ -79,8 +85,8 @@ def __post_init__(self): # Root penalties self.rewards.lin_vel_z_l2.weight = -2.0 self.rewards.ang_vel_xy_l2.weight = -0.05 - self.rewards.flat_orientation_l2.weight = 0 - self.rewards.base_height_l2.weight = 0 + self.rewards.flat_orientation_l2.weight = -5.0 + self.rewards.base_height_l2.weight = -10.0 self.rewards.base_height_l2.params["target_height"] = 0.35 self.rewards.base_height_l2.params["asset_cfg"].body_names = [self.base_link_name] self.rewards.body_lin_acc_l2.weight = 0 @@ -89,14 +95,14 @@ def __post_init__(self): # Joint penalties self.rewards.joint_torques_l2.weight = -2.5e-5 self.rewards.joint_vel_l2.weight = 0 - self.rewards.joint_acc_l2.weight = -2.5e-7 - # self.rewards.create_joint_deviation_l1_rewterm("joint_deviation_hip_l1", -0.2, [".*_hip_joint"]) + self.rewards.joint_acc_l2.weight = -1e-8 + self.rewards.create_joint_deviation_l1_rewterm("joint_deviation_hip_l1", -0.2, [".*HipX.*"]) self.rewards.joint_pos_limits.weight = -5.0 self.rewards.joint_vel_limits.weight = 0 self.rewards.joint_power.weight = -2e-5 - self.rewards.stand_still_without_cmd.weight = -2.0 - self.rewards.joint_pos_penalty.weight = -1.0 - self.rewards.joint_mirror.weight = -0.05 + self.rewards.stand_still_without_cmd.weight = -0.4 + self.rewards.joint_pos_penalty.weight = 0 + self.rewards.joint_mirror.weight = 0 self.rewards.joint_mirror.params["mirror_joints"] = [ ["FL_(HipX|HipY|Knee).*", "HR_(HipX|HipY|Knee).*"], ["FR_(HipX|HipY|Knee).*", "HL_(HipX|HipY|Knee).*"], @@ -106,33 +112,33 @@ def __post_init__(self): self.rewards.action_rate_l2.weight = -0.01 # Contact sensor - self.rewards.undesired_contacts.weight = -1.0 + self.rewards.undesired_contacts.weight = -0.5 self.rewards.undesired_contacts.params["sensor_cfg"].body_names = [f"^(?!.*{self.foot_link_name}).*"] - self.rewards.contact_forces.weight = -1.5e-4 + self.rewards.contact_forces.weight = 0 self.rewards.contact_forces.params["sensor_cfg"].body_names = [self.foot_link_name] # Velocity-tracking rewards - self.rewards.track_lin_vel_xy_exp.weight = 3.0 - self.rewards.track_ang_vel_z_exp.weight = 1.5 + self.rewards.track_lin_vel_xy_exp.weight = 1.2 + self.rewards.track_ang_vel_z_exp.weight = 0.6 # Others - self.rewards.feet_air_time.weight = 0 + self.rewards.feet_air_time.weight = 1.0 self.rewards.feet_air_time.params["threshold"] = 0.5 self.rewards.feet_air_time.params["sensor_cfg"].body_names = [self.foot_link_name] self.rewards.feet_contact.weight = 0 self.rewards.feet_contact.params["sensor_cfg"].body_names = [self.foot_link_name] - self.rewards.feet_contact_without_cmd.weight = 0.1 + self.rewards.feet_contact_without_cmd.weight = 0 self.rewards.feet_contact_without_cmd.params["sensor_cfg"].body_names = [self.foot_link_name] self.rewards.feet_stumble.weight = 0 self.rewards.feet_stumble.params["sensor_cfg"].body_names = [self.foot_link_name] - self.rewards.feet_slide.weight = 0 + self.rewards.feet_slide.weight = -0.25 self.rewards.feet_slide.params["sensor_cfg"].body_names = [self.foot_link_name] self.rewards.feet_slide.params["asset_cfg"].body_names = [self.foot_link_name] self.rewards.feet_height.weight = 0 self.rewards.feet_height.params["target_height"] = 0.05 self.rewards.feet_height.params["asset_cfg"].body_names = [self.foot_link_name] - self.rewards.feet_height_body.weight = 0 - self.rewards.feet_height_body.params["target_height"] = -0.25 + self.rewards.feet_height_body.weight = -5.0 + self.rewards.feet_height_body.params["target_height"] = -0.35 self.rewards.feet_height_body.params["asset_cfg"].body_names = [self.foot_link_name] self.rewards.feet_gait.weight = 0 self.rewards.feet_gait.params["synced_feet_pair_names"] = (("FL_FOOT", "HR_FOOT"), ("FR_FOOT", "HL_FOOT")) @@ -151,6 +157,6 @@ def __post_init__(self): self.curriculum.command_levels = None # ------------------------------Commands------------------------------ - # self.commands.base_velocity.ranges.lin_vel_x = (-1.5, 1.5) - # self.commands.base_velocity.ranges.lin_vel_y = (-0.8, 0.8) - # self.commands.base_velocity.ranges.ang_vel_z = (-1.5, 1.5) + self.commands.base_velocity.ranges.lin_vel_x = (-1.5, 1.5) + self.commands.base_velocity.ranges.lin_vel_y = (-0.8, 0.8) + self.commands.base_velocity.ranges.ang_vel_z = (-1.5, 1.5) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py index 7b4b7673..b245f419 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py @@ -224,6 +224,6 @@ def __post_init__(self): self.curriculum.command_levels = None # ------------------------------Commands------------------------------ - # self.commands.base_velocity.ranges.lin_vel_x = (-1.5, 1.5) + self.commands.base_velocity.ranges.lin_vel_x = (-4.0, 4.0) # self.commands.base_velocity.ranges.lin_vel_y = (-1.0, 1.0) # self.commands.base_velocity.ranges.ang_vel_z = (-1.5, 1.5) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py index 4d00e7b0..b00928a9 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py @@ -6,6 +6,7 @@ import torch from typing import TYPE_CHECKING +from isaaclab.envs import mdp import isaaclab.utils.math as math_utils from isaaclab.assets import Articulation, RigidObject from isaaclab.managers import ManagerTermBase @@ -89,16 +90,13 @@ def joint_power(env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityC def stand_still_without_cmd( env: ManagerBasedRLEnv, command_name: str, - command_threshold: float, + command_threshold: float = 0.06, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), ) -> torch.Tensor: - """Penalize joint positions that deviate from the default one when no command.""" - # extract the used quantities (to enable type-hinting) - asset: Articulation = env.scene[asset_cfg.name] - # compute out of limits constraints - diff_angle = asset.data.joint_pos[:, asset_cfg.joint_ids] - asset.data.default_joint_pos[:, asset_cfg.joint_ids] - reward = torch.sum(torch.abs(diff_angle), dim=1) - reward *= torch.linalg.norm(env.command_manager.get_command(command_name), dim=1) < command_threshold + """Penalize offsets from the default joint positions when the command is very small.""" + # Penalize motion when command is nearly zero. + reward = mdp.joint_deviation_l1(env, asset_cfg) + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) < command_threshold reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward @@ -114,7 +112,7 @@ def joint_pos_penalty( """Penalize joint position error from default on the articulation.""" # extract the used quantities (to enable type-hinting) asset: Articulation = env.scene[asset_cfg.name] - cmd = torch.linalg.norm(env.command_manager.get_command(command_name), dim=1) + cmd = torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) body_vel = torch.linalg.norm(asset.data.root_lin_vel_b[:, :2], dim=1) running_reward = torch.linalg.norm( (asset.data.joint_pos[:, asset_cfg.joint_ids] - asset.data.default_joint_pos[:, asset_cfg.joint_ids]), dim=1 @@ -137,7 +135,7 @@ def wheel_vel_penalty( asset_cfg: SceneEntityCfg = SceneEntityCfg("robot"), ) -> torch.Tensor: asset: Articulation = env.scene[asset_cfg.name] - cmd = torch.linalg.norm(env.command_manager.get_command(command_name), dim=1) + cmd = torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) body_vel = torch.linalg.norm(asset.data.root_lin_vel_b[:, :2], dim=1) joint_vel = torch.abs(asset.data.joint_vel[:, asset_cfg.joint_ids]) contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name] @@ -406,7 +404,7 @@ def feet_contact( contact_num = torch.sum(contact, dim=1) reward = (contact_num != expect_contact_num).float() # no reward for zero command - reward *= torch.linalg.norm(env.command_manager.get_command(command_name), dim=1) > 0.1 + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.5 reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward @@ -418,7 +416,7 @@ def feet_contact_without_cmd(env: ManagerBasedRLEnv, command_name: str, sensor_c # compute the reward contact = contact_sensor.compute_first_contact(env.step_dt)[:, sensor_cfg.body_ids] reward = torch.sum(contact, dim=-1).float() - reward *= torch.linalg.norm(env.command_manager.get_command(command_name), dim=1) < 0.1 + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) < 0.5 reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward @@ -517,7 +515,7 @@ def feet_height( ) reward = torch.sum(foot_z_target_error * foot_velocity_tanh, dim=1) # no reward for zero command - reward *= torch.linalg.norm(env.command_manager.get_command(command_name), dim=1) > 0.1 + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.5 reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward @@ -547,7 +545,7 @@ def feet_height_body( foot_z_target_error = torch.square(footpos_in_body_frame[:, :, 2] - target_height).view(env.num_envs, -1) foot_velocity_tanh = torch.tanh(tanh_mult * torch.norm(footvel_in_body_frame[:, :, :2], dim=2)) reward = torch.sum(foot_z_target_error * foot_velocity_tanh, dim=1) - reward *= torch.linalg.norm(env.command_manager.get_command(command_name), dim=1) > 0.1 + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.5 reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py index 7fed9a13..98c88326 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py @@ -57,6 +57,7 @@ class MySceneCfg(InteractiveSceneCfg): restitution_combine_mode="multiply", static_friction=1.0, dynamic_friction=1.0, + restitution=1.0, ), visual_material=sim_utils.MdlFileCfg( mdl_path=f"{ISAACLAB_NUCLEUS_DIR}/Materials/TilesMarbleSpiderWhiteBrickBondHoned/TilesMarbleSpiderWhiteBrickBondHoned.mdl", @@ -265,10 +266,10 @@ class EventCfg: mode="startup", params={ "asset_cfg": SceneEntityCfg("robot", body_names=".*"), - "static_friction_range": (0.1, 1.0), - "dynamic_friction_range": (0.1, 0.8), - "restitution_range": (0.0, 0.5), - "num_buckets": 64, + "static_friction_range": (0.3, 1.0), + "dynamic_friction_range": (0.3, 0.8), + "restitution_range": (0.0, 0.4), + "num_buckets": 1024, }, ) @@ -279,6 +280,18 @@ class EventCfg: "asset_cfg": SceneEntityCfg("robot", body_names=""), "mass_distribution_params": (-1.0, 3.0), "operation": "add", + "recompute_inertia": True, + }, + ) + + randomize_rigid_body_mass_all_link = EventTerm( + func=mdp.randomize_rigid_body_mass, + mode="startup", + params={ + "asset_cfg": SceneEntityCfg("robot", body_names=".*"), + "mass_distribution_params": (0.7, 1.3), + "operation": "scale", + "recompute_inertia": True, }, ) @@ -297,7 +310,7 @@ class EventCfg: mode="startup", params={ "asset_cfg": SceneEntityCfg("robot", body_names=".*"), - "com_range": {"x": (-0.05, 0.05), "y": (-0.05, 0.05), "z": (-0.05, 0.05)}, + "com_range": {"x": (-0.02, 0.02), "y": (-0.02, 0.02), "z": (-0.02, 0.02)}, }, ) @@ -327,10 +340,10 @@ class EventCfg: mode="reset", params={ "asset_cfg": SceneEntityCfg("robot", joint_names=".*"), - "stiffness_distribution_params": (0.5, 2.0), - "damping_distribution_params": (0.5, 2.0), + "stiffness_distribution_params": (0.7, 1.3), + "damping_distribution_params": (0.7, 1.3), "operation": "scale", - "distribution": "log_uniform", + "distribution": "uniform", }, ) @@ -425,7 +438,7 @@ def create_joint_deviation_l1_rewterm(self, attr_name, weight, joint_names_patte weight=0.0, params={ "command_name": "base_velocity", - "command_threshold": 0.1, + "command_threshold": 0.2, "asset_cfg": SceneEntityCfg("robot", joint_names=".*"), }, ) @@ -438,7 +451,7 @@ def create_joint_deviation_l1_rewterm(self, attr_name, weight, joint_names_patte "asset_cfg": SceneEntityCfg("robot", joint_names=".*"), "stand_still_scale": 5.0, "velocity_threshold": 0.5, - "command_threshold": 0.1, + "command_threshold": 0.2, }, ) @@ -450,7 +463,7 @@ def create_joint_deviation_l1_rewterm(self, attr_name, weight, joint_names_patte "sensor_cfg": SceneEntityCfg("contact_forces", body_names=""), "command_name": "base_velocity", "velocity_threshold": 0.5, - "command_threshold": 0.1, + "command_threshold": 0.2, }, ) From a007b4d0cd54b798e6cee61c7345b19f4b4c8104 Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Mon, 25 Aug 2025 17:28:19 +0800 Subject: [PATCH 2/9] code format --- .../tasks/manager_based/locomotion/velocity/mdp/rewards.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py index b00928a9..9355e460 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py @@ -6,9 +6,9 @@ import torch from typing import TYPE_CHECKING -from isaaclab.envs import mdp import isaaclab.utils.math as math_utils from isaaclab.assets import Articulation, RigidObject +from isaaclab.envs import mdp from isaaclab.managers import ManagerTermBase from isaaclab.managers import RewardTermCfg as RewTerm from isaaclab.managers import SceneEntityCfg From 2bdf400986605591f83f3f15ae955ab7014c22dc Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Tue, 26 Aug 2025 13:42:57 +0800 Subject: [PATCH 3/9] update --- .../robot_lab/robot_lab/assets/deeprobotics.py | 16 +++++++++------- .../deeprobotics_lite3/rough_env_cfg.py | 7 +++++-- .../locomotion/velocity/velocity_env_cfg.py | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/source/robot_lab/robot_lab/assets/deeprobotics.py b/source/robot_lab/robot_lab/assets/deeprobotics.py index 557784f9..8c7637a4 100644 --- a/source/robot_lab/robot_lab/assets/deeprobotics.py +++ b/source/robot_lab/robot_lab/assets/deeprobotics.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 import isaaclab.sim as sim_utils -from isaaclab.actuators import DCMotorCfg +from isaaclab.actuators import DCMotorCfg, DelayedPDActuatorCfg from isaaclab.assets.articulation import ArticulationCfg from robot_lab.assets import ISAACLAB_ASSETS_DATA_DIR @@ -47,23 +47,25 @@ ), soft_joint_pos_limit_factor=0.99, actuators={ - "Hip": DCMotorCfg( + "Hip": DelayedPDActuatorCfg( joint_names_expr=[".*_Hip[X,Y]_joint"], effort_limit=24.0, - saturation_effort=24.0, velocity_limit=26.2, stiffness=30.0, - damping=0.5, + damping=1.0, friction=0.0, + min_delay=0, # physics time steps (min: 5.0*0=00.0ms) + max_delay=5, # physics time steps (max: 5.0*5=25.0ms) ), - "Knee": DCMotorCfg( + "Knee": DelayedPDActuatorCfg( joint_names_expr=[".*_Knee_joint"], effort_limit=36.0, - saturation_effort=36.0, velocity_limit=17.3, stiffness=30.0, - damping=0.5, + damping=1.0, friction=0.0, + min_delay=0, # physics time steps (min: 5.0*0=00.0ms) + max_delay=5, # physics time steps (max: 5.0*5=25.0ms) ), }, ) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py index f7964947..d9cab053 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py @@ -100,7 +100,7 @@ def __post_init__(self): self.rewards.joint_pos_limits.weight = -5.0 self.rewards.joint_vel_limits.weight = 0 self.rewards.joint_power.weight = -2e-5 - self.rewards.stand_still_without_cmd.weight = -0.4 + self.rewards.stand_still_without_cmd.weight = -0.3 self.rewards.joint_pos_penalty.weight = 0 self.rewards.joint_mirror.weight = 0 self.rewards.joint_mirror.params["mirror_joints"] = [ @@ -110,6 +110,7 @@ def __post_init__(self): # Action penalties self.rewards.action_rate_l2.weight = -0.01 + # self.rewards.smoothness_2.weight = -0.004 # Contact sensor self.rewards.undesired_contacts.weight = -0.5 @@ -125,13 +126,15 @@ def __post_init__(self): self.rewards.feet_air_time.weight = 1.0 self.rewards.feet_air_time.params["threshold"] = 0.5 self.rewards.feet_air_time.params["sensor_cfg"].body_names = [self.foot_link_name] + self.rewards.feet_air_time_variance.weight = -4.0 + self.rewards.feet_air_time_variance.params["sensor_cfg"].body_names = [self.foot_link_name] self.rewards.feet_contact.weight = 0 self.rewards.feet_contact.params["sensor_cfg"].body_names = [self.foot_link_name] self.rewards.feet_contact_without_cmd.weight = 0 self.rewards.feet_contact_without_cmd.params["sensor_cfg"].body_names = [self.foot_link_name] self.rewards.feet_stumble.weight = 0 self.rewards.feet_stumble.params["sensor_cfg"].body_names = [self.foot_link_name] - self.rewards.feet_slide.weight = -0.25 + self.rewards.feet_slide.weight = -0.05 self.rewards.feet_slide.params["sensor_cfg"].body_names = [self.foot_link_name] self.rewards.feet_slide.params["asset_cfg"].body_names = [self.foot_link_name] self.rewards.feet_height.weight = 0 diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py index 98c88326..3975b550 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py @@ -310,7 +310,7 @@ class EventCfg: mode="startup", params={ "asset_cfg": SceneEntityCfg("robot", body_names=".*"), - "com_range": {"x": (-0.02, 0.02), "y": (-0.02, 0.02), "z": (-0.02, 0.02)}, + "com_range": {"x": (-0.03, 0.03), "y": (-0.03, 0.03), "z": (-0.02, 0.02)}, }, ) From 4349bc67ef5329146913a639807b3ce7d8c672fd Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Sat, 30 Aug 2025 11:38:00 +0800 Subject: [PATCH 4/9] update --- source/robot_lab/robot_lab/assets/deeprobotics.py | 4 ++-- .../quadruped/deeprobotics_lite3/rough_env_cfg.py | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/source/robot_lab/robot_lab/assets/deeprobotics.py b/source/robot_lab/robot_lab/assets/deeprobotics.py index 9cc8960e..88b03b2b 100644 --- a/source/robot_lab/robot_lab/assets/deeprobotics.py +++ b/source/robot_lab/robot_lab/assets/deeprobotics.py @@ -11,7 +11,7 @@ spawn=sim_utils.UrdfFileCfg( fix_base=False, merge_fixed_joints=True, - replace_cylinders_with_capsules=False, + replace_cylinders_with_capsules=True, asset_path=f"{ISAACLAB_ASSETS_DATA_DIR}/Robots/deeprobotics/lite3_description/urdf/lite3.urdf", activate_contact_sensors=True, rigid_props=sim_utils.RigidBodyPropertiesCfg( @@ -68,7 +68,7 @@ spawn=sim_utils.UrdfFileCfg( fix_base=False, merge_fixed_joints=True, - replace_cylinders_with_capsules=False, + replace_cylinders_with_capsules=True, asset_path=f"{ISAACLAB_ASSETS_DATA_DIR}/Robots/deeprobotics/m20_description/urdf/m20.urdf", activate_contact_sensors=True, rigid_props=sim_utils.RigidBodyPropertiesCfg( diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py index d9cab053..53c0b47a 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py @@ -96,7 +96,7 @@ def __post_init__(self): self.rewards.joint_torques_l2.weight = -2.5e-5 self.rewards.joint_vel_l2.weight = 0 self.rewards.joint_acc_l2.weight = -1e-8 - self.rewards.create_joint_deviation_l1_rewterm("joint_deviation_hip_l1", -0.2, [".*HipX.*"]) + self.rewards.create_joint_deviation_l1_rewterm("joint_deviation_hip_l1", -0.5, [".*HipX.*"]) self.rewards.joint_pos_limits.weight = -5.0 self.rewards.joint_vel_limits.weight = 0 self.rewards.joint_power.weight = -2e-5 @@ -109,13 +109,12 @@ def __post_init__(self): ] # Action penalties - self.rewards.action_rate_l2.weight = -0.01 - # self.rewards.smoothness_2.weight = -0.004 + self.rewards.action_rate_l2.weight = -0.02 # Contact sensor self.rewards.undesired_contacts.weight = -0.5 self.rewards.undesired_contacts.params["sensor_cfg"].body_names = [f"^(?!.*{self.foot_link_name}).*"] - self.rewards.contact_forces.weight = 0 + self.rewards.contact_forces.weight = -1e-2 self.rewards.contact_forces.params["sensor_cfg"].body_names = [self.foot_link_name] # Velocity-tracking rewards @@ -137,10 +136,10 @@ def __post_init__(self): self.rewards.feet_slide.weight = -0.05 self.rewards.feet_slide.params["sensor_cfg"].body_names = [self.foot_link_name] self.rewards.feet_slide.params["asset_cfg"].body_names = [self.foot_link_name] - self.rewards.feet_height.weight = 0 + self.rewards.feet_height.weight = -0.2 self.rewards.feet_height.params["target_height"] = 0.05 self.rewards.feet_height.params["asset_cfg"].body_names = [self.foot_link_name] - self.rewards.feet_height_body.weight = -5.0 + self.rewards.feet_height_body.weight = -2.5 self.rewards.feet_height_body.params["target_height"] = -0.35 self.rewards.feet_height_body.params["asset_cfg"].body_names = [self.foot_link_name] self.rewards.feet_gait.weight = 0 From 4e3692f0f31134c4d36aa947cd8b8f5c2dd5c012 Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Sat, 30 Aug 2025 22:35:10 +0800 Subject: [PATCH 5/9] update --- .../robot_lab/assets/deeprobotics.py | 6 ++-- source/robot_lab/robot_lab/assets/unitree.py | 2 +- .../deeprobotics_lite3/rough_env_cfg.py | 5 --- .../locomotion/velocity/mdp/rewards.py | 8 ++--- .../locomotion/velocity/velocity_env_cfg.py | 31 ++++++++++--------- 5 files changed, 24 insertions(+), 28 deletions(-) diff --git a/source/robot_lab/robot_lab/assets/deeprobotics.py b/source/robot_lab/robot_lab/assets/deeprobotics.py index 88b03b2b..86338040 100644 --- a/source/robot_lab/robot_lab/assets/deeprobotics.py +++ b/source/robot_lab/robot_lab/assets/deeprobotics.py @@ -39,7 +39,7 @@ }, joint_vel={".*": 0.0}, ), - soft_joint_pos_limit_factor=0.99, + soft_joint_pos_limit_factor=0.9, actuators={ "Hip": DelayedPDActuatorCfg( joint_names_expr=[".*_Hip[X,Y]_joint"], @@ -68,7 +68,7 @@ spawn=sim_utils.UrdfFileCfg( fix_base=False, merge_fixed_joints=True, - replace_cylinders_with_capsules=True, + replace_cylinders_with_capsules=False, asset_path=f"{ISAACLAB_ASSETS_DATA_DIR}/Robots/deeprobotics/m20_description/urdf/m20.urdf", activate_contact_sensors=True, rigid_props=sim_utils.RigidBodyPropertiesCfg( @@ -99,7 +99,7 @@ }, joint_vel={".*": 0.0}, ), - soft_joint_pos_limit_factor=0.99, + soft_joint_pos_limit_factor=0.9, actuators={ "joint": DCMotorCfg( joint_names_expr=[".*hipx_joint", ".*hipy_joint", ".*knee_joint"], diff --git a/source/robot_lab/robot_lab/assets/unitree.py b/source/robot_lab/robot_lab/assets/unitree.py index db28a504..880323e6 100644 --- a/source/robot_lab/robot_lab/assets/unitree.py +++ b/source/robot_lab/robot_lab/assets/unitree.py @@ -341,7 +341,7 @@ max_depenetration_velocity=10.0, ), articulation_props=sim_utils.ArticulationRootPropertiesCfg( - enabled_self_collisions=False, solver_position_iteration_count=4, solver_velocity_iteration_count=0 + enabled_self_collisions=False, solver_position_iteration_count=8, solver_velocity_iteration_count=4 ), joint_drive=sim_utils.UrdfConverterCfg.JointDriveCfg( gains=sim_utils.UrdfConverterCfg.JointDriveCfg.PDGainsCfg(stiffness=0, damping=0) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py index 663e62ce..ae20e77e 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py @@ -72,11 +72,6 @@ def __post_init__(self): self.events.randomize_rigid_body_mass.params["asset_cfg"].body_names = [self.base_link_name] self.events.randomize_com_positions.params["asset_cfg"].body_names = [self.base_link_name] self.events.randomize_apply_external_force_torque.params["asset_cfg"].body_names = [self.base_link_name] - self.events.randomize_apply_external_force_torque = None - self.events.randomize_push_robot = None - self.scene.terrain.terrain_generator.sub_terrains["boxes"].grid_height_range = (0.025, 0.1) - self.scene.terrain.terrain_generator.sub_terrains["random_rough"].noise_range = (0.01, 0.06) - self.scene.terrain.terrain_generator.sub_terrains["random_rough"].noise_step = 0.01 # ------------------------------Rewards------------------------------ # General diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py index 4d7c5dd7..a61a6e9e 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py @@ -404,7 +404,7 @@ def feet_contact( contact_num = torch.sum(contact, dim=1) reward = (contact_num != expect_contact_num).float() # no reward for zero command - reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.5 + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.1 reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward @@ -416,7 +416,7 @@ def feet_contact_without_cmd(env: ManagerBasedRLEnv, command_name: str, sensor_c # compute the reward contact = contact_sensor.compute_first_contact(env.step_dt)[:, sensor_cfg.body_ids] reward = torch.sum(contact, dim=-1).float() - reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) < 0.5 + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) < 0.1 reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward @@ -515,7 +515,7 @@ def feet_height( ) reward = torch.sum(foot_z_target_error * foot_velocity_tanh, dim=1) # no reward for zero command - reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.5 + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.1 reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward @@ -545,7 +545,7 @@ def feet_height_body( foot_z_target_error = torch.square(footpos_in_body_frame[:, :, 2] - target_height).view(env.num_envs, -1) foot_velocity_tanh = torch.tanh(tanh_mult * torch.norm(footvel_in_body_frame[:, :, :2], dim=2)) reward = torch.sum(foot_z_target_error * foot_velocity_tanh, dim=1) - reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.5 + reward *= torch.norm(env.command_manager.get_command(command_name)[:, :2], dim=1) > 0.1 reward *= torch.clamp(-env.scene["robot"].data.projected_gravity_b[:, 2], 0, 0.7) / 0.7 return reward diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py index 450faebb..9a469e85 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py @@ -295,22 +295,23 @@ class EventCfg: }, ) - randomize_rigid_body_inertia = EventTerm( - func=mdp.randomize_rigid_body_inertia, - mode="startup", - params={ - "asset_cfg": SceneEntityCfg("robot", body_names=".*"), - "inertia_distribution_params": (0.5, 1.5), - "operation": "scale", - }, - ) + # Skip: inertia updated via mass randomization by setting recompute_inertia=True + # randomize_rigid_body_inertia = EventTerm( + # func=mdp.randomize_rigid_body_inertia, + # mode="startup", + # params={ + # "asset_cfg": SceneEntityCfg("robot", body_names=".*"), + # "inertia_distribution_params": (0.5, 1.5), + # "operation": "scale", + # }, + # ) randomize_com_positions = EventTerm( func=mdp.randomize_rigid_body_com, mode="startup", params={ "asset_cfg": SceneEntityCfg("robot", body_names=".*"), - "com_range": {"x": (-0.03, 0.03), "y": (-0.03, 0.03), "z": (-0.02, 0.02)}, + "com_range": {"x": (-0.05, 0.05), "y": (-0.05, 0.05), "z": (-0.05, 0.05)}, # TODO: move to config }, ) @@ -340,8 +341,8 @@ class EventCfg: mode="reset", params={ "asset_cfg": SceneEntityCfg("robot", joint_names=".*"), - "stiffness_distribution_params": (0.7, 1.3), - "damping_distribution_params": (0.7, 1.3), + "stiffness_distribution_params": (0.5, 2.0), + "damping_distribution_params": (0.5, 2.0), "operation": "scale", "distribution": "uniform", }, @@ -438,7 +439,7 @@ def create_joint_deviation_l1_rewterm(self, attr_name, weight, joint_names_patte weight=0.0, params={ "command_name": "base_velocity", - "command_threshold": 0.2, + "command_threshold": 0.1, "asset_cfg": SceneEntityCfg("robot", joint_names=".*"), }, ) @@ -451,7 +452,7 @@ def create_joint_deviation_l1_rewterm(self, attr_name, weight, joint_names_patte "asset_cfg": SceneEntityCfg("robot", joint_names=".*"), "stand_still_scale": 5.0, "velocity_threshold": 0.5, - "command_threshold": 0.2, + "command_threshold": 0.1, }, ) @@ -463,7 +464,7 @@ def create_joint_deviation_l1_rewterm(self, attr_name, weight, joint_names_patte "sensor_cfg": SceneEntityCfg("contact_forces", body_names=""), "command_name": "base_velocity", "velocity_threshold": 0.5, - "command_threshold": 0.2, + "command_threshold": 0.1, }, ) From 4737dc2765ab479900fb48b697bf0ca72caf5777 Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Sat, 30 Aug 2025 22:39:21 +0800 Subject: [PATCH 6/9] update --- .../config/quadruped/deeprobotics_lite3/rough_env_cfg.py | 1 - 1 file changed, 1 deletion(-) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py index ae20e77e..ccacf022 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/quadruped/deeprobotics_lite3/rough_env_cfg.py @@ -32,7 +32,6 @@ def __post_init__(self): self.scene.robot = DEEPROBOTICS_LITE3_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") self.scene.height_scanner.prim_path = "{ENV_REGEX_NS}/Robot/" + self.base_link_name self.scene.height_scanner_base.prim_path = "{ENV_REGEX_NS}/Robot/" + self.base_link_name - self.scene.height_scanner.pattern_cfg.resolution = 0.07 # ------------------------------Observations------------------------------ self.observations.policy.base_lin_vel.scale = 2.0 From 019b632ae97d9201cb599641d31abac73a0b452f Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Sat, 30 Aug 2025 22:43:58 +0800 Subject: [PATCH 7/9] update --- .../tasks/manager_based/locomotion/velocity/velocity_env_cfg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py index 9a469e85..0c79565b 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/velocity_env_cfg.py @@ -269,7 +269,7 @@ class EventCfg: "static_friction_range": (0.3, 1.0), "dynamic_friction_range": (0.3, 0.8), "restitution_range": (0.0, 0.4), - "num_buckets": 1024, + "num_buckets": 64, }, ) From 0d43389d5eb69d84ccdce1ecf8069d36c1f72289 Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Sat, 30 Aug 2025 23:03:35 +0800 Subject: [PATCH 8/9] update --- .../velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py index 8d486061..ca89b091 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py @@ -227,6 +227,6 @@ def __post_init__(self): self.curriculum.command_levels = None # ------------------------------Commands------------------------------ - self.commands.base_velocity.ranges.lin_vel_x = (-4.0, 4.0) + # self.commands.base_velocity.ranges.lin_vel_x = (-4.0, 4.0) # self.commands.base_velocity.ranges.lin_vel_y = (-1.0, 1.0) # self.commands.base_velocity.ranges.ang_vel_z = (-1.5, 1.5) From e38d8d957596904cabb2f4b3e02380cd15f66815 Mon Sep 17 00:00:00 2001 From: fan-ziqi Date: Sat, 30 Aug 2025 23:04:33 +0800 Subject: [PATCH 9/9] update --- .../velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py index ca89b091..ff821220 100644 --- a/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py +++ b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/config/wheeled/deeprobotics_m20/rough_env_cfg.py @@ -227,6 +227,6 @@ def __post_init__(self): self.curriculum.command_levels = None # ------------------------------Commands------------------------------ - # self.commands.base_velocity.ranges.lin_vel_x = (-4.0, 4.0) + # self.commands.base_velocity.ranges.lin_vel_x = (-1.5, 1.5) # self.commands.base_velocity.ranges.lin_vel_y = (-1.0, 1.0) # self.commands.base_velocity.ranges.ang_vel_z = (-1.5, 1.5)