4、动力学基础:牛顿-欧拉法、拉格朗日法、动力学参数辨识入门

动力学,说白了就是研究「力与运动的关系」。

在机械臂精细操作里,动力学不是可选项,而是必选项。你想想看,如果不知道关节需要多大的力矩才能让末端执行器精准地走一条轨迹,那所谓的「精细操作」就是空中楼阁。

我个人习惯把动力学分成两派:一派是牛顿-欧拉法,另一派是拉格朗日法。两派都能算出同样的结果,但思路完全不同。咱们一个一个聊。

4.1 牛顿-欧拉法:从力的传递角度看问题

牛顿-欧拉法的核心思想,就是「力的平衡」加上「力矩的平衡」。

它把机械臂拆成一个个连杆,从末端往基座方向递推。为什么从末端开始?因为末端通常没有外力(或者外力已知),我们可以从那里开始反向计算每个关节需要的驱动力矩。

核心公式(简化版):

对于每个连杆 i:
  力平衡:F_i = m_i * a_i + F_{i+1}
  力矩平衡:τ_i = I_i * α_i + r_i × F_i + τ_{i+1}

其中 F_i 是连杆 i 受到的力,τ_i 是关节力矩,m_i 是质量,I_i 是惯性张量。

我在项目中遇到过一个问题:用牛顿-欧拉法做实时控制时,递推计算量其实不大,但惯性张量的坐标系转换特别容易出错。嗯,这里要注意——每个连杆的惯性张量必须转换到当前关节坐标系下,否则算出来的力矩会差一个旋转矩阵。

避坑指南:

我曾经在调试六轴机械臂时,发现末端轨迹总是有0.5mm的抖动。查了两天,最后发现是惯性张量的坐标系搞反了。从那以后,我每次做牛顿-欧拉递推前,都会先画一张坐标系变换图,确保每个量的参考系都写清楚。

4.2 拉格朗日法:从能量角度看问题

拉格朗日法走的是另一条路——它不看力,看能量。

拉格朗日函数 L = 动能 T - 势能 V。然后对每个关节求偏导,就能得到动力学方程。

拉格朗日方程:

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

其中 q 是关节角度,q̇ 是角速度,τ 是关节力矩。

说实话,拉格朗日法在推导上比牛顿-欧拉法更优雅。你不需要考虑每个连杆之间的约束力,只需要写出系统的总动能和总势能就行。

但代价是什么?计算量更大。尤其是当机械臂自由度超过6个时,拉格朗日法推导出来的表达式会变得非常冗长。我建议在仿真阶段用拉格朗日法做离线分析,但在实时控制中,还是牛顿-欧拉法更实用。

注意:

拉格朗日法推导时,一定要小心「科里奥利力」和「离心力」项。很多初学者会漏掉这两项,导致动力学模型在高速度下完全不准。我见过有人用简化模型做高速抓取,结果机械臂直接抖成了筛子。

4.3 动力学参数辨识入门

好,现在你有了动力学模型。但模型里的参数——质量、质心位置、惯性张量——从哪来?

从CAD模型里导出来的参数,往往和实际有偏差。为什么?因为加工误差、装配误差、线缆的附加质量,这些CAD里都不体现。

所以我们需要做一件事:动力学参数辨识。

说白了,就是让机械臂自己动一动,然后根据传感器反馈的力矩数据,反推出真实的动力学参数。

辨识的基本流程:

  1. 设计激励轨迹:让机械臂跑一组能充分激发所有动力学特性的轨迹。比如正弦扫频、多项式轨迹等。
  2. 采集数据:记录关节角度、角速度、角加速度和关节力矩。
  3. 构建回归矩阵:把动力学方程写成 Y(q, q̇, q̈) * θ = τ 的形式,其中 θ 是待辨识的参数向量。
  4. 最小二乘求解:用采集到的多组数据,求解 θ = (Y^T Y)^{-1} Y^T τ。

个人经验:

我做过一次六轴机械臂的参数辨识,踩了一个大坑——激励轨迹的幅值太小。结果辨识出来的参数方差特别大,根本没法用。后来我把轨迹幅值加大到关节限位的80%,辨识结果才稳定下来。

另外,记得在辨识前对数据进行滤波。关节角速度通常由位置差分得到,噪声很大。我习惯用零相位低通滤波器,能有效抑制噪声而不引入相位延迟。

4.4 知识体系总览

下面这张图,是我自己总结的动力学知识框架。你可以把它当作一个导航图,随时回来对照。

机械臂动力学知识体系 牛顿-欧拉法 拉格朗日法 力平衡 + 力矩平衡 从末端向基座递推 适合实时控制 动能 - 势能 全局能量视角 适合离线仿真 动力学参数辨识 激励轨迹设计 (正弦/多项式) 最小二乘求解 (数据滤波) 三者关系:牛顿-欧拉与拉格朗日是两种建模方法,参数辨识是让模型更准的关键步骤

4.5 三种方法的对比

方法 核心思想 计算效率 适用场景 我的建议
牛顿-欧拉法 力与力矩的递推平衡 高(O(n)) 实时控制、嵌入式系统 控制首选,代码实现简单
拉格朗日法 系统能量守恒 低(O(n^4)) 离线仿真、轨迹优化 推导清晰,但计算量大
参数辨识 数据驱动反推参数 离线进行 模型校准、自适应控制 必做!CAD参数不可信

最后说一句:动力学这东西,光看书是学不会的。我建议你找一台真实的机械臂(或者用仿真环境),把牛顿-欧拉法手写一遍,然后对比一下商用库(比如KDL、Pinocchio)的结果。等你发现自己的计算结果和库函数对不上时,恭喜你——你已经开始真正理解动力学了。