Files
go2_rl_robotlab/source/robot_lab/robot_lab/assets/unitree.py

161 lines
5.2 KiB
Python

# Copyright (c) 2024-2025 Ziqi Fan
# SPDX-License-Identifier: Apache-2.0
"""Configuration for Unitree robots.
Reference: https://github.com/unitreerobotics/unitree_ros
"""
import os
import isaaclab.sim as sim_utils
from isaaclab.actuators import DCMotorCfg
from isaaclab.assets.articulation import ArticulationCfg
from isaaclab.utils import configclass
from robot_lab.assets import ISAACLAB_ASSETS_DATA_DIR
from robot_lab.assets.unitree_actuator import UnitreeActuatorCfg_Go2HV
##
# Configuration
##
@configclass
class UnitreeArticulationCfg(ArticulationCfg):
"""Configuration for Unitree articulations."""
joint_sdk_names: list[str] = None
soft_joint_pos_limit_factor = 0.9
@configclass
class UnitreeUrdfFileCfg(sim_utils.UrdfFileCfg):
fix_base: bool = False
activate_contact_sensors: bool = True
replace_cylinders_with_capsules = True
joint_drive = sim_utils.UrdfConverterCfg.JointDriveCfg(
gains=sim_utils.UrdfConverterCfg.JointDriveCfg.PDGainsCfg(stiffness=0, damping=0)
)
articulation_props = sim_utils.ArticulationRootPropertiesCfg(
enabled_self_collisions=True,
solver_position_iteration_count=8,
solver_velocity_iteration_count=4,
)
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,
)
def replace_asset(self, meshes_dir, urdf_path):
"""Replace the asset with a temporary copy to avoid modifying the original asset.
When need to change the collisions, place the modified URDF file separately in this repository,
and let `meshes_dir` be provided by `unitree_ros`.
This function will auto construct a complete `robot_description` file structure in the `/tmp` directory.
Note: The mesh references inside the URDF should be in the same directory level as the URDF itself.
"""
tmp_meshes_dir = "/tmp/IsaacLab/unitree_rl_lab/meshes"
if os.path.exists(tmp_meshes_dir):
os.remove(tmp_meshes_dir)
os.makedirs("/tmp/IsaacLab/unitree_rl_lab", exist_ok=True)
os.symlink(meshes_dir, tmp_meshes_dir)
self.asset_path = "/tmp/IsaacLab/unitree_rl_lab/robot.urdf"
if os.path.exists(self.asset_path):
os.remove(self.asset_path)
os.symlink(urdf_path, self.asset_path)
# Go2 config from robot_lab [https://github.com/fan-ziqi/robot_lab]
GO2_CFG_ROBOTLAB = ArticulationCfg(
spawn=sim_utils.UrdfFileCfg(
fix_base=False,
merge_fixed_joints=True,
replace_cylinders_with_capsules=True,
asset_path=f"{ISAACLAB_ASSETS_DATA_DIR}/go2/urdf/go2.urdf",
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,
),
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
enabled_self_collisions=True,
solver_position_iteration_count=4,
solver_velocity_iteration_count=0,
),
joint_drive=sim_utils.UrdfConverterCfg.JointDriveCfg(
gains=sim_utils.UrdfConverterCfg.JointDriveCfg.PDGainsCfg(
stiffness=0, damping=0
)
),
),
init_state=ArticulationCfg.InitialStateCfg(
pos=(0.0, 0.0, 0.42),
joint_pos={
".*L_hip_joint": 0.1,
".*R_hip_joint": -0.1,
"F.*_thigh_joint": 0.8,
"R.*_thigh_joint": 1.0,
".*_calf_joint": -1.5,
},
joint_vel={".*": 0.0},
),
soft_joint_pos_limit_factor=0.9,
actuators={
"legs": DCMotorCfg(
joint_names_expr=[".*"],
effort_limit=23.5,
saturation_effort=23.5,
velocity_limit=30.0,
stiffness=20.0,
damping=0.5,
friction=0.0,
),
},
)
# Go2 config from unitree_rl_lab [https://github.com/unitreerobotics/unitree_rl_lab]
GO2_CFG_UNITREE = UnitreeArticulationCfg(
spawn=UnitreeUrdfFileCfg(
asset_path=f"{ISAACLAB_ASSETS_DATA_DIR}/go2/urdf/go2.urdf",
),
init_state=ArticulationCfg.InitialStateCfg(
pos=(0.0, 0.0, 0.4),
joint_pos={
".*R_hip_joint": -0.1,
".*L_hip_joint": 0.1,
"F[L,R]_thigh_joint": 0.8,
"R[L,R]_thigh_joint": 1.0,
".*_calf_joint": -1.5,
},
joint_vel={".*": 0.0},
),
actuators={
"GO2HV": UnitreeActuatorCfg_Go2HV(
joint_names_expr=[".*"],
stiffness=25.0,
damping=0.5,
friction=0.01,
min_delay=0,
max_delay=4,
),
},
# fmt: off
joint_sdk_names=[
"FR_hip_joint", "FR_thigh_joint", "FR_calf_joint",
"FL_hip_joint", "FL_thigh_joint", "FL_calf_joint",
"RR_hip_joint", "RR_thigh_joint", "RR_calf_joint",
"RL_hip_joint", "RL_thigh_joint", "RL_calf_joint"
],
# fmt: on
)