本文档解释 source/Qmini/robots/qmini.py 中 DelayedPDActuatorCfg 的五个核心参数:
stiffness、damping、armature、effort_limit_sim、velocity_limit_sim。
每个关节在 PhysX 中都按以下离散动力学方程仿真:
τ_applied = stiffness · (q_target − q) − damping · q̇ ← PD 控制器
τ_motor = clip(τ_applied, ±effort_limit_sim) ← 力矩饱和
(I_link + armature) · q̈ = τ_motor + 其他外力矩 ← 关节运动方程
|q̇| ≤ velocity_limit_sim ← 速度饱和
了解这五个参数的物理含义,是把策略从仿真迁移到真机(Sim2Real)的关键。
含义: PD 控制器中的 P 项增益。关节目标位置与当前位置每偏差 1 弧度,电机会输出多少 N·m 的力矩去拉回来。
为什么这样设?
- 太小 → 机器人"软绵绵",跟不上目标轨迹,站不稳;
- 太大 → 高频抖动、积分发散,PhysX 在大步长下会爆炸(除非配合更大的
armature); - 要与真机匹配 → 真实 Robstride 电机有自己的电流环带宽,过高的仿真刚度对应不了的真机增益,迁移就会失败。
当前配置:
| 关节 | stiffness |
|---|---|
joint1..joint4(髋 + 膝) |
78.957 |
joint5(踝) |
16.581 |
踝部刚度显著低于髋膝,原因是踝电机更小、转矩上限更低,给它太大的 P 增益反而会饱和力矩、引发抖动。
含义: PD 控制器中的 D 项增益。关节角速度每 1 rad/s,会产生多少 N·m 的反向力矩用于抑制运动。
为什么这样设?
- 阻尼是 PD 控制器的"减震器"。
stiffness提供恢复力,damping消耗能量、抑制振荡; - 临界阻尼比 ζ = damping / (2·√(stiffness · I_eff))。在本项目中
damping/stiffness ≈ 0.064,对应轻度欠阻尼,既能快速响应又不会震荡; - 太小 → 关节像弹簧一样来回弹;
- 太大 → 关节反应迟钝,机器人感觉"粘"。
当前配置:
| 关节 | damping |
|---|---|
joint1..joint4 |
5.027 |
joint5(踝) |
1.056 |
stiffness 和 damping 的比例在所有关节都相同(约 15.7:1),保持了一致的阻尼比。
含义: 电机转子和减速器输出端的等效旋转惯量,会被直接加到 PhysX 关节质量矩阵的对角线上。数学上等于 N² · I_rotor(N 为减速比)。
为什么这样设?
- 数值稳定性 —— 高
stiffness配低惯量时,隐式积分器会震荡甚至发散。armature抬高等效惯量,让高刚度 PD 在大步长下依然稳定; - Sim2Real 一致性 —— 真实 Robstride 电机的转子惯量并不可忽略。如果不加
armature,仿真中的连杆比真机加速更快,策略迁移就会"飘"、抖动甚至失控; - 隐藏好处 —— 在做关节位置控制时,
armature也会让电机"感觉"更像真机:响应更平滑,过冲更少。
当前配置:
| 关节 | armature |
|---|---|
joint1..joint4 |
0.02 |
joint5(踝) |
0.0042 |
这个比例(约 4.76:1)和 effort_limit_sim 的比例(42:11.9 ≈ 3.53:1)相近,反映了大号 vs 小号 Robstride 电机的真实物理差异。
含义: PD 控制器输出的力矩在送进物理仿真之前会先被裁剪到 ±effort_limit_sim,模拟真实电机的转矩饱和。
为什么这样设?
- 真实电机不可能输出无限大力矩。如果不限制,PD 控制器在大误差下会要求几百 N·m,仿真里能做到但真机做不到 —— 策略一旦学到这种"超人力矩",迁移到真机就直接失败;
- 应该匹配真机的连续/峰值力矩。一般设为电机峰值力矩,给策略留出加速、起跳、防摔的余量;
- 配合
stiffness一起看:stiffness · max_position_error应该接近但不超过effort_limit_sim,否则 PD 项永远饱和、D 项失效。
当前配置:
| 关节 | effort_limit_sim |
|---|---|
joint1..joint4 |
42.0 |
joint5(踝) |
11.9 |
对应大号 Robstride(约 42 N·m 峰值)和小号 Robstride(约 12 N·m 峰值)。
含义: 关节角速度的硬限位。超过这个值后 PhysX 会通过力矩反作用把速度压回来,模拟电机的反电动势(back-EMF)饱和特性。
为什么这样设?
- 真实电机有最高转速(由母线电压和反电动势常数决定),超过这个速度电机就再也加不上电流了;
- 如果仿真里允许无限转速,策略会学到"快速甩腿"这种真机做不到的动作;
- 通常设为电机额定空载转速的 1.1–1.5 倍,给策略一点裕量;
- 注意:踝关节通常设得 比髋膝更高,因为减速比小、空载转速高(与
effort_limit_sim反相关 —— 这是减速器的物理本质:高转速换低力矩,低转速换高力矩)。
当前配置:
| 关节 | velocity_limit_sim |
|---|---|
joint1..joint4 |
18.849 |
joint5(踝) |
37.699 |
踝的速度上限正好是髋膝的 2 倍,对应小号电机更高的转速能力。effort × velocity 的乘积大致代表电机功率:
- 髋膝:42 × 18.849 ≈ 791 W
- 踝:11.9 × 37.699 ≈ 449 W
| 参数 | 单位 | joint1–4(髋+膝) | joint5(踝) | 比值 |
|---|---|---|---|---|
stiffness |
N·m/rad | 78.957 | 16.581 | 4.76 |
damping |
N·m·s/rad | 5.027 | 1.056 | 4.76 |
armature |
kg·m² | 0.02 | 0.0042 | 4.76 |
effort_limit_sim |
N·m | 42.0 | 11.9 | 3.53 |
velocity_limit_sim |
rad/s | 18.849 | 37.699 | 0.50 |
注意到前四个参数(控制响应特性 + 反射惯量)的比例几乎一致(4.76),但 effort 和 velocity 的比例与之不同 —— 这是因为:
- 前者反映控制器设计 + 转子惯量,按电机机械尺寸缩放;
effort_limit_sim反映峰值转矩,受电流环和电压限制;velocity_limit_sim反映最高空载转速,与effort在功率上守恒(高速换低矩)。
- 从真机数据出发 —— 这些数字不要凭空拍。先量出真实电机的力矩-速度曲线、转子惯量、电流环带宽,然后再选
stiffness和damping。 armature是稳定性安全网 —— 如果训练时发现关节"抽搐"或仿真发散,先尝试增大armature,再考虑降低stiffness。effort_limit_sim不要给太大 —— 给得太宽松,策略会学到"作弊"动作,Sim2Real 必然失败。宁可让策略学得保守一点。- 保持 stiffness:damping 比例一致 —— 这样所有关节的阻尼比(ζ)相同,整机动力学特性更一致,策略也更容易学。
- 检查能耗合理性 ——
effort × velocity应该接近电机的额定功率。如果某关节的乘积远超电机规格,说明参数设错了。