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 知识体系总览
下面这张图,把本章的核心逻辑串起来了:
2.7 实际项目中的避坑指南
最后,分享几个我在实际项目中踩过的坑:
- 惯性矩阵的对称性检查:M(q) 理论上是正定对称矩阵。如果你算出来不对称,那一定是推导或代码有 bug。我习惯在代码里加一个断言检查。
- 科里奥利力矩阵的反对称性:对于合理的动力学模型,Ṁ(q) - 2C(q, q̇) 应该是反对称矩阵。这个性质可以用来验证你的 C 矩阵算得对不对。
- 重力项一定要先补偿:在力矩控制模式下,如果不补偿重力,机器人会直接「掉下去」。我第一次做力矩控制时,就忘了这茬,手臂直接砸到了工作台上。
- 注意坐标系一致性:所有向量必须在同一个坐标系下表示。我见过有人把基座坐标系下的力和末端坐标系下的力矩直接相加,结果完全不对。
好了,这一章的内容就到这里。牛顿-欧拉法的核心就是「正向算运动,反向算力」。把这个逻辑刻在脑子里,后面的动力学控制就好理解了。