第3章 机器人动力学基础

动力学,说白了就是研究机器人为什么会动、动起来需要多大的力。你想想看,运动学只告诉你关节角度和末端位置的关系,但真要让它跑起来、抓东西、抵抗重力,就得靠动力学。我个人习惯把动力学比作机器人的“体能训练”——没有它,再好的运动学算法也只是纸上谈兵。

机器人动力学 牛顿-欧拉法 拉格朗日法 参数辨识 动力学仿真 递推迭代 · 力/力矩 最小二乘 · 激励轨迹 仿真引擎 · 实时联调 → 为控制、仿真、辨识提供基础

3.1 牛顿-欧拉法:力与运动的“硬核算”

这个方法特别直观——就是对着每个连杆写牛顿方程和欧拉方程。我记得刚入行时,带我的老工程师说:“别怕,就是 F=ma 和 τ=Iα 的升级版。” 确实,牛顿-欧拉法从基座开始往外递推速度、加速度,再从末端往基座递推力和力矩。

核心思路: 外推(速度/加速度)→ 内推(力/力矩)。
每个连杆 i 都要算:
ᵢωᵢ = ᵢRᵢ₋₁ · ᵢ₋₁ωᵢ₋₁ + θ̇ᵢ · ᵢzᵢ (角速度)
ᵢαᵢ = ᵢRᵢ₋₁ · ᵢ₋₁αᵢ₋₁ + θ̈ᵢ · ᵢzᵢ + ᵢωᵢ₋₁ × θ̇ᵢ · ᵢzᵢ
然后用力/力矩平衡方程求出关节驱动力矩。

我在项目里调试六轴机械臂时,曾经因为忽略科里奥利力项,导致高速运动时力矩估算偏差了 30%。嗯,这里要注意:牛顿-欧拉法虽然计算效率高,但推导时容易漏项,尤其旋转关节的耦合项。

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

拉格朗日法不直接跟力较劲,而是盯着系统的动能和势能。你想想看,只要写出拉格朗日函数 L = T - V,然后套公式:

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

就能得到动力学方程。我个人觉得拉格朗日法更适合做理论分析,尤其是要推导闭式动力学模型的时候。但说实话,对于自由度多的机器人,手动推导拉格朗日方程会让人崩溃——我当年手推过一个 7 自由度臂,整整花了两天,还查出一处符号错误。

我的建议: 做原型验证时用拉格朗日法推导质量矩阵 M、科里奥利矩阵 C、重力向量 G,写成标准形式:
M(q)q̈ + C(q,q̇)q̇ + G(q) = τ
这个形式对控制设计非常友好。我在仿真中经常用这个结构做前馈补偿。

3.3 动力学参数辨识:让模型贴近真实

理论模型再漂亮,参数不准也是白搭。连杆质量、质心位置、惯性张量——这些值从 CAD 模型里导出来往往有误差。我曾经遇到过一台机器人,仿真里跑得稳稳的,一上实机就抖,最后发现是转动惯量差了 20%。

参数辨识说白了就是“用实验数据反推参数”。常用方法:

  • 激励轨迹设计: 让机器人跑充分激励的轨迹(比如傅里叶级数轨迹),采集关节位置、速度、力矩。
  • 最小二乘估计: 把动力学方程写成线性形式 Y(q,q̇,q̈) · θ = τ,然后用 θ = (YᵀY)⁻¹Yᵀτ 求解。
  • 物理一致性约束: 保证辨识出的惯性矩阵正定、质心在合理范围内。
避坑指南: 我曾经因为激励轨迹频率太低,导致辨识出的参数方差巨大。后来改用多正弦叠加的轨迹,并保证持续激励条件,参数才稳定下来。另外,一定要做数据滤波——关节力矩信号特别容易混入高频噪声。

3.4 动力学仿真:从模型到“数字孪生”

有了动力学模型和参数,就可以在仿真环境里跑起来了。我个人习惯把动力学仿真分成三个层次:

层次工具/方法典型用途
1. 数值仿真MATLAB/Simulink, Python (numpy/scipy)算法验证、控制器调参
2. 物理引擎仿真Gazebo, MuJoCo, PyBullet传感器仿真、软硬件联调
3. 实时仿真ROS2 + 实时内核 + 硬件在环控制器原型、HIL测试

在 Gazebo 里做动力学仿真时,我通常会先检查 URDF 中的惯性参数是否合理。你想想看,如果质心位置写错了,仿真出来的重力补偿力矩就是错的,机械臂会直接“塌”下去。

联调实战要点:
• 仿真步长建议 1ms 以下,显式积分器(如 RK4)要留意数值稳定性。
• 关节摩擦、电机饱和这些非线性因素一定要加进去,否则仿真太“理想”,上实机就露馅。
• 我习惯在仿真中注入白噪声力矩,模拟真实驱动器的脉动,提前暴露控制器的鲁棒性问题。

嗯,动力学这部分内容确实硬核,但它是机器人控制、仿真、辨识的基石。我个人觉得,花时间把牛顿-欧拉法和拉格朗日法搞透,再亲手做一次参数辨识实验,比看十遍理论都有用。