状态:草案(2026-10-18),实测。 数字是通过笔记本电脑(Apple M1 Max,macOS 26.5)上的 Python 3.9.6 和 numpy 2.0.2 计算得出的 数值仿真 值。 关节、手臂和电机的物理常数均为假设值,没有一个是通过真实电机和控制器测得的(硬件未实测)。原始数据与代码:工作目录
measure/robot-arm-basics/的m09_control.py,out/m09_control.json。参考资料查阅于 2026-10-18。 编写规则:以实测数据为基础,未能测出的标为“未实测”,无法确认的标为“未确认”。
目录
1. 直觉:跟踪的两种方法
想象一个驾驶员在跟车。其中一个驾驶员只看与前车的距离。距离远了就踩油门,近了就松油门。总是慢了一拍。另一个驾驶员看着前 车的刹车灯和道路标志,提前知道 前车要做什么 。因此,他在距离拉开之前就会踩油门。前者是反馈(feedback),后者是 前馈(feedforward)。
乒乓球机器人的轨迹在第 8 篇中已经全部计算好了。每一瞬间想要的位置、速度和加速度都是已知的。因此,没有理由不使用前馈。 反馈只需要根据模型的不准确之处进行修正即可。本文通过仿真来衡量这种差异有多大,以及为什么控制周期和电机内部的电流环如此重要。
2. 图解:控制的分层
- 轨迹生成器(第 8 篇)生成 q_r、q̇_r、q̈_r。
- 位置·速度环根据误差决定力矩,并加上通过动力学计算出的力矩。本系列中的仿真为 1 kHz。
- 电流环将力矩指令转换为电机电流。由于无刷电机的力矩与转子磁铁正交方向的电流 i_q 成正比,因此将三相电流转换到转子参考 坐标系(d-q 轴)下,仅控制 i_q。这就是 FOC(field oriented control,磁场定向控制)。
观察开源电机控制器会发现,不同层级的周期各不相同。moteus 的文档中记载,位置环和电流环都以开关频率(默认 30 kHz)运行。 ODrive 0.6.12 文档解释了控制循环计数器,并假设控制环频率为 8 kHz。其上层的机器人控制器通常要慢得多。Koç 等人 2018 年的 乒乓球机器人使用 500 Hz 的实时控制,Google 2023 年的学习策略使用 100 Hz,Google DeepMind 2024 年的低级技能以 50 Hz 发送指令。
3. 计算
3.1 PID 与前馈
PD: τ = K_p e + K_d ė e = q_r − q
PID: τ = K_p e + K_d ė + K_i ∫e dt
PD + 앞먹임: τ = J q̈_r + b q̇_r + τ_c sign(q̇_r) + K_p e + K_d ė
└ 역동역학(관성·점성·쿨롱 마찰) ┘ └ 되먹임 ┘
增益根据惯量 J 和目标带宽 ω_n 设定:K_p = J ω_n²,K_d = 2 J ω_n(临界阻尼)。所有比较均使用相同的 ω_n = 2π·20 Hz。
3.2 计算力矩控制
如果手臂有多个关节,一个关节的加速度会对其他关节施加力(惯性耦合)。离心力、科里奥利力和重力也因姿态而异。手臂整体的运动方程式如下 所示。
M(q) q̈ + C(q, q̇) q̇ + g(q) = τ
计算力矩(computed torque)控制直接使用该公式来消除耦合。《Modern Robotics》公式 (11.35) 就是这种形式,该书还指出在实际应用中 K_i 通常设为 0。
τ = M̃(q) (q̈_r + K_p e + K_d ė) + C̃(q, q̇) q̇ + g̃(q) (~ 는 모델 값)
如果模型准确,每个关节的误差将遵循彼此独立的二阶方程:ë + K_d ė + K_p e = 0。
3.3 电流环
q 轴电流是由相电阻 R 和电感 L 组成的一阶电路。将 PI 增益设为 K_p = L ω_c、K_i = R ω_c,就可以抵消电路的极点,并获得带宽为 ω_c 的一阶响应。 由于数字控制器将用测量电流计算出的电压在 下一个周期 输出,因此如果 ω_c 相对于环路周期过大,就会由于这一个周期的延迟而产生振荡。
3.4 仿真设置
- 单关节: 惯量 J = 0.015 kg·m²,粘性摩擦 b = 0.02 N·m·s,库仑摩擦 0.1 N·m,力矩限制 6 N·m。仿真积分间隔为 20 µs,控制器在每个周期读取位置和速度,并在 下一个周期 输出计算出的力矩(一个周期延迟)。
- 参考轨迹: 第 8 篇的击打轨迹。在 0.12 s 内通过 0.6 rad,达到 10 rad/s(加速度为 0),停止 0.1 s,然后静止 0.1 s。
- 双连杆垂直手臂: 连杆 0.40·0.35 m,质量 1.2·0.7 kg,有重力。两个关节同时在 0.15 s 内分别以 6·8 rad/s 的速度通过击打姿态,并在 0.1 s 时停止。该 轨迹的动力学最大力矩为:1号关节 39.9 N·m,2号关节 17.4 N·m。
4. 实测(仿真)
4.1 控制器与控制周期
| 周期 | 控制器 | 最大误差 | RMS 误差 | 击打瞬间位置误差 | 击打瞬间速度误差 |
|---|---|---|---|---|---|
| 1 kHz | PD | 8.5 mrad | 5.1 mrad | 4.3 mrad | −0.20 rad/s |
| 1 kHz | PID | 10.3 | 5.1 | −1.0 | −0.22 |
| 1 kHz | PD + 前馈 | 0.42 | 0.28 | −0.29 | −0.007 |
| 2 kHz | PD + 前馈 | 0.21 | 0.14 | −0.15 | −0.003 |
| 500 Hz | PD + 前馈 | 0.86 | 0.46 | −0.58 | −0.014 |
| 200 Hz | PD | 39.9 | 17.5 | −2.6 | 2.25 |
| 200 Hz | PD + 前馈 | 34.8 | 14.4 | 1.1 | 3.37 |
- 仅凭一个前馈,误差就减少了 20 倍以上。 PD 只有在产生误差时才会输出力矩,因此在整个加速阶段都会落后。而前馈则会提前输出所需的力矩。
- 积分项(PID)反而带来了负面效果。 在 0.2 秒的快速运动中,积分会不断累积并延迟释放,从而导致超调(overshoot)。积分是用来消除像重力这样缓慢变化的 偏差的工具,而不是用来快速跟踪轨迹的工具。
- 周期几乎呈线性改变误差,直到在某条界线处崩塌。 在有前馈的情况下,从 2 kHz → 1 kHz → 500 Hz,最大误差分别倍增至 0.21 → 0.42 → 0.86 mrad。这是因为单周期延迟直接转化为了误差。在 200 Hz(5 ms)下,对于 0.12 秒的挥拍动作,只有 24 次控制机会,因此前馈也呈现阶梯状输出,5 ms 的延迟与 20 Hz 的增益相互交织,导致了剧烈的晃动。击打瞬间的速度误差为 3.4 rad/s,若以 0.5 m 的手臂长度折算,球拍速度误差约为 1.7 m/s;如果将第 7 篇中的“0.1 m/s 带来 10 cm 偏差”按比例放大,落点将偏差 1 米以上。
如果提高增益会怎样?将 ω_n 提高一倍至 2π·40 Hz 后,PD 在 1 kHz 下的最大误差从 8.5 降至 2.2 mrad,但在 200 Hz 下误差却达到了 134 mrad,几乎发散。 在慢速环路中提高增益是危险的,而且即使在快速环路中,效果也不如前馈。
我们还测试了模型存在偏差的前馈。当惯量设小或设大 20% 时(1 kHz),最大误差分别为 1.8 和 1.9 mrad。虽然比准确模型(0.42)差了 4 倍,但 依然比 PD(8.5)好 4 倍。
4.2 电流环延迟对位置环的影响
上述实验假设指令力矩能够立即输出。实际上,电流环需要时间来产生力矩。假设力矩以带宽 f_i 的一阶延迟输出, 重新测量了 1 kHz PD + 前馈的误差。
| 电流(力矩)带宽 | 最大误差 | RMS 误差 | 击打瞬间速度误差 |
|---|---|---|---|
| 无延迟 | 0.42 mrad | 0.28 mrad | −0.007 rad/s |
| 1,000 Hz | 0.46 | 0.31 | −0.007 |
| 300 Hz | 0.58 | 0.35 | −0.009 |
| 100 Hz | 0.90 | 0.48 | −0.014 |
| 50 Hz | 1.42 | 0.68 | −0.021 |
当电流环带宽与位置环周期(1 kHz)相近时,几乎没有差异;而一旦降至 100 Hz 以下,误差就会增加两到三倍。“内环必须比外环 足够快”这一分层控制原则正是来源于这些数字。
4.3 电流环本身:在 30 kHz 下能做多快
对相电阻 0.2 Ω、电感 100 µH 的 q 轴电流进行了 30 kHz PI 控制下的 10 A 阶跃响应测试(电压限制 48 V,单周期延迟)。
| 目标带宽 | 10→90% 上升时间 | 理想一阶响应 | 超调 |
|---|---|---|---|
| 500 Hz | 578 µs | 700 µs | 0% |
| 1 kHz | 212 µs | 350 µs | 0% |
| 2 kHz | 63 µs | 175 µs | 16.5% |
| 4 kHz | 30 µs | 88 µs | 84% |
| 8 kHz | 17 µs | 44 µs | 200% |
当目标带宽超过环路频率的 1/15(2 kHz)时,开始出现超调;而在 1/4(8 kHz)时则实际上发生了振荡。这是因为单周期延迟(33 µs)削减了相位。 因此,通过 30 kHz 电流环可获得的实用带宽为 1~2 kHz,在其之上的位置环为数百 Hz~1 kHz,再之上的机器人策略为几十~数百 Hz。 这种结构使得每一层都比上一层慢大约 10 倍。
4.4 双连杆手臂:耦合与重力
| 控制器(1 kHz,力矩限制 60 N·m) | 最大误差 | RMS | 击打瞬间位置/速度误差 |
|---|---|---|---|
| PD | 41.0 mrad | 20.0 | 30.7 mrad / 0.95 rad/s |
| PD + 重力补偿 | 37.8 | 18.8 | 27.9 / 0.92 |
| 计算力矩(准确模型) | 1.7 | 0.83 | 1.0 / 0.11 |
| 计算力矩(质量小 20%) | 10.5 | 4.7 | 8.4 / 0.28 |
| 计算力矩(质量大 20%) | 7.0 | 3.1 | 7.0 / 0.03 |
- 仅进行重力补偿几乎没有改善。在快速挥拍过程中起主导作用的不是重力,而是 惯性和耦合项。
- 计算力矩产生的误差是 PD 的 1/24,即使质量存在 20% 的偏差,也比 PD 好 4~6 倍。
如果将力矩限制降低到 30 N·m(小于轨迹所需的 40 N·m),计算力矩的最大误差将达到 264 mrad,PD 为 218 mrad,两者均会崩塌。 控制器无法 求出无法实现的轨迹。 在创建轨迹时(第 8 篇),必须先确认逆动力学力矩是否在极限之内。
5. 限制
- 全部都是仿真。未计入减速器齿隙、皮带弹性、编码器噪声与量化、通信延迟的抖动以及电机的力矩-速度曲线(未实测)。
- 控制增益仅采用了一种规则。如果为每个周期单独调整增益,200 Hz 的结果可能会有所改善。
- 电流环被简化为了 q 轴单个 RL 电路。未涉及反电动势、d·q 轴耦合以及 PWM 的电压量化。
6. 总结
- 对于预先知道轨迹的机器人而言,最大的改进是 前馈。在相同的 PD 基础上加上逆动力学后,误差减小了 20 倍以上。
- 在多关节手臂中,计算力矩消除了耦合。即使模型有 20% 的误差,也比纯 PD 好得多。
- 控制周期在 1 kHz 左右就足够了,而在 200 Hz 下则无法跟上 0.1 秒的挥动动作。电流环的速度必须比这快 10 倍以上,30 kHz 电流环的实用带宽为 1~2 kHz。
- 挑选开源硬件部件时需要看这几个数字:电机控制器的位置环周期以及是否支持前馈力矩输入(moteus 的位置模式控制式中有前馈力矩项),还有上位机与电机控制器之间的通信周期。
Titi 的话。 既然已经知道球拍要去哪里,就没必要等到产生误差再去补救。只要先产生所需的力,反馈只需修正偏差的部分即可!
参考
所有资料均于 2026-10-18 查阅。
- Lynch, Park, Modern Robotics, 2017, 公开预印本,第 11 章(11.4 力矩输入控制,式 11.35)。
- mjbots, moteus docs/reference/theory.md(位置与电流环结构,默认 30 kHz)。
- ODrive Robotics, ODrive API Reference 0.6.12(
n_evt_control_loop说明中的 8 kHz 假设)。 - Koç, Maeda, Peters, RAS 105 (2018), 作者公开版,第 6.2 节(500 Hz 控制)。
- D'Ambrosio 等, arXiv:2309.03315(策略 100 Hz,ABB EGM 248 Hz), arXiv:2408.03906(低级技术 50 Hz)。