2. 动力学基础:牛顿-欧拉方程与拉格朗日方程,机器人动力学模型建立
聊到关节级力矩控制,绕不开的就是动力学。说白了,你得知道机器人动起来需要多大的力,这个力跟位置、速度、加速度是什么关系。我刚开始做机器人控制那会儿,总觉得动力学是理论家的事,调个PID就能跑。结果有一次六轴机器人高速运动时,末端抖得跟筛子似的……嗯,从那以后我老老实实回来啃动力学。
这一章,我们就来拆解两个最核心的动力学建模方法:牛顿-欧拉法和拉格朗日法。它们就像两把不同的扳手,拧的却是同一颗螺丝。
2.1 为什么需要动力学模型?
先想一个问题:你给电机发一个力矩指令,机器人为什么会动?
运动学只告诉你位置、速度、加速度的几何关系,但它不告诉你力。而动力学,就是建立「力/力矩」与「运动」之间的桥梁。没有这个桥梁,力矩控制就是盲人摸象。
核心公式(单刚体):
牛顿方程:F = m · a(平动)
欧拉方程:τ = I · α + ω × (I · ω)(转动)
机器人是多刚体串联系统,每个关节的力矩都要考虑自身运动以及所有下游连杆的耦合影响。
我个人习惯把动力学模型比作「力矩的会计账本」——每一分力矩去了哪里,必须算清楚。
2.2 牛顿-欧拉法:递推的力量
这个方法很直观,就是对着每个连杆用牛顿第二定律和欧拉方程。但机器人有多个连杆,怎么算?
答案是:两步递推。
- 正向递推(Outward):从基座开始,依次计算每个连杆的速度、加速度(包括科里奥利和离心项)。
- 反向递推(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 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个「动力学建模路线图」。
2.7 建模中的常见陷阱
最后,分享几个我踩过的坑:
- 惯性参数不准:CAD模型给的惯性张量往往和实物有偏差。我建议你做完模型后,一定要做动力学参数辨识,用实验数据校准。
- 忽略关节柔性:谐波减速器、RV减速器都有柔性。如果你做高速高精度控制,建议在动力学模型中引入关节刚度项。
- 摩擦力建模太简单:库仑+粘滞模型在很多场景下不够用。Stribeck效应、滞回效应,在低速时影响很大。
一个小技巧:在做动力学模型验证时,可以给机器人一个已知轨迹,然后用模型预测力矩,再和实际电流换算的力矩对比。如果误差在5%以内,说明模型基本可用。
嗯,动力学基础就聊到这里。记住,模型是控制的上限,算法只是逼近这个上限的手段。把模型做准了,后面的力矩控制才能得心应手。