本文档聚焦 atom01 人形机器人在 MuJoCo 仿真环境中的执行器建模策略与控制接口设计。MuJoCo 的 MJCF 格式采用 23 组理想扭矩电机直接驱动关节,配合分层默认动力学参数与全套执行器状态传感器,为强化学习训练提供了直接力控接口。理解这一设计的前提是区分 URDF 的“关节限位语义”与 MJCF 的“电机控制语义”——前者描述硬件属性,后者定义仿真控制律。
Sources: atom01.xml
执行器架构总览
atom01 在 MJCF 中定义了 23 个 <motor> 执行器,覆盖除浮动基座外的全部驱动关节。其控制链路遵循“策略输出 → 控制向量 → 电机扭矩 → 关节动力学 → 状态反馈”的闭环结构,整体架构如下:
flowchart LR
A[策略/控制器<br/>ctrl ∈ ℝ²³] --> B["MuJoCo Motor<br/>τ = gear × ctrl"]
B --> C[关节动力学<br/>含阻尼/摩擦/惯量]
C --> D[刚体运动<br/>q, q̇]
D --> E[执行器传感器<br/>pos / vel / frc]
D --> F[IMU 传感器<br/>ori / vel / acc]
E --> A
F --> A
该架构的核心特征是 直接扭矩控制(Direct Torque Control)。每个 <motor> 元素的 gear="1" 意味着控制输入 ctrl 直接映射为关节轴上的扭矩值(单位 N·m),不经过位置或速度伺服中间层。这种设计使得外部策略(如强化学习策略)可直接输出连续扭矩指令,绕过了传统伺服电机的 PD 增益调参。
Sources: atom01.xml, atom01.xml
执行器清单与参数
下表汇总了全部 23 个执行器及其控制参数。所有电机统一采用 gear="1" 与 ctrllimited="true",控制量程均为 [-200, 200] N·m。
| 执行器名称 | 关联关节 | 所属肢体 | 控制量程 (N·m) | 传动比 |
|---|---|---|---|---|
left_thigh_yaw_joint |
left_thigh_yaw_joint |
左腿 | [-200, 200] |
1 |
left_thigh_roll_joint |
left_thigh_roll_joint |
左腿 | [-200, 200] |
1 |
left_thigh_pitch_joint |
left_thigh_pitch_joint |
左腿 | [-200, 200] |
1 |
left_knee_joint |
left_knee_joint |
左腿 | [-200, 200] |
1 |
left_ankle_pitch_joint |
left_ankle_pitch_joint |
左腿 | [-200, 200] |
1 |
left_ankle_roll_joint |
left_ankle_roll_joint |
左腿 | [-200, 200] |
1 |
right_thigh_yaw_joint |
right_thigh_yaw_joint |
右腿 | [-200, 200] |
1 |
right_thigh_roll_joint |
right_thigh_roll_joint |
右腿 | [-200, 200] |
1 |
right_thigh_pitch_joint |
right_thigh_pitch_joint |
右腿 | [-200, 200] |
1 |
right_knee_joint |
right_knee_joint |
右腿 | [-200, 200] |
1 |
right_ankle_pitch_joint |
right_ankle_pitch_joint |
右腿 | [-200, 200] |
1 |
right_ankle_roll_joint |
right_ankle_roll_joint |
右腿 | [-200, 200] |
1 |
torso_joint |
torso_joint |
躯干 | [-200, 200] |
1 |
left_arm_pitch_joint |
left_arm_pitch_joint |
左臂 | [-200, 200] |
1 |
left_arm_roll_joint |
left_arm_roll_joint |
左臂 | [-200, 200] |
1 |
left_arm_yaw_joint |
left_arm_yaw_joint |
左臂 | [-200, 200] |
1 |
left_elbow_pitch_joint |
left_elbow_pitch_joint |
左臂 | [-200, 200] |
1 |
left_elbow_yaw_joint |
left_elbow_yaw_joint |
左臂 | [-200, 200] |
1 |
right_arm_pitch_joint |
right_arm_pitch_joint |
右臂 | [-200, 200] |
1 |
right_arm_roll_joint |
right_arm_roll_joint |
右臂 | [-200, 200] |
1 |
right_arm_yaw_joint |
right_arm_yaw_joint |
右臂 | [-200, 200] |
1 |
right_elbow_pitch_joint |
right_elbow_pitch_joint |
右臂 | [-200, 200] |
1 |
right_elbow_yaw_joint |
right_elbow_yaw_joint |
右臂 | [-200, 200] |
1 |
Sources: atom01.xml
电机模型与扭矩控制接口
MuJoCo 的 <motor> 是一种理想力源(Ideal Force Source),其数学模型极为简洁:施加于关节的扭矩 τ 等于传动比 gear 与控制输入 ctrl 的乘积。当 gear="1" 时,τ = ctrl。ctrllimited="true" 与 ctrlrange="-200 200" 在控制输入层面施加硬饱和,即:
τ_actual = clamp(ctrl, -200, 200)
这一设计意味着:
- 无内置伺服环:电机不维护位置或速度设定点,策略必须自行实现 PD 控制律或其他反馈机制;
- 统一量程的仿真友好性:虽然 200 N·m 对踝部或手臂关节而言远大于 URDF 中定义的硬件 effort 上限,但在强化学习探索阶段,统一量程简化了动作空间的归一化;
- 控制频率与仿真步长解耦:控制指令通过
mj_step()逐仿真步(timestep="0.001")注入,而策略推理频率可由外部循环决定。
Sources: atom01.xml
关节动力学参数体系
执行器产生的扭矩最终通过关节动力学传递至连杆。MJCF 在 <default> 中定义了三类关节参数类,分别覆盖腿部、腰部与手臂关节:
classDiagram
class default {
+joint limited=true
+motor ctrllimited=true
}
class leg_joint_param {
+damping 0.01
+frictionloss 0.01
+armature 0.01
}
class waist_joint_param {
+damping 0.01
+frictionloss 0.01
+armature 0.01
}
class arm_joint_param {
+damping 0.01
+frictionloss 0.01
+armature 0.01
}
default <|-- leg_joint_param
default <|-- waist_joint_param
default <|-- arm_joint_param
参数语义与工程含义
| 参数 | 取值(默认类) | 物理意义 | 控制影响 |
|---|---|---|---|
damping |
0.01 | 与关节速度成正比的粘性阻力系数 | 提供速度相关的耗散项,抑制高频振荡 |
frictionloss |
0.01 | 库仑摩擦(静摩擦/动摩擦近似) | 在速度过零时产生不连续阻力,影响低扭矩跟踪精度 |
armature |
0.01 | 电机转子等效惯量 | 增加关节轴的等效惯性,使系统响应更平滑,但降低加速度 |
值得注意的是,踝部关节(ankle_pitch / ankle_roll)在实例层级覆盖了 frictionloss,将值提升至 0.05。这反映了足端接触对摩擦敏感性的工程考量——更高的库仑摩擦有助于在足底接触地面时提供被动稳定性,减少姿态漂移。
Sources: atom01.xml
URDF 与 MJCF 控制参数映射差异
URDF 文件通过 <limit effort="..." velocity="..."/> 描述硬件级关节约束,而 MJCF 的 <motor> 通过 ctrlrange 定义仿真控制约束。两者在数值与语义上存在显著差异,开发者在将控制算法从 ROS/Gazebo 迁移至 MuJoCo 时需特别注意。
Effort 与 Velocity 限位对比
| 关节分组 | URDF effort (N·m) |
URDF velocity (rad/s) |
MJCF ctrlrange (N·m) |
差异说明 |
|---|---|---|---|---|
| 大腿/躯干主关节 | 120 | 25.0 | [-200, 200] |
MJCF 控制上限显著高于 URDF 硬件上限 |
| 踝部关节 | 27 | 8.0 | [-200, 200] |
同上,踝部限位未在 MJCF 中体现 |
| 手臂关节 | 27 | 8.0 | [-200, 200] |
同上 |
关节运动范围差异
下表仅列出 URDF 与 MJCF 存在不一致的关节(其余关节范围相同)。这些差异通常源于 MJCF 针对特定仿真任务(如行走、跌倒恢复)所做的运动学空间调整。
| 关节名称 | URDF lower |
URDF upper |
MJCF range |
差异特征 |
|---|---|---|---|---|
left_thigh_roll_joint |
-0.2 | 1.0 | [-0.2, 2.0] |
MJCF 上限更宽 |
left_thigh_pitch_joint |
-1.57 | 1.57 | [-2.5, 0.8] |
MJCF 改为非对称范围,允许更大后摆 |
left_knee_joint |
-0.2 | 2.5 | [0, 2.5] |
MJCF 禁止反向过伸 |
left_ankle_pitch_joint |
-0.6 | 0.6 | [-0.7, 0.7] |
MJCF 范围略宽 |
right_thigh_roll_joint |
-1.0 | 0.2 | [-2.0, 0.2] |
MJCF 下限更宽 |
right_thigh_pitch_joint |
-1.57 | 1.57 | [-2.5, 0.8] |
同左大腿,非对称调整 |
right_knee_joint |
-0.2 | 2.5 | [0, 2.5] |
同左膝,禁止反向过伸 |
right_ankle_pitch_joint |
-0.6 | 0.6 | [-0.7, 0.7] |
MJCF 范围略宽 |
torso_joint |
-3.14 | 3.14 | [-2.62, 2.62] |
MJCF 范围收窄 |
left_arm_pitch_joint |
-3.14 | 1.57 | [-3.14, 2.57] |
MJCF 上限显著放宽 |
left_arm_yaw_joint |
-1.57 | 1.57 | [-2.6, 2.6] |
MJCF 范围显著放宽 |
left_elbow_pitch_joint |
-0.6 | 1.57 | [-1.0, 3.57] |
MJCF 范围大幅放宽 |
right_arm_pitch_joint |
-3.14 | 1.57 | [-3.14, 2.57] |
同左臂 |
right_arm_yaw_joint |
-1.57 | 1.57 | [-2.6, 2.6] |
同左臂 |
right_elbow_pitch_joint |
-0.6 | 1.57 | [-1.0, 3.57] |
同左臂 |
上述差异意味着:若控制器在 URDF 限定的关节范围内规划轨迹,迁移到 MuJoCo 时可能因范围不同而触发意外限位;反之,利用 MJCF 更宽的非对称范围进行动作设计时,需评估在真实硬件上的可行性。
Sources: atom01.urdf, atom01.xml
执行器状态反馈传感器
MJCF 在 <sensor> 中为每个执行器配置了三类传感器,共 69 个执行器相关传感通道,加上 IMU 构成完整的本体感知系统:
flowchart TB
subgraph 执行器传感器 ["执行器传感器 (69 channels)"]
direction LR
P[actuatorpos<br/>23× 位置] --> V[actuatorvel<br/>23× 速度]
V --> F[actuatorfrc<br/>23× 力矩]
end
subgraph IMU传感器 ["IMU 传感器 (9 channels)"]
direction LR
O[framequat<br/>4× 姿态] --> POS[framepos<br/>3× 位置]
POS --> G[gyro<br/>3× 角速度]
G --> A[accelerometer<br/>3× 加速度]
A --> M[magnetometer<br/>3× 磁场]
end
传感器类型与属性
| 传感器类型 | 数量 | 命名后缀 | user 标记 |
噪声配置 | 物理含义 |
|---|---|---|---|---|---|
actuatorpos |
23 | _p |
13 | 无 | 执行器位置(即关节角度,rad) |
actuatorvel |
23 | _v |
13 | 无 | 执行器速度(即关节角速度,rad/s) |
actuatorfrc |
23 | _f |
13 | noise="1e-3" |
执行器输出力矩(N·m),含高斯噪声 |
user="13" 为 MuJoCo 的自定义元数据字段,其语义取决于上层消费框架(如 Isaac Gym 转换器或自定义 RL 包装器),在原生 MuJoCo 中不影响物理仿真。
actuatorfrc 上的 noise="1e-3" 表示力矩读数叠加了标准差为 0.001 N·m 的高斯白噪声。这一微弱噪声模拟了真实关节力矩传感器的测量误差,在强化学习中可提升策略的鲁棒性,同时不至于掩盖主要的动力学信号。
Sources: atom01.xml
控制接口的工程视角与强化学习集成
从控制系统架构来看,atom01 的 MJCF 模型采用了**“最小干预”执行器哲学**:仅提供理想力源与被动动力学(阻尼/摩擦/惯量),将伺服控制律的自主权完全交给外部策略。这种设计对强化学习训练具有深远影响:
- 动作空间设计:策略直接输出 23 维连续向量,每个维度通过
tanh等函数映射至[-200, 200]。若需更贴近硬件,应在训练代码中额外施加 URDF 的 effort 限位(120 N·m 或 27 N·m),而非修改 MJCF; - 状态空间设计:
actuatorpos+actuatorvel+actuatorfrc提供了完整的本体感知基线。通常与 IMU 数据拼接后输入策略网络; - Sim-to-Real 间隙:统一量程
±200与真实的关节力矩上限差异较大,若计划部署到实体机器人,建议在仿真后期引入“域随机化”(Domain Randomization),对ctrlrange、damping、frictionloss进行随机扰动; - 接触稳定性:踝部关节的
frictionloss="0.05"是一项被动稳定性设计,在足端接触时可等效提供一定的零速保持能力,减少站立时的主动控制能耗。
Sources: atom01.xml, atom01.xml
阅读导航
理解执行器与控制接口后,建议继续深入以下关联主题:
- 传感器系统与 IMU 配置:详解
framequat、gyro、accelerometer等 IMU 传感器的坐标系定义与噪声模型。传感器系统与 IMU 配置 - URDF 到 MJCF 的映射与差异:全面梳理坐标系、碰撞几何、质量属性在两个格式间的转换规则。URDF 到 MJCF 的映射与差异
- 关节动力学参数调优:讨论如何针对行走、跳跃等不同任务调整
damping、armature、frictionloss。关节动力学参数调优 - 强化学习训练集成要点:探讨 observation/action/reward 设计、域随机化策略与 MuJoCo 仿真的对接细节。强化学习训练集成要点