Case Study: A Dive Into Unitree-Mujoco
# ROBOT_SCENE = "../unitree_robots/" + ROBOT + "/scene.xml"
mj_model = mujoco.MjModel.from_xml_path(config.ROBOT_SCENE)
mj_data = mujoco.MjData(mj_model)
Base and Joint Data
The state of the robot can be accessed via the mj_data.qpos
and mj_data.qvel
fields.
These two fields are two numpy.ndarray
that stores both the base state as well as the joint state.
The shape of qpos
is 3 + 4 + n_dof
, which composes of the base xyz position, base rotation in quaternion, and all the joint rotation positions.
The shape of qvel
is 3 + 3 + n_dof
. The only difference from the qpos is that the angular rotation is expressed in euler angle, instead of quaternions.
mj_data.qpos # (base_x, base_y, base_z, base_qx, base_qy, base_qz, base_qw, joint...)
mj_data.qvel # (base_vx, base_vy, base_vz, base_vrx, base_vry, base_vrz, jointv...)
Joint Ordering
Different from IsaacLab, which orders the joint in a breath-first search fashion and ordered by capital letter, Mujoco uses a depth-first search. Therefore, the joint order will be different. Here's an example for the A1 robot.
Mujoco Mapping:
0: FL_Hip
1: FR_Hip
2: RL_Hip
3: RR_Hip
4: FL_Thigh
5: FR_Thigh
6: RL_Thigh
7: RR_Thigh
8: FL_Calf
9: FR_Calf
10: RL_Calf
11: RR_Calf
IsaacLab Mapping
0: FL_Hip
1: FL_Thigh
2: FL_Calf
3: FR_Hip
4: FR_Thigh
5: FR_Calf
6: RL_Hip
7: RL_Thigh
8: RL_Calf
9: RR_Hip
10: RR_Thigh
11: RR_Calf
Last updated
Was this helpful?