第4章:飞控数学模型:六自由度刚体动力学模型、四元数与欧拉角、地球坐标系与机体坐标系

各位同学,欢迎来到第四章。

说实话,飞控数学模型是整个硬件在环仿真的地基。地基没打好,后面跑再漂亮的算法也是空中楼阁。我自己带项目时,见过太多团队在仿真里飞得挺好,一上真机就炸——十有八九是模型这里出了问题。

这一章,我们就把三个核心概念掰开揉碎:六自由度刚体动力学四元数与欧拉角坐标系变换。嗯,都是硬骨头,但啃下来之后,你会发现飞控的世界清晰很多。

4.1 六自由度刚体动力学模型

什么叫六自由度?说白了,就是飞机在三维空间里能做的六种独立运动。

我习惯把它分成两组:

  • 线运动(3个):前后(X轴)、左右(Y轴)、上下(Z轴)
  • 角运动(3个):滚转(绕X轴)、俯仰(绕Y轴)、偏航(绕Z轴)

你想想看,一架四旋翼在天上飞,不就是这六个量的组合吗?

核心公式(牛顿-欧拉方程):

// 线运动方程
m * dV/dt = F_gravity + F_thrust + F_aero

// 角运动方程
I * dω/dt = M_thrust + M_gyro - ω × (I * ω)

其中 m 是质量,I 是惯性张量矩阵,ω 是角速度向量。

我在项目中遇到过一个问题:仿真里飞机悬停很稳,但真机总是慢慢漂移。查了两天才发现,是惯性张量矩阵里的交叉耦合项没设对。嗯,这种坑,踩过一次就记住了。

4.2 四元数与欧拉角

说到姿态表示,很多新手第一反应就是欧拉角。确实直观——俯仰30度、滚转15度,一听就懂。

但欧拉角有个致命问题:万向锁

避坑指南:

我曾经在某个项目中,用欧拉角做姿态插值。结果飞机在俯仰90度附近时,滚转和偏航突然耦合,姿态直接飞了。后来换成四元数,问题立刻解决。

记住:凡是涉及大角度机动或连续旋转,优先用四元数

四元数长什么样?其实就是一个四维向量:

q = [q0, q1, q2, q3]

其中 q0 是标量部分,q1~q3 是矢量部分。它没有奇点,计算效率也高。

欧拉角和四元数之间的转换,我建议你直接背下来:

转换方向 公式
欧拉角 → 四元数 q = f(φ, θ, ψ) // 三个旋转的乘积
四元数 → 欧拉角 φ = atan2(2*(q0*q1+q2*q3), 1-2*(q1²+q2²))

我的个人习惯:

在飞控代码里,内部运算全部用四元数。只在给地面站发数据时,才转成欧拉角方便人看。这样既避免了奇点,又保留了可读性。

4.3 地球坐标系与机体坐标系

坐标系变换,说白了就是回答一个问题:飞机自己感觉到的力,在地球上看是什么方向?

常用的两个坐标系:

  • 地球坐标系(NED):北-东-地,固定在地面上
  • 机体坐标系(Body):前-右-下,固定在飞机上

从机体到地球的变换,靠的就是旋转矩阵。这个矩阵由四元数或欧拉角构造:

// 由四元数构造旋转矩阵
R = [
  [1-2*(q2²+q3²), 2*(q1*q2-q0*q3), 2*(q1*q3+q0*q2)],
  [2*(q1*q2+q0*q3), 1-2*(q1²+q3²), 2*(q2*q3-q0*q1)],
  [2*(q1*q3-q0*q2), 2*(q2*q3+q0*q1), 1-2*(q1²+q2²)]
]

你想想看,GPS给的是地球坐标系下的位置,加速度计测的是机体坐标系下的加速度。没有这个变换矩阵,你根本没法把两者对上。

实战要点:

在硬件在环仿真中,我建议你这样做:

  1. 用四元数维护姿态状态
  2. 用旋转矩阵做坐标系变换
  3. 只在日志和调试时转成欧拉角

这样既高效又安全。

4.4 三者的关系

这三个东西不是孤立的。我画个逻辑链给你看:

六自由度动力学 → 输出加速度和角加速度
         ↓
    积分得到速度和角速度
         ↓
    四元数更新姿态
         ↓
    旋转矩阵做坐标系变换
         ↓
    反馈给动力学模型

嗯,这就是一个完整的闭环。我在做第一个HIL仿真平台时,就是按这个链条一步步搭起来的。每一步都单独测试,最后联调时基本没出大问题。

给新手的建议:

别急着把代码写全。先用手算一个简单的例子——比如飞机只做俯仰运动——验证四元数更新和坐标系变换是否正确。这一步花不了半小时,但能帮你省下后面几天的调试时间。

好了,这一章的内容就到这里。下一章我们会把这些模型放到仿真环境里,看看怎么用代码实现。到时候我会分享一些具体的代码片段和调试技巧。