diff --git a/source/robot_lab/robot_lab/assets/deeprobotics.py b/source/robot_lab/robot_lab/assets/deeprobotics.py index 0b4d0e92..86338040 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 @@ -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( @@ -24,7 +24,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 ), joint_drive=sim_utils.UrdfConverterCfg.JointDriveCfg( gains=sim_utils.UrdfConverterCfg.JointDriveCfg.PDGainsCfg(stiffness=0, damping=0) @@ -41,23 +41,25 @@ ), soft_joint_pos_limit_factor=0.9, 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) ), }, ) @@ -79,7 +81,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 ), 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 18b9c4d6..0fa5987e 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 @@ -82,8 +82,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 @@ -92,50 +92,52 @@ 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.5, [".*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.weight = -2.0 - self.rewards.joint_pos_penalty.weight = -1.0 - self.rewards.joint_mirror.weight = -0.05 + self.rewards.stand_still.weight = -0.3 + 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).*"], ] # Action penalties - self.rewards.action_rate_l2.weight = -0.01 + self.rewards.action_rate_l2.weight = -0.02 # 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 = -1e-2 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_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.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.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 = 0 - self.rewards.feet_height_body.params["target_height"] = -0.25 + 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 self.rewards.feet_gait.params["synced_feet_pair_names"] = (("FL_FOOT", "HR_FOOT"), ("FR_FOOT", "HL_FOOT")) @@ -154,6 +156,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/mdp/rewards.py b/source/robot_lab/robot_lab/tasks/manager_based/locomotion/velocity/mdp/rewards.py index b65d4b72..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 @@ -112,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 @@ -135,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] @@ -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.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.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.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.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.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.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.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.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 ce3dd60b..d593f94f 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 @@ -311,7 +311,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.05, 0.05), "y": (-0.05, 0.05), "z": (-0.05, 0.05)}, # TODO: move to config }, ) @@ -344,7 +344,7 @@ class EventCfg: "stiffness_distribution_params": (0.5, 2.0), "damping_distribution_params": (0.5, 2.0), "operation": "scale", - "distribution": "log_uniform", + "distribution": "uniform", }, )