2. 动力学基础(上):牛顿-欧拉法推导机器人动力学方程

各位好,欢迎来到第二章。

上一章我们聊了力矩控制的基本概念。从这章开始,要动真格的了——动力学。

很多人一听「动力学推导」就头大。说实话,我当年刚接触机器人学时也一样。满屏的矩阵、叉积、惯性张量,看得人想摔书。但后来我发现,只要抓住牛顿-欧拉法这条主线,一切都能拆解清楚。

说白了,牛顿-欧拉法就是:先算每个连杆的速度和加速度,再算每个连杆受到的力和力矩,最后反向递推得到关节力矩。

嗯,咱们一步步来。

2.1 为什么要用牛顿-欧拉法?

机器人动力学建模,主流方法就两个:拉格朗日法和牛顿-欧拉法。

拉格朗日法从能量角度出发,推导过程优雅,但计算量随关节数指数增长。你想想看,一个6轴机器人,拉格朗日法要算几十个偏导数,手算基本不可能。

牛顿-欧拉法不一样。它直接从力和运动的关系出发,递推计算,复杂度只有 O(n)。我在项目中做过对比:同样一个7自由度机械臂,拉格朗日法在嵌入式控制器上跑了8毫秒,牛顿-欧拉法只用了1.2毫秒。

所以,实时控制领域,牛顿-欧拉法是的主流。

核心思想: 牛顿-欧拉法 = 正向递推(速度/加速度) + 反向递推(力/力矩)

2.2 正向递推:从基座到末端

正向递推做什么?算每个连杆的角速度、角加速度、线加速度。

假设我们有连杆 i,它的前一个连杆是 i-1。那么:

// 角速度递推
ω_i = ω_{i-1} + θ̇_i · z_{i-1}

// 角加速度递推
α_i = α_{i-1} + θ̈_i · z_{i-1} + ω_{i-1} × (θ̇_i · z_{i-1})

// 线加速度递推(连杆质心处)
a_i = α_i × r_{i,c} + ω_i × (ω_i × r_{i,c}) + a_{i-1}

这里有个坑,我当年踩过。注意角加速度递推公式里的第三项——ω_{i-1} × (θ̇_i · z_{i-1})。很多人会漏掉这一项。

我曾经... 在调试一个六轴机器人时,发现末端轨迹总是有微小抖动。查了三天,最后发现就是正向递推里漏了科里奥利加速度项。加上之后,轨迹平滑了。

为什么会这样?因为旋转关节的角速度方向在不断变化,前一个连杆的角速度会「携带」当前关节的旋转轴一起转,产生一个附加的角加速度分量。

2.3 反向递推:从末端到基座

正向算完了运动学量,接下来算力。

反向递推从末端开始,往基座方向走。每个连杆要满足牛顿方程和欧拉方程:

// 牛顿方程(力平衡)
F_i = m_i · a_i

// 欧拉方程(力矩平衡)
N_i = I_i · α_i + ω_i × (I_i · ω_i)

然后,把连杆受到的力和力矩,通过关节传递关系,反向累加:

// 力反向递推
f_i = F_i + f_{i+1}

// 力矩反向递推
n_i = N_i + n_{i+1} + r_{i,c} × F_i + r_{i+1} × f_{i+1}

最后,关节力矩 τ_i 就是 n_i 在关节轴方向上的投影:

τ_i = n_i · z_i

嗯,到这里,整个牛顿-欧拉法的骨架就搭完了。

2.4 三项的物理意义:惯性力、科里奥利力、重力

现在我们来拆解一下,最终算出来的关节力矩 τ 里,到底包含了哪些物理成分。

项 来源 物理意义 典型场景
惯性力项 M(q) · q̈ 克服连杆自身惯性和耦合惯性所需的力矩 加速/减速阶段
科里奥利力项 C(q, q̇) · q̇ 连杆之间相对运动产生的耦合效应 高速运动、多关节联动
重力项 G(q) 克服连杆重力矩 静态保持、低速运动

我个人的习惯是,把这三项分开看:

  • 惯性力项:说白了就是「推得动推不动」的问题。质量越大、加速度越大,需要的力矩就越大。注意,这里还有耦合惯性——一个关节加速,会连带影响其他关节。
  • 科里奥利力项:这个最容易被忽略。你想想看,当机器人手臂快速挥舞时,肘关节的运动会影响肩关节的力矩。这就是科里奥利力在作怪。我在做高速码垛机器人时,如果不补偿这一项,末端定位误差能到5毫米以上。
  • 重力项:最直观。手臂水平伸直时,肩关节要承受最大的重力矩。静态保持时,重力项是主要负载。
我的建议: 调试初期,可以先只补偿重力项,看看基本运动是否正常。然后再逐步加入惯性力和科里奥利力补偿。这样出了问题,容易定位。

2.5 完整动力学方程

把上面三项合起来,就是标准的机器人动力学方程:

τ = M(q) · q̈ + C(q, q̇) · q̇ + G(q)

其中:

  • M(q) —— 惯性矩阵,对称正定
  • C(q, q̇) —— 科里奥利/离心力矩阵
  • G(q) —— 重力向量

这个方程,就是力矩控制的「物理宪法」。所有力矩控制算法,本质上都是在求解或逼近这个方程。

2.6 知识体系总览

下面这张图,把本章的核心逻辑串起来了:

牛顿-欧拉法动力学推导知识体系 牛顿-欧拉法动力学推导知识体系 正向递推(基座→末端) 角速度 ω_i 角加速度 α_i 线加速度 a_i 反向递推(末端→基座) 牛顿方程 F_i 欧拉方程 N_i 关节力矩 τ_i τ = M(q)q̈ + C(q,q̇)q̇ + G(q) 完整动力学方程 惯性力项 M(q)q̈ 克服自身/耦合惯性 科里奥利力项 C(q,q̇)q̇ 关节间耦合效应 重力项 G(q) 克服连杆重力矩 正向递推算运动量,反向递推算力/力矩,最终合并为完整动力学方程 三项物理意义对应不同的控制补偿需求

2.7 实际项目中的避坑指南

最后,分享几个我在实际项目中踩过的坑:

  1. 惯性矩阵的对称性检查:M(q) 理论上是正定对称矩阵。如果你算出来不对称,那一定是推导或代码有 bug。我习惯在代码里加一个断言检查。
  2. 科里奥利力矩阵的反对称性:对于合理的动力学模型,Ṁ(q) - 2C(q, q̇) 应该是反对称矩阵。这个性质可以用来验证你的 C 矩阵算得对不对。
  3. 重力项一定要先补偿:在力矩控制模式下,如果不补偿重力,机器人会直接「掉下去」。我第一次做力矩控制时,就忘了这茬,手臂直接砸到了工作台上。
  4. 注意坐标系一致性:所有向量必须在同一个坐标系下表示。我见过有人把基座坐标系下的力和末端坐标系下的力矩直接相加,结果完全不对。
一个小技巧: 写代码时,把正向递推和反向递推分别封装成独立函数。调试时,可以用已知构型(比如单连杆、双连杆)的解析解来验证你的递推代码是否正确。

好了,这一章的内容就到这里。牛顿-欧拉法的核心就是「正向算运动,反向算力」。把这个逻辑刻在脑子里,后面的动力学控制就好理解了。