4. 正运动学建模

聊到机械臂动力学,很多刚入行的朋友第一反应就是「公式好复杂」。说实话,我当年也有这种感觉。但做了十几年机器人,我慢慢发现——动力学其实没那么可怕,关键是你得知道它到底在解决什么问题。

简单来说,动力学就是研究「力与运动的关系」。你给电机发一个力矩指令,机械臂到底怎么动?反过来,你希望机械臂按某个轨迹运动,需要多大的力矩?这就是动力学的核心。

动力学两大核心问题:

  • 正动力学:已知关节力矩 → 求解关节加速度、速度、位置
  • 逆动力学:已知关节位置、速度、加速度 → 求解所需关节力矩

实际工程中,逆动力学用得更多。比如轨迹跟踪控制、力控制、阻抗控制,都离不开它。

机械臂动力学知识体系 机械臂动力学 牛顿-欧拉法(递推) 拉格朗日法(解析) 牛顿第二定律 + 欧拉方程 拉格朗日函数 L = T - V 动力学参数辨识 最小二乘 / 滤波 工程应用:控制 / 仿真 / 参数辨识 牛顿-欧拉法适合实时控制,拉格朗日法适合理论分析

4.1 牛顿-欧拉法:工程派的首选

我个人习惯用牛顿-欧拉法做实时控制。为什么?因为它计算效率高,而且物理意义非常直观。

核心思想其实很简单:从基座开始,向外递推每个连杆的速度和加速度(正向递推);然后从末端执行器开始,向内递推每个关节的力和力矩(反向递推)。

我的经验:在六轴工业机器人上,牛顿-欧拉法的计算量大约是 O(n),而拉格朗日法是 O(n⁴)。你想想看,对于实时控制来说,这个差距有多大。

正向递推(速度与加速度)

从基座(连杆0)开始,依次计算每个连杆的角速度、角加速度、线加速度。公式长这样:

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

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

// 线加速度递推
a_{i+1} = R_{i+1}^i · (a_i + α_i × p_i + ω_i × (ω_i × p_i))

嗯,这里要注意:旋转矩阵 R 的方向别搞反了。我在项目中遇到过好几次,因为坐标系变换搞错,导致仿真结果完全不对。后来我养成了一个习惯——每次写完递推代码,先用一个简单的二连杆模型做验证。

反向递推(力与力矩)

从末端开始,向内计算每个连杆受到的力和力矩:

// 力平衡
f_i = R_{i+1}^i · f_{i+1} + m_i · a_{c_i}

// 力矩平衡
τ_i = R_{i+1}^i · τ_{i+1} + p_i × (R_{i+1}^i · f_{i+1}) + I_i · α_i + ω_i × (I_i · ω_i)

// 关节驱动力矩
τ_joint_i = τ_i · z_i

避坑指南:我曾经在调试一个协作机器人时,发现末端力矩总是偏大。查了两天才发现——惯性张量 I_i 是在连杆坐标系下定义的,但我在计算时忘了做坐标系变换。记住:惯性张量一定要转换到当前计算坐标系。

4.2 拉格朗日法:理论派的利器

拉格朗日法走的是另一条路——从能量角度出发。你不需要关心内部约束力,只需要写出系统的动能和势能。

公式很简洁:

L = T - V   (拉格朗日函数)

d/dt(∂L/∂q̇) - ∂L/∂q = τ   (拉格朗日方程)

其中 T 是系统总动能,V 是系统总势能,q 是广义坐标(关节角度)。

展开后,你会得到标准形式的动力学方程:

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

这里:

  • M(q):惯性矩阵,与关节位置有关
  • C(q, q̇):科里奥利力和离心力矩阵
  • G(q):重力项
  • τ:关节驱动力矩

两种方法的对比:

对比项 牛顿-欧拉法 拉格朗日法
计算复杂度 O(n),适合实时控制 O(n⁴),适合离线分析
物理意义 直观,力/力矩递推 抽象,能量角度
约束力处理 需要显式计算 自动消除
编程实现 递推结构,代码量适中 符号推导,代码量大
适用场景 实时控制、仿真 理论分析、控制器设计

4.3 动力学参数辨识:从理论到真机的关键一步

说实话,理论公式再漂亮,到了真机上也得面对现实——你根本不知道真实的惯性参数是多少。

CAD 模型给的参数?误差通常在 10%~30%。因为电机转子惯量、减速器摩擦、线缆阻力,这些在 CAD 里根本算不准。怎么办?辨识。

辨识的基本思路

说白了就是:让机械臂按特定轨迹运动,采集关节力矩和运动数据,然后用最小二乘法反推参数。

标准流程:

  1. 激励轨迹设计:通常是傅里叶级数形式的轨迹,保证充分激励所有参数
  2. 数据采集:关节位置、速度、加速度、力矩
  3. 滤波处理:去除噪声,尤其是加速度信号需要低通滤波
  4. 参数估计:最小二乘法或递推最小二乘法
  5. 验证:用另一条轨迹验证辨识结果的准确性

我的经验:激励轨迹的设计很关键。我曾经用简单的正弦轨迹做辨识,结果摩擦参数死活辨识不准。后来换成傅里叶级数轨迹,效果立竿见影。记住:轨迹要覆盖足够宽的频率范围。

最小二乘辨识公式

将动力学方程写成线性形式:

τ = Y(q, q̇, q̈) · θ

其中 Y 是回归矩阵(已知),θ 是待辨识的参数向量(未知)。

采集 N 组数据后:

θ = (Y^T · Y)^{-1} · Y^T · τ

嗯,这里有个坑——Y^T·Y 可能奇异。因为有些参数是线性相关的,无法独立辨识。解决办法是:先做参数重组,合并那些不可辨识的参数组合。

避坑指南:我曾经在辨识一个七轴协作机器人时,发现辨识结果在低速段误差很大。后来发现是摩擦力模型没选对。简单的库仑+粘滞摩擦模型不够,需要加上 Stribeck 效应。记住:摩擦模型的选择直接影响辨识精度。

常用辨识方法对比

方法 优点 缺点 适用场景
批量最小二乘 简单、稳定 需要存储全部数据 离线辨识
递推最小二乘 在线、内存小 对初值敏感 在线自适应
扩展卡尔曼滤波 可处理噪声 调参复杂 高精度辨识
神经网络 无需模型 泛化性差 研究阶段

4.4 工程实践中的几个关键点

最后,分享几个我在项目中积累的经验:

  • 先仿真再真机:在仿真环境里把动力学模型调通了,再上真机。我见过太多人直接上真机,结果把机器人搞出奇异位形。
  • 摩擦模型别忽视:很多动力学控制效果不好,不是因为惯性参数不准,而是摩擦模型太粗糙。
  • 验证要交叉:用一条轨迹做辨识,用另一条完全不同的轨迹做验证。如果验证误差大,说明辨识有问题。
  • 注意数值稳定性:尤其是加速度信号,微分放大噪声很严重。我习惯用中心差分+低通滤波的组合。

一句话总结:牛顿-欧拉法适合实时干活,拉格朗日法适合写做分析,参数辨识是连接理论与真机的桥梁。三者缺一不可。