核心思想:抵消你能预测的部分
机械臂很难控制,因为它会以复杂的方式「反抗」。重力对每个连杆的拉扯,会随手臂折叠的姿态而不同;当一个关节快速摆动时,它会通过耦合力把其他关节甩来甩去;而沉重的前臂比轻巧的腕部更难加速。一个普通的 PID 控制器 把这一切都看成杂乱又不断变化的扰动,永远慢半拍地追在后面。
这里有一个令人豁然开朗的洞见:上面那些几乎没有一样是真正不可预测的。重力、耦合力、变化的等效质量——这一切都源自我们能写下来的物理规律。机器人的 运动方程 是一条已知公式。那么,与其把物理当成敌人、被动地去回应它,何不精确算出它会做什么,并提前「买单」呢?
这就是 反馈线性化 背后的全部把戏。你给机器人包上一层数学,算出恰好能抵消重力、耦合项和变化惯量所需的力矩。剩下的部分——从外部看到的系统——不再是一台纠缠的非线性机构,而是表现得像控制理论中最简单的对象:一个你可以直接推动的自由质量。机器人自身的物理特性,已被减掉了。
逐项拆解计算力矩控制律
机器人的运动方程有一个标准形式,读懂它就掌握了全部要领。用关节角来写,它说:所需力矩 等于(等效质量)乘以(加速度),加上(速度耦合力),再加上(重力)。每一项都有名字,也有明确的物理职责。
tau = M(q) * qddot + C(q, qdot) * qdot + g(q) q = joint angles (where the arm is) qdot = joint velocities (how fast it moves) qddot = joint accelerations (how fast that changes) M(q) = mass / inertia matrix -> resistance to acceleration C(...) = Coriolis & centrifugal -> forces that arise from the joint velocities g(q) = gravity vector -> pull of gravity in this pose tau = joint torques you command the motors to produce
第一项用到 质量(惯量)矩阵 M(q)。它刻画了每个关节有多难加速,更关键的是,加速一个关节会如何推动相邻的关节。它依赖于姿态 q,因为伸展的手臂与折叠的手臂惯量大不相同。中间一项是 科里奥利与离心项:只有在关节已经运动时才会出现的、那种旋转甩动般的力。最后一项 g(q) 就是单纯的 重力补偿——每个电机仅仅为了让手臂不下垂所必须维持的稳定力矩。
从期望运动 (q, qdot, qddot) 反推出所需力矩,正是 逆动力学 这个问题:给定你想让手臂去到哪里,倒推出能把它送过去的力。在实践中,机器人用快速的 递归牛顿–欧拉算法 来计算它——该算法先沿手臂向外、再向内回扫,在一次高效遍历中算出每个关节力矩,快到足以在每个控制周期重做一遍。
抵消之后,简单的回路就奏效了
下面是抵消的实际接线方式。你不直接命令最终力矩,而是先决定一个期望的加速度——也就是你想要的动作——再向逆动力学公式索取能产生该加速度的力矩。质量矩阵以及重力、科里奥利项都在当前姿态和速度下求值。其输出是一条力矩指令;当模型正确时,它会让关节恰好按你的要求加速。
Step 1 - outer loop picks a desired acceleration:
a = qddot_des + Kd*(qdot_des - qdot) + Kp*(q_des - q)
\__feedforward__/ \______ PD on the tracking error ______/
Step 2 - inner loop turns that into real torque:
tau = M(q)*a + C(q,qdot)*qdot + g(q)
Result, if the model is exact, the error e = q_des - q obeys:
eddot + Kd*edot + Kp*e = 0 (a clean, tunable spring-damper)现在看看控制器从外部看到了什么。物理被抵消后,你的指令 a 与实际加速度之间剩下的关系就只是「加速度等于指令」——正是那个承诺过的双积分器。在这个干净系统之上,一个对误差作用的普通比例–微分回路表现得非常漂亮:误差方程变成教科书式的弹簧–阻尼器。你像选弹簧刚度那样选 Kp、像选减震器那样选 Kd,就能得到你想要的精确收敛行为,并且在每个关节、每个姿态下都完全一致。
代价:你的抵消只能和模型一样好
上面的一切都假设模型是精确的。它从来都不是。每个连杆的质量、其重心位置、每个关节的摩擦、夹爪里未知的负载——这些全都进入抵消公式,而它们全都只能近似已知。模型算错的部分不会凭空消失;它会作为一股残余力直接漏出来,而那个干净的双积分器本应没有这种力。
好消息是,外环 PD 仍能清理掉小的残差——一个稍微算错的重力项,看起来不过是它可以顶回去的轻微扰动。坏消息是,较大或系统性的误差,会损害正是让这套方法吸引人的那一点:完美的、与姿态无关的解耦会瓦解,而恰恰在手臂运动快、动力学最关键的时候,跟踪受损最严重。抵消的好坏,永远不会超过你对机器人的了解程度。
正是这一个弱点,引出了本章其余的大部分内容。自适应控制 在线调整不确定的模型参数,一边运行一边学习真实的连杆质量和摩擦。鲁棒控制 则换一种思路,设计一个无需辨识误差、就能在整段模型误差范围内保持稳定的控制器。而 滑模控制 加入一个强力的修正项,不论模型漏掉了什么,都强行把误差驱向零。计算力矩是那个干净的理想;这些则是与不完美的现实模型共处的工具。