2. 机器人动力学基础:牛顿-欧拉方程、拉格朗日方程、惯性矩阵、科里奥利力与离心力、重力项

做力矩控制,绕不开动力学。说白了,你得知道机器人动起来需要多大的力,以及这些力都去哪儿了。我刚开始接触这个领域时,总觉得动力学就是一堆公式推导,直到在项目里被一个抖动问题折磨了两周……嗯,从那以后我老老实实把动力学基础补了一遍。

这一章我们聚焦五个核心概念:牛顿-欧拉方程、拉格朗日方程、惯性矩阵、科里奥利力与离心力、重力项。它们构成了机器人动力学建模的基石,也是后续力矩控制算法的理论支撑。

核心观点: 机器人动力学本质上是描述关节力矩与运动状态(位置、速度、加速度)之间关系的数学映射。你理解得越深,控制效果就越稳。

2.1 牛顿-欧拉方程:从单刚体到多连杆

牛顿-欧拉法,我个人习惯叫它“力平衡法”。它从牛顿第二定律和欧拉方程出发,逐连杆递推计算每个关节所需的力和力矩。

对于单个刚体,牛顿方程描述平动:

F = m * a_c

欧拉方程描述转动:

τ = I * α + ω × (I * ω)

其中 F 是合力,m 是质量,a_c 是质心加速度,τ 是合力矩,I 是惯性张量,α 是角加速度,ω 是角速度。

应用到多连杆机器人时,算法分为两步:

  1. 正向递推:从基座到末端,计算每个连杆的速度、加速度。
  2. 反向递推:从末端到基座,计算每个关节的力和力矩。

我在项目中遇到过一个问题:用牛顿-欧拉法建模时,如果坐标系定义不统一,递推结果会完全错误。你想想看,一个关节的力矩算出来是负的,电机还怎么控?

实战技巧: 写代码实现牛顿-欧拉递推时,建议先用符号推导验证一个两连杆模型,再扩展到多自由度。我习惯用 MATLAB 的 Symbolic Toolbox 做这一步。

2.2 拉格朗日方程:能量视角的优雅解法

拉格朗日法走的是另一条路——从能量角度出发。它不直接分析力,而是通过系统的动能和势能来推导运动方程。

拉格朗日函数定义为:

L = T - V

其中 T 是系统总动能,V 是系统总势能。然后代入拉格朗日方程:

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

这里 q 是广义坐标(关节角度),q̇ 是广义速度,τ 是广义力(关节力矩)。

为什么说它优雅?因为拉格朗日法自动处理了约束力和内部耦合,你只需要写出能量表达式就行。我记得第一次用拉格朗日法推导六轴机器人的动力学方程时,虽然代数运算量很大,但最终结果的结构非常清晰。

对比项 牛顿-欧拉法 拉格朗日法
计算效率 高(递推形式,适合实时控制) 低(需要大量符号运算)
物理直观性 强(直接对应力和力矩) 弱(通过能量间接推导)
适用场景 实时控制、嵌入式实现 理论分析、离线仿真
处理约束 需要显式处理 自动包含
避坑指南: 我曾经在推导一个七自由度冗余机器人的动力学时,用拉格朗日法算出来的惯性矩阵不对称,查了两天才发现是动能表达式里漏了一个交叉项。所以,写完公式一定要检查矩阵的对称性。

2.3 惯性矩阵:质量分布的数字画像

惯性矩阵 M(q) 描述了机器人各关节的惯性特性。它是一个对称正定矩阵,维度等于机器人的自由度。

对于 n 自由度机器人,惯性矩阵的形式是:

M(q) = [m₁₁  m₁₂  ...  m₁ₙ]
       [m₂₁  m₂₂  ...  m₂ₙ]
       [ ...  ...  ...  ... ]
       [mₙ₁  mₙ₂  ...  mₙₙ]

其中 mᵢⱼ 表示关节 j 的加速度对关节 i 的力矩贡献。对角元素是各关节自身的惯性,非对角元素是耦合惯性。

