一个方程,三种力
如果说运动学问的是「手臂在哪里?」,那么动力学问的是更难的问题:「要让手臂这样运动,需要付出什么?」答案就是机器人运动方程——这一行式子记下了机械臂所经历的每一次推动、旋转与下坠。对于有多个关节的机器人,它写作 M(q)q̈ + C(q,q̇)q̇ + g(q) = τ,其中 q 是关节角度的列表,q̇ 是它们运动的快慢,q̈ 是这个快慢变化的速度。
右边的 τ(希腊字母 tau)是关节力矩——每个电机必须提供的扭转力。左边把这份力分成三项任务:M(q)q̈ 是加速质量的代价,C(q,q̇)q̇ 是关节同时运动时出现的旋涡,g(q) 是对抗重力的开销。可以把它读作一份预算:电机输出的每一牛·米,都花在这三件事之一上。
质量矩阵:随姿态变化的「重」
在牛顿的 F = ma 中,质量是单个数值。对带关节的机器人来说,这个数值变成了一张网格,叫做质量(惯性)矩阵,记作 M(q)。它是随姿态变化的「重」:推动一条伸展的手臂,比推动一条折叠的手臂费力得多,尽管实际质量丝毫未变。这就是 M 依赖于位形 q 的原因——把肘部折起来,矩阵里的数字就变小。
这张网格还有非对角线上的元素,它们道出一个微妙的真相:加速一个关节,会推搡其他关节。让肩部猛地前甩,即使肘部自己的电机什么也没做,肘部也会被带动。M 的对角线是每个关节「自身」的重;非对角线上的元素则是关节之间相互倚靠的方式。
这些数字从何而来?每个连杆抵抗转动的能力由它的惯性张量刻画——这是一个 3×3 的描述,说明单个物体的质量是如何围绕其质心分布的。一根细长的杆绕自身长度轴旋转很轻松,却很难翻筋斗式地翻转;惯性张量恰好编码了这种不对称。质量矩阵 M(q) 正是把所有连杆的惯性张量针对某一姿态融合在一起后得到的结果。
科里奥利与离心:因同时运动而生的力
中间一项 C(q,q̇)q̇ 装着科里奥利与离心项。注意它对速度是二次的——每一项都含有两个速度因子相乘——所以只有当关节真正在运动时它才会苏醒。静止时它消失;让东西转起来,它便迅速增长。
离心部分是单个关节旋转时向外的拉扯,转得越快这股力越大——就是把水甩出旋转雨伞的那种力。科里奥利部分更隐蔽:它只在两个关节一起运动时出现,是一种侧向力,源于一根连杆在扫动、而另一根正改变着它到轴的距离。想想花样滑冰选手收拢手臂以转得更快——那加速正是同一效应的可见体现。
这些力既不是摩擦,也不是重力——它们既不创造也不消耗能量。它们只不过是用关节角度去描述一个旋转的多关节物体时所要付出的代价。忽略它们,一台高速机器人在每条曲线轨迹上都会冲过头,因为控制器从未把高速时累积起来的旋涡计算在内。
重力:仅仅为了静止不动所需的力矩
最后一项 g(q) 是重力载荷。与其他项不同,它根本不需要任何运动——即使一条静止的手臂也能感受到它。把你的手臂笔直地伸出去,仅仅为了不让它掉下来,你的肩膀就要费很大力气;机器人的电机面对的正是同样的要求。由于重力的力臂随姿态改变,g 依赖于 q:一条平伸的手臂所需的保持力矩,远大于一条垂直下垂的手臂。
这正是重力补偿的依据:控制器算出 g(q),并恰好下达这么大的力矩,使手臂既不上抬也不下坠。重力被抵消后,肢体仿佛漂浮——你可以用一根指尖引导沉重的机械臂,因为电机正悄悄替你扛着它的重量。这就是协作机械臂上「零重力」示教模式背后的把戏。
从期望的运动反推 τ——输入 q、q̇、q̈,读出所需力矩——这叫做逆动力学。重力补偿是它最简单的情形:把速度和加速度设为零,只问「什么力矩能保持这个姿态?」,剩下的便只有 g(q)。再把另外两项加回来,你就能下达完整、快速的轨迹指令。
tau = M(q) @ qddot + C(q, qdot) @ qdot + g(q) # Gravity compensation only (hold still): # qdot = 0, qddot = 0 -> tau = g(q) # Full inverse dynamics (follow a trajectory): # give desired q, qdot, qddot -> solve for tau
一眼读懂整个方程
把三项并排放在一起,一幅清晰的图景便浮现出来。每一项回答一个不同的问题,三者合起来,就解释了电机必须产出的每一牛·米。
- M(q)q̈ ——「加速有多难?」抵抗加速度的惯性;当 q̈ = 0(匀速)时消失。
- C(q,q̇)q̇ ——「高速时出现什么旋涡?」科里奥利与离心力;当 q̇ = 0(静止)时消失。
- g(q) ——「此刻重力要求什么?」保持静止所需的力矩;即使一切静止也存在。
- τ ——电机必须输出的总和。真实机器人还会加上一项摩擦,代表关节与齿轮内部的阻力。
真实硬件还会诚实地加上一项:关节摩擦,即轴承与齿轮箱内部的阻力,理想方程把它略去了。预先算好 M、C、g 的控制器——这正是计算力矩控制的核心思想——之所以能让机器人又快又准地运动,恰恰是因为它们提前预测了这些力,而不是等事后再去对抗。