To make the motion of humanoid robots more natural, we retargeted LAFAN1 motion capture data to Unitree's humanoid robots, supporting three models: H1, H1_2, and G1. This retargeting was achieved through numerical optimization based on Interaction Mesh and IK, considering end-effector pose constraints, as well as joint position and velocity constraints, to prevent foot slippage. It is important to note that the retargeting only accounted for kinematic constraints and did not include dynamic constraints or actuator limitations. As a result, the robot cannot perfectly execute the retargeted trajectories.
# Step 1: Set up a Conda virtual environment
conda create -n lafan-data python=3.8
conda activate lafan-dataInstall Isaac Gym
- Download and install Isaac Gym Preview 3 (Preview 2 will not work!) from https://developer.nvidia.com/isaac-gym
cd isaacgym/python && pip install -e .- Try running an example
cd examples && python 1080_balls_of_solitude.py - For troubleshooting check docs
isaacgym/docs/index.html)
pip install torch numpy argparsepython issacgym_visualize.py --file_name dance1_subject2 --robot_type g1robot_typecan choose:g1,h1,h2
you can use this code to convert data format as .pkl, this data format can be used to train policy with ASAP
python cvs_to_pkl.pyafter running this order, you can get a file in pkl_data/, But you need to note that this code can only convert g1 robot data currently.If you want to use it to convert h1 robot data, you can modify it based on that.
data_dump[data_name]={
"root_trans_offset": root_trans_all.cpu().detach().numpy(),
"pose_aa": pose_aa.squeeze().cpu().detach().numpy(),
"dof": dof_pos_all.detach().cpu().numpy(),
"root_rot": root_rot_all.cpu().numpy(),
"fps": 30
}This database stores the retargeted trajectories in CSV format. Each row in the CSV file corresponds to the original motion capture data for each frame, recording the configurations of all joints in the humanoid robot in the following order:
The Order of Configuration
G1: (30 FPS)
root_joint(XYZ QXQYQZQW) 7vetor
left_hip_pitch_joint
left_hip_roll_joint
left_hip_yaw_joint
left_knee_joint
left_ankle_pitch_joint
left_ankle_roll_joint
right_hip_pitch_joint
right_hip_roll_joint
right_hip_yaw_joint
right_knee_joint
right_ankle_pitch_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 19
left_wrist_pitch_joint
left_wrist_yaw_joint 21
right_shoulder_pitch_joint 22
right_shoulder_roll_joint
right_shoulder_yaw_joint
right_elbow_joint 25
right_wrist_roll_joint 26
right_wrist_pitch_joint 34
right_wrist_yaw_joint 35
H1_2: (30 FPS)
root_joint(XYZQXQYQZQW)
left_hip_yaw_joint
left_hip_pitch_joint
left_hip_roll_joint
left_knee_joint
left_ankle_pitch_joint
left_ankle_roll_joint
right_hip_yaw_joint
right_hip_pitch_joint
right_hip_roll_joint
right_knee_joint
right_ankle_pitch_joint
right_ankle_roll_joint
torso_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
H1: (30 FPS)
root_joint(XYZQXQYQZQW)
left_hip_yaw_joint
left_hip_roll_joint
left_hip_pitch_joint
left_knee_joint
left_ankle_joint
right_hip_yaw_joint
right_hip_roll_joint
right_hip_pitch_joint
right_knee_joint
right_ankle_joint
torso_joint
left_shoulder_pitch_joint
left_shoulder_roll_joint
left_shoulder_yaw_joint
left_elbow_joint
right_shoulder_pitch_joint
right_shoulder_roll_joint
right_shoulder_yaw_joint
right_elbow_joint