在实际控制中,惯性矩阵有两个关键作用:

  • 前馈补偿: 根据期望加速度计算所需的惯性力矩。
  • 解耦控制: 通过矩阵求逆消除关节间的惯性耦合。

你想想看,如果忽略非对角元素,一个关节的运动会干扰其他关节,控制精度就会下降。我在做精密装配项目时,就遇到过因为没补偿耦合惯性导致末端抖动的问题。

2.4 科里奥利力与离心力:速度引起的“隐形力”

科里奥利力和离心力都跟速度有关,它们合起来写成 C(q, q̇)q̇。其中 C(q, q̇) 是科里奥利-离心力矩阵。

这两个力的物理含义:

  • 科里奥利力: 当一个关节运动时,另一个关节的运动受到的影响。比如,肩关节转动时,肘关节的运动会产生一个垂直于两者运动方向的力。
  • 离心力: 关节自身旋转产生的离心效应。速度越快,离心力越大。

我记得在调试一个高速搬运机器人时,发现当末端速度超过 2 m/s 时,轨迹跟踪误差突然变大。排查后发现是科里奥利力项被忽略了。加上之后,误差立刻降了下来。

关键点: 低速场景(< 0.5 m/s)可以忽略科里奥利力与离心力,但高速场景必须补偿。我一般以 0.3 m/s 作为分界线,低于这个值就只补偿重力和惯性。

2.5 重力项:最容易被低估的力

重力项 G(q) 是机器人动力学中最直观也最容易被低估的部分。它只跟关节位置有关,跟速度、加速度无关。

重力项的计算公式:

G(q) = ∂V(q) / ∂q

其中 V(q) 是系统的重力势能。对于串联机器人,每个连杆的重力势能是 mᵢ * g * hᵢ(q),hᵢ 是连杆质心的高度。

为什么说它容易被低估?因为很多人觉得重力补偿就是加一个固定值。但实际中,机器人构型变化时,重力矩的变化范围可能很大。比如一个六轴机器人,从水平姿态到竖直姿态,肩关节的重力矩可能变化 3-5 倍。

我曾经在一个协作机器人项目里,只做了静态重力补偿,结果机器人在某些姿态下会“溜肩”——就是关节锁不住,慢慢往下掉。后来加了实时重力补偿,问题才解决。

工程建议: 重力补偿最好在线计算,不要用查表法。因为负载变化、工具更换都会改变重力参数。我习惯在控制循环里每周期更新一次重力项。

2.6 知识体系总览

下面这张图把本章的核心概念串起来了。你可以看到,动力学建模的两条路径最终都汇入同一个标准形式:

M(q)q̈ + C(q, q̇)q̇ + G(q) = τ
机器人动力学建模知识体系 牛顿-欧拉法 拉格朗日法 标准动力学方程:M(q)q̈ + C(q,q̇)q̇ + G(q) = τ 惯性矩阵 M(q) 科里奥利-离心力 C(q,q̇)q̇ 重力项 G(q) 力矩控制应用:前馈补偿 + 反馈控制 + 重力补偿 动力学模型越精确,力矩控制的鲁棒性和精度就越高

2.7 动力学参数辨识:从理论到工程

理论公式写好了,但实际中你还需要知道具体的参数值:质量、质心位置、惯性张量。这些参数通常通过辨识实验获得。

常用的辨识方法:

  1. CAD 模型提取: 从三维模型直接读取,但精度受限于模型与实际的一致性。
  2. 最小二乘辨识: 让机器人按激励轨迹运动,采集力矩和运动数据,离线拟合参数。
  3. 自适应在线辨识: 在控制过程中实时更新参数,适合负载变化的场景。

我记得第一次做参数辨识时,用了最简单的“单关节正弦激励法”。虽然精度一般,但胜在实现简单,适合快速验证。后来做高精度应用时,才改用“傅里叶级数激励轨迹”。

注意: 辨识出来的参数一定要做物理一致性检查。比如惯性矩阵必须正定,质量不能为负。我曾经遇到过辨识结果中某个连杆的惯性矩是负的,查了半天发现是数据采集时传感器噪声太大。