Skip to content
22 changes: 12 additions & 10 deletions source/robot_lab/robot_lab/assets/deeprobotics.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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(
Expand All @@ -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)
Expand All @@ -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)
),
},
)
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"))
Expand All @@ -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)
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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]
Expand Down Expand Up @@ -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

Expand All @@ -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

Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
},
)

Expand Down Expand Up @@ -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",
},
)

Expand Down