刚体动力学方程:牛顿-欧拉方程

做飞控仿真,绕不开的就是刚体动力学。说白了,就是研究飞行器这个「铁疙瘩」在力和力矩作用下怎么动。我个人习惯把这个问题拆成两半来看:平动和转动。牛顿管平动,欧拉管转动,合起来就是牛顿-欧拉方程。

核心思想:飞行器视为刚体,质量分布不变,形变忽略不计。六自由度 = 三个平动自由度 + 三个转动自由度。

平动动力学

先看平动。牛顿第二定律,F = ma,这个大家都熟。但在飞行器上,力是作用在机体上的,而我们要看的是在地面坐标系下的运动。

我遇到过不少新手,直接把机体坐标系下的力拿去算位置,结果仿真跑起来飞机横着飞。嗯,这里要注意坐标系变换。

平动方程的标准形式:

m * (dV/dt + ω × V) = F_gravity + F_aero + F_thrust

其中:

  • m — 飞行器质量(常数,不考虑燃料消耗时)
  • V — 速度向量(机体坐标系下)
  • ω — 角速度向量
  • F_gravity — 重力(地面坐标系下,需转换到机体)
  • F_aero — 气动力(升力、阻力、侧力)
  • F_thrust — 发动机推力

你想想看,为什么会有 ω × V 这一项?因为机体坐标系在旋转。我在做第一个六自由度模型时,忘了加这一项,结果仿真出来的爬升率怎么都对不上。后来查了半天,才发现是哥氏加速度没算。

实战技巧:建议先把重力单独拎出来算,再叠加气动力和推力。这样调试时容易定位问题。我曾经用这个办法,半小时就找到了一个气动系数符号错误。

转动动力学

转动部分用的是欧拉方程。说白了就是角动量定理在旋转坐标系下的表达。

欧拉方程长这样:

I * dω/dt + ω × (I * ω) = M

这里:

  • I — 惯性张量(3×3矩阵)
  • ω — 角速度向量 [p, q, r]ᵀ
  • M — 合外力矩

为什么会有 ω × (Iω) 这一项?因为飞行器在转,惯性主轴也在跟着转。这个耦合项是造成飞机横滚-偏航耦合的根本原因。我记得有一次做横滚机动仿真,不加这一项,滚转响应快得像战斗机;加上之后,才看到真实的荷兰滚模态。

注意:欧拉方程在机体坐标系下写最方便。但要注意,惯性张量 I 是常数——前提是你把坐标系固连在机体上,且质量分布不变。如果挂载变化了,I 要重新算。

惯性张量与力矩

惯性张量,说白了就是描述「质量怎么分布」的。对角线是绕各轴的转动惯量,非对角线是惯性积。

标准形式:

I = | Ixx  -Ixy  -Ixz |
    | -Ixy  Iyy  -Iyz |
    | -Ixz  -Iyz  Izz  |

对于大多数固定翼无人机,对称面是 XZ 平面,所以 Ixy = Iyz = 0。但 Ixz 不一定为零,这会导致横滚和偏航耦合。

我在做一款飞翼布局时,Ixz 特别大,结果横滚指令下去,飞机自己就开始偏航。后来在控制律里加了解耦补偿才搞定。

力矩来源主要有三个:

  1. 气动力矩 — 由迎角、侧滑角、舵面偏转产生
  2. 推力力矩 — 发动机安装位置偏离重心时产生
  3. 陀螺力矩 — 螺旋桨或涡轮旋转产生的进动效应

避坑指南:我曾经忽略过陀螺力矩,结果仿真大迎角机动时,横滚响应总是慢半拍。加上之后才匹配上试飞数据。对于螺旋桨飞机,这个力矩不能省。

知识体系总览

下面这张图,是我做仿真时经常贴在墙上的。它把刚体动力学的核心逻辑串起来了:

刚体动力学方程 · 知识体系 牛顿-欧拉方程 平动动力学 转动动力学 m · (dV/dt + ω × V) = ΣF 力源:重力 + 气动力 + 推力 I · dω/dt + ω × (Iω) = M 力矩源:气动 + 推力 + 陀螺 惯性张量 I(质量分布) Ixx, Iyy, Izz(转动惯量)| Ixy, Ixz, Iyz(惯性积)

这张图你看懂了吗?从上往下,牛顿-欧拉方程分出平动和转动两条线。平动关心力,转动关心力矩。而惯性张量是连接两者的桥梁——它决定了同样大小的力矩,会产生多大的角加速度。

仿真实现要点

实际写代码时,我建议按这个顺序来:

  1. 初始化 — 设置质量 m、惯性张量 I、初始位置和姿态
  2. 力与力矩计算 — 根据当前状态算气动力/力矩、推力/力矩
  3. 加速度求解 — 用牛顿-欧拉方程解出线加速度和角加速度
  4. 积分更新 — 用数值积分(四阶龙格-库塔最稳)更新速度和位置

我的习惯:积分步长取 0.001 秒,对于大多数固定翼无人机足够了。如果算力紧张,0.005 秒也能接受,但要注意高频动态可能会失真。

嗯,刚体动力学这块就聊到这儿。记住一句话:力决定怎么飞,力矩决定怎么转,惯性张量决定转得有多「费劲」。搞懂了这三者的关系,六自由度仿真就拿下了一半。


公众号:蓝海资料掘金营,微信deep3321