3. 牛顿-欧拉动力学方程:平动与转动动力学,惯性张量

好,咱们进入动力学建模的核心环节。说实话,很多搞控制的同学一看到牛顿-欧拉方程就头大,觉得全是公式推导。但我个人习惯是:先搞明白物理意义,再去看数学形式。你想想看,一个机器人或者一个飞行器,它为什么会动?无非就是力和力矩的作用结果。

这一章,我们就来拆解平动和转动这两件事。我会把惯性张量这个“玄学”概念也讲透——它其实就是描述物体“有多难被转动”的一个量,只不过比质量复杂一点,因为它跟方向有关。

3.1 平动动力学:牛顿第二定律的“升级版”

平动部分其实大家都熟:F = m a。但在多体系统里,事情没那么简单。因为每个刚体都在动,而且它们之间还有约束。

我一般这样写平动方程:

m * dv/dt = F_ext + F_constraint

这里 F_ext 是外力(重力、推力、摩擦力),F_constraint 是约束力(铰链、关节、接触力)。

在实际项目中,我踩过一个坑:忘了考虑约束力的方向。有一次做四足机器人仿真,腿总是莫名其妙地飞出去。查了半天,发现是约束力的方向写反了。嗯,从那以后,我每次写平动方程都会画一遍自由体图。

我的习惯: 写平动方程前,先画自由体图。把每个刚体单独拿出来,标出所有外力和约束力。这一步做好了,方程基本不会错。

3.2 转动动力学:欧拉方程的“灵魂拷问”

转动部分比平动复杂一个量级。核心方程是:

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

这里:

  • I 是惯性张量(3x3 矩阵)
  • α 是角加速度
  • ω 是角速度
  • τ 是力矩

注意那个 ω × (I * ω) 项——这是陀螺力矩。说白了,就是物体在旋转时,会“抗拒”你改变它的旋转轴方向。你玩过陀螺吧?它立着转的时候,你推它一下,它不会倒,而是会进动。就是这个项在起作用。

我刚开始做无人机控制时,PID 调得挺好,但一做大机动动作就炸机。后来发现是忽略了陀螺力矩。加上去之后,控制效果立马不一样了。

注意: 欧拉方程必须在体坐标系下写。如果你在惯性系下写,惯性张量会随时间变化,那计算量就爆炸了。我见过有人在这个问题上绕了两个月。

3.3 惯性张量:不只是“转动惯量”那么简单

惯性张量 I 是一个 3x3 的对称矩阵:

I = | Ixx  Ixy  Ixz |
    | Iyx  Iyy  Iyz |
    | Izx  Izy  Izz |

对角元素 Ixx, Iyy, Izz 是绕各轴的转动惯量。非对角元素 Ixy, Ixz, Iyz 是惯性积——它们描述了质量分布的不对称性。

举个例子:一根细长杆,绕它的长轴转很容易(Ixx 小),但绕垂直于长轴的轴转就很难(Iyy 大)。如果这根杆是歪的,那惯性积就不为零。

在实际工程中,我们通常用 CAD 软件(如 SolidWorks、CATIA)直接计算惯性张量。但要注意:CAD 给出的通常是质心坐标系下的值。如果你的模型原点不在质心,需要用平行轴定理转换。

参数 物理意义 典型值(立方体,边长 a,质量 m)
Ixx 绕 x 轴的转动惯量 m * a² / 6
Iyy 绕 y 轴的转动惯量 m * a² / 6
Izz 绕 z 轴的转动惯量 m * a² / 6
Ixy 质量分布不对称性(x-y 平面) 0(对称时)
关键点: 惯性张量是体坐标系下的量。如果你在仿真中需要转换坐标系,记得用旋转矩阵对惯性张量做相似变换:I' = R * I * R^T。

3.4 牛顿-欧拉方程的完整形式

把平动和转动合在一起,就是完整的牛顿-欧拉方程:

m * dv/dt = F_ext + F_constraint
I * dω/dt + ω × (I * ω) = τ_ext + τ_constraint

这 6 个方程(3 个平动 + 3 个转动)描述了刚体在三维空间中的完整运动。在多体系统中,每个刚体都有自己的 6 个方程,再加上约束方程,就构成了一个庞大的微分代数方程组(DAE)。

我做过一个项目,要仿真一个 6 自由度的机械臂。每个关节都是一个刚体,总共 7 个刚体(包括基座),42 个状态变量。再加上关节约束,方程数量超过 100 个。那时候我才真正体会到:建模的功夫,一半在物理,一半在数值。

3.5 知识结构图:牛顿-欧拉方程的核心逻辑

下面这张图帮你理清本章的知识脉络。我建议你把它存下来,写代码时对照着看。

牛顿-欧拉动力学方程知识结构 牛顿-欧拉方程 平动动力学 F = m * a 约束力处理 转动动力学 欧拉方程 惯性张量 多体系统 → DAE 方程组 数值求解与仿真

3.6 避坑指南:我踩过的几个坑

做动力学仿真这么多年,我总结了几条血泪教训:

  1. 坐标系一致性:所有力和力矩必须在同一个坐标系下表达。我见过有人把重力在惯性系下算,推力在体坐标系下算,结果仿真直接飞了。
  2. 惯性张量的单位:注意单位换算。SI 单位是 kg·m²,但有些 CAD 软件默认用 g·mm²。差 10^6 倍,仿真结果完全不对。
  3. 数值积分方法:欧拉方程是刚性的,用显式欧拉法容易发散。我建议至少用 RK4,或者用隐式方法。
  4. 约束漂移:多体系统中,数值积分会导致约束慢慢失效。需要加约束稳定化(如 Baumgarte 方法)。
我曾经犯过的错: 有一次做卫星姿态仿真,忘了把太阳帆板的惯性张量更新到整星惯性张量中。结果仿真出来的姿态跟实际差了 20 度。后来加了时变惯性张量,才把问题解决。

好了,这一章的内容就到这里。牛顿-欧拉方程是动力学建模的基石,搞懂了它,后面的拉格朗日方程、凯恩方程都会容易很多。记住:平动看力,转动看矩,惯性张量别搞错。