关节映射与坐标系
实验室使用 G1 EDU 29-DoF。控制消息槽位、模型关节 ID、广义坐标地址与学习动作维度是四种不同的编号。本页提供固定版本的机身映射,以及 23-DoF 资料差异的处理方法;手部通道另见 BrainCo2。
机身分组
flowchart TD
B[机身 29 个关节] --> L[左腿 0—5]
B --> R[右腿 6—11]
B --> W[腰 yaw/roll/pitch 12—14]
W --> A[左臂 15—21]
W --> C[右臂 22—28]
A --> H[独立左手 DDS 通道]
C --> I[独立右手 DDS 通道]
左右以机器人自身为准。头部不是该机身表中的可控颈关节。BrainCo2 每手 6 个归一化通道,不能按机身弧度指令解释。
29-DoF 对照表
机身 SDK 槽位依据 arm7 示例,模型名、轴与范围依据 MuJoCo XML。轴在各关节局部坐标系表达,正向绕该轴遵循右手规则,不能直接把所有局部轴当作世界轴。
| DDS 槽位 | 模型关节名 | 局部轴 | 模型范围 rad |
|---|---|---|---|
| 0 | left_hip_pitch_joint |
(0,1,0) | -2.5307 至 2.8798 |
| 1 | left_hip_roll_joint |
(1,0,0) | -0.5236 至 2.9671 |
| 2 | left_hip_yaw_joint |
(0,0,1) | -2.7576 至 2.7576 |
| 3 | left_knee_joint |
(0,1,0) | -0.0873 至 2.8798 |
| 4 | left_ankle_pitch_joint |
(0,1,0) | -0.8727 至 0.5236 |
| 5 | left_ankle_roll_joint |
(1,0,0) | -0.2618 至 0.2618 |
| 6 | right_hip_pitch_joint |
(0,1,0) | -2.5307 至 2.8798 |
| 7 | right_hip_roll_joint |
(1,0,0) | -2.9671 至 0.5236 |
| 8 | right_hip_yaw_joint |
(0,0,1) | -2.7576 至 2.7576 |
| 9 | right_knee_joint |
(0,1,0) | -0.0873 至 2.8798 |
| 10 | right_ankle_pitch_joint |
(0,1,0) | -0.8727 至 0.5236 |
| 11 | right_ankle_roll_joint |
(1,0,0) | -0.2618 至 0.2618 |
| 12 | waist_yaw_joint |
(0,0,1) | -2.6180 至 2.6180 |
| 13 | waist_roll_joint |
(1,0,0) | -0.5200 至 0.5200 |
| 14 | waist_pitch_joint |
(0,1,0) | -0.5200 至 0.5200 |
| 15 | left_shoulder_pitch_joint |
(0,1,0) | -3.0892 至 2.6704 |
| 16 | left_shoulder_roll_joint |
(1,0,0) | -1.5882 至 2.2515 |
| 17 | left_shoulder_yaw_joint |
(0,0,1) | -2.6180 至 2.6180 |
| 18 | left_elbow_joint |
(0,1,0) | -1.0472 至 2.0944 |
| 19 | left_wrist_roll_joint |
(1,0,0) | -1.9722 至 1.9722 |
| 20 | left_wrist_pitch_joint |
(0,1,0) | -1.6144 至 1.6144 |
| 21 | left_wrist_yaw_joint |
(0,0,1) | -1.6144 至 1.6144 |
| 22 | right_shoulder_pitch_joint |
(0,1,0) | -3.0892 至 2.6704 |
| 23 | right_shoulder_roll_joint |
(1,0,0) | -2.2515 至 1.5882 |
| 24 | right_shoulder_yaw_joint |
(0,0,1) | -2.6180 至 2.6180 |
| 25 | right_elbow_joint |
(0,1,0) | -1.0472 至 2.0944 |
| 26 | right_wrist_roll_joint |
(1,0,0) | -1.9722 至 1.9722 |
| 27 | right_wrist_pitch_joint |
(0,1,0) | -1.6144 至 1.6144 |
| 28 | right_wrist_yaw_joint |
(0,0,1) | -1.6144 至 1.6144 |
范围是模型限制,不是带载实机的安全工作范围。踝/腰的并联机构在 PR 与 AB 模式中的语义不同;必须同时核对控制模式,不能只对齐索引。
23-DoF 不能简单压缩数组
官方仓库中的 23-DoF 索引说明列出紧凑顺序:腰后左臂 13—17、右臂 18—22。但固定 Python SDK 的 arm5 示例仍使用左臂 15—19、右臂 22—26,并把额外腰/腕槽位标为无效。
而该 MuJoCo 提交的 g1_23dof.xml 还含额外占位关节,执行器排列需从模型读取。紧凑文档表不是此处模型执行器数组或实机固件的通用映射。 按“固件消息定义 + 使用的示例 + 实际模型”建立独立映射,先只读核对;不要给未知槽位发试探命令。
| 部位 | 29-DoF SDK | 23-DoF arm5 示例 | 23-DoF 文档紧凑表 |
|---|---|---|---|
| 双腿 | 0—11 | 0—11 | 0—11 |
| 腰 yaw | 12 | 12 | 12 |
| 腰 roll/pitch | 13、14 | 标记无效 | 不列出 |
| 左肩/肘/腕 roll | 15—19 | 15—19 | 13—17 |
| 左腕 pitch/yaw | 20、21 | 标记无效 | 不列出 |
| 右肩/肘/腕 roll | 22—26 | 22—26 | 18—22 |
| 右腕 pitch/yaw | 27、28 | 标记无效 | 不列出 |
导出实际模型地址
在仿真示例环境执行:
python examples/inspect_model.py \
~/unitree_mujoco_lab/unitree_robots/g1/g1_29dof.xml > /tmp/g1-model-map.csv
下载本次生成的 CSV。浮动基座占用 7 个位置坐标、6 个速度坐标,因此 qpos 和速度地址不相同;固定基座后的地址又会变化。按关节名称查地址,不把 DDS 索引直接作为 qpos 索引。
坐标与旋转约定
本手册示意采用机身前方 x、左方 y、上方 z 的右手系,实际轴以模型和传感器驱动为准。ROS 相机 optical frame 与机身轴通常不同,见传感器标定。SDK/MuJoCo 四元数示例为 w,x,y,z,ROS 消息字段常按 x,y,z,w 命名;转换时按字段赋值,而非原样复制四元素数组。
用一个静止姿态和一组已知旋转做离线检验:旋转矩阵应正交且行列式接近 1,变换与逆变换应还原原坐标。欧拉角必须同时注明轴序、内禀/外禀约定和单位。正方向最终通过模型的小幅变化和现场只读状态确认。