2. 动力学基础:牛顿-欧拉方程与拉格朗日方程,机器人动力学模型建立

聊到关节级力矩控制,绕不开的就是动力学。说白了,你得知道机器人动起来需要多大的力,这个力跟位置、速度、加速度是什么关系。我刚开始做机器人控制那会儿,总觉得动力学是理论家的事,调个PID就能跑。结果有一次六轴机器人高速运动时,末端抖得跟筛子似的……嗯,从那以后我老老实实回来啃动力学。

这一章,我们就来拆解两个最核心的动力学建模方法:牛顿-欧拉法和拉格朗日法。它们就像两把不同的扳手,拧的却是同一颗螺丝。

2.1 为什么需要动力学模型?

先想一个问题:你给电机发一个力矩指令,机器人为什么会动?

运动学只告诉你位置、速度、加速度的几何关系,但它不告诉你力。而动力学,就是建立「力/力矩」与「运动」之间的桥梁。没有这个桥梁,力矩控制就是盲人摸象。

核心公式(单刚体):

牛顿方程:F = m · a(平动)

欧拉方程:τ = I · α + ω × (I · ω)(转动)

机器人是多刚体串联系统,每个关节的力矩都要考虑自身运动以及所有下游连杆的耦合影响。

我个人习惯把动力学模型比作「力矩的会计账本」——每一分力矩去了哪里,必须算清楚。

2.2 牛顿-欧拉法:递推的力量

这个方法很直观,就是对着每个连杆用牛顿第二定律和欧拉方程。但机器人有多个连杆,怎么算?

答案是:两步递推。

  1. 正向递推(Outward):从基座开始,依次计算每个连杆的速度、加速度(包括科里奥利和离心项)。
  2. 反向递推(Inward):从末端执行器开始,依次计算每个关节所需的力/力矩,并考虑连杆之间的相互作用力。

我在项目中遇到过一个问题:直接用牛顿-欧拉法建模时,忽略了关节摩擦的非线性项,结果低速时的力矩前馈误差很大。后来我在反向递推的力矩计算中,加了一个基于速度和负载的摩擦补偿项,才把精度提上来。

2.2.1 正向递推(速度与加速度传播)

假设连杆 i 相对于连杆 i-1 的角速度为 ω_{i-1},关节角速度为 q̇_i,那么:

ω_i = ω_{i-1} + z_i · q̇_i
α_i = α_{i-1} + z_i · q̈_i + ω_{i-1} × (z_i · q̇_i)
a_i = a_{i-1} + α_i × r_{i-1,i} + ω_i × (ω_i × r_{i-1,i})

其中 z_i 是关节轴方向,r_{i-1,i} 是从关节 i-1 到关节 i 的向量。你想想看,这些公式其实就是在做「运动的接力棒传递」。

2.2.2 反向递推(力矩计算)

从末端开始,每个连杆受到的外力包括:

  • 自身重力(在加速度项中已包含)
  • 来自下游连杆的力和力矩
  • 关节驱动力矩
f_i = m_i · a_{c,i} + f_{i+1}
τ_i = I_i · α_i + ω_i × (I_i · ω_i) + r_{i,c} × f_i + r_{i,i+1} × f_{i+1} + τ_{i+1}

最终,关节 i 的驱动力矩就是 τ_i 在关节轴 z_i 上的投影。

我的经验:牛顿-欧拉法计算效率极高,适合实时控制。我一般在嵌入式控制器上用C++实现,单次递推计算时间可以控制在微秒级。但要注意,递推过程中每一步的坐标系变换必须严格对齐,否则误差会累积。

2.3 拉格朗日法:能量的视角

如果你觉得牛顿-欧拉法像「硬算」,那拉格朗日法就是「巧算」。它不关心连杆之间的相互作用力,只关注系统的动能和势能。

拉格朗日函数 L 定义为:

L = T - U

其中 T 是总动能,U 是总势能。然后通过拉格朗日方程得到关节力矩:

τ_i = d/dt (∂L/∂q̇_i) - ∂L/∂q_i

这个过程看起来很优雅,但实际展开后,你会发现它和牛顿-欧拉法得到的是同一个模型。只不过拉格朗日法更容易处理约束和复杂拓扑结构。

避坑指南:我曾经用拉格朗日法推导一个7自由度协作机器人的动力学模型,结果符号推导出来的表达式长达几十页。后来我改用数值方法(如符号计算工具箱)生成代码,才避免了手算出错。对于超过3个自由度的系统,我建议你直接用牛顿-欧拉法做数值递推,或者用拉格朗日法配合自动微分工具。

2.4 两种方法的对比

特性 牛顿-欧拉法 拉格朗日法
计算效率 高(O(n) 递推) 低(O(n⁴) 符号展开)
物理直观性 强(力/力矩直接可见) 弱(能量抽象)
处理约束 需要额外处理 自然支持(通过广义坐标)
编程实现 适合实时控制 适合离线仿真与分析
典型应用 力矩前馈、阻抗控制 动力学参数辨识、轨迹优化

我个人习惯:实时控制用牛顿-欧拉,离线分析用拉格朗日。两者并不矛盾,反而可以互相验证。

2.5 机器人动力学模型的标准形式

无论你用哪种方法,最终得到的动力学模型都可以写成统一形式:

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

其中:

  • M(q):惯性矩阵(正定对称)
  • C(q, q̇):科里奥利和离心力矩阵
  • G(q):重力项
  • τ_f(q̇):摩擦力项(通常单独建模)
  • τ:关节驱动力矩

这个公式,就是整个关节级力矩控制的基石。你后面学到的前馈控制、计算力矩法、阻抗控制,全都是在这个公式上做文章。

重要性质:矩阵 Ṁ(q) - 2C(q, q̇) 是斜对称的。这个性质在稳定性证明中非常有用,做自适应控制时经常用到。

2.6 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个「动力学建模路线图」。

机器人动力学建模知识体系 机器人动力学建模知识体系 机器人系统输入 牛顿-欧拉法 正向递推 → 反向递推 拉格朗日法 动能 T - 势能 U → 方程 动力学标准形式 M(q)q̈ + C(q,q̇)q̇ + G(q) + τ_f = τ 惯性 M(q) 科里奥利 C 重力 G(q) 摩擦 τ_f 力矩前馈 · 计算力矩法 · 阻抗控制 · 自适应控制 两种方法殊途同归,最终都得到相同的标准动力学模型,只是计算路径不同

2.7 建模中的常见陷阱

最后,分享几个我踩过的坑:

  • 惯性参数不准:CAD模型给的惯性张量往往和实物有偏差。我建议你做完模型后,一定要做动力学参数辨识,用实验数据校准。
  • 忽略关节柔性:谐波减速器、RV减速器都有柔性。如果你做高速高精度控制,建议在动力学模型中引入关节刚度项。
  • 摩擦力建模太简单:库仑+粘滞模型在很多场景下不够用。Stribeck效应、滞回效应,在低速时影响很大。

一个小技巧:在做动力学模型验证时,可以给机器人一个已知轨迹,然后用模型预测力矩,再和实际电流换算的力矩对比。如果误差在5%以内,说明模型基本可用。

嗯,动力学基础就聊到这里。记住,模型是控制的上限,算法只是逼近这个上限的手段。把模型做准了,后面的力矩控制才能得心应手。