2. 坐标系与姿态表示:地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数

好,咱们正式开始聊飞控里最绕不开的一个话题——坐标系和姿态表示。

说实话,我刚开始做飞控那会儿,觉得这东西不就是几个角度嘛,有什么好讲的?结果第一次调PID的时候,飞机在天上乱转,我在地上抓瞎。后来才发现,是坐标系搞混了,姿态算错了。嗯,从那以后,我再也不敢小看这一章了。

2.1 两个核心坐标系:地球坐标系 vs 机体坐标系

飞控里最常用的坐标系就两个:一个是你站在地面上看飞机的坐标系,一个是飞机自己感觉到的坐标系。

地球坐标系(NED系):也叫导航坐标系。我习惯叫它“大地系”。

  • N轴:指向正北
  • E轴:指向正东
  • D轴:指向地心(也就是向下)

你想想看,这个坐标系是固定不动的。不管飞机怎么翻跟头,大地系永远不变。我们在做位置控制、航线规划的时候,用的就是它。

机体坐标系(Body系):这个坐标系是长在飞机上的。

  • X轴:指向机头
  • Y轴:指向飞机右侧
  • Z轴:指向飞机下方(右手定则)

我在项目中遇到过一个问题:IMU(惯性测量单元)输出的加速度数据,默认是在机体坐标系下的。但你要做位置控制,需要的是大地系下的加速度。这就涉及到坐标系转换了。

核心要点:传感器数据在机体系,控制目标在大地系。两者之间必须做转换。

2.2 欧拉角:最直观的姿态表示

欧拉角,说白了就是三个角度:横滚角(Roll)、俯仰角(Pitch)、偏航角(Yaw)。

我个人习惯这样记:

  • Roll(φ):绕X轴转,飞机左右倾斜
  • Pitch(θ):绕Y轴转,飞机抬头低头
  • Yaw(ψ):绕Z轴转,飞机左右转向

欧拉角的好处是直观。你一看Roll=30°,就知道飞机向右倾斜了30度。但坏处也很明显——万向锁

避坑指南:我曾经在调试一个特技飞行模式时,飞机俯仰角接近90°,结果偏航和横滚突然耦合了,飞机直接失控。这就是万向锁——当Pitch=±90°时,Roll和Yaw的旋转轴重合,丢失了一个自由度。

所以,欧拉角适合给人看,但不适合在飞控内部做连续姿态运算。

2.3 旋转矩阵:数学上的坐标系转换

旋转矩阵,就是把一个向量从一个坐标系转到另一个坐标系。比如把机体系的加速度转到大地系。

从大地系到机体系的旋转矩阵长这样:

R = Rz(ψ) * Ry(θ) * Rx(φ)

其中:
Rx(φ) = [1,      0,       0;
         0,  cosφ,  -sinφ;
         0,  sinφ,   cosφ]

Ry(θ) = [ cosθ, 0, sinθ;
          0,    1,    0;
         -sinθ, 0, cosθ]

Rz(ψ) = [cosψ, -sinψ, 0;
         sinψ,  cosψ, 0;
         0,      0,    1]

注意顺序:先Roll,再Pitch,最后Yaw。这个顺序不能乱,乱了结果就错了。

我在项目中遇到过一个问题:用旋转矩阵做姿态更新时,每次都要算9个三角函数,计算量很大。对于STM32这种MCU来说,有点吃不消。所以实际飞控里,很少直接用旋转矩阵做实时运算。

2.4 四元数:飞控的“真香”选择

四元数,说白了就是一个复数在三维空间的推广。形式是:

q = w + xi + yj + zk

其中w是实部,x、y、z是虚部。而且满足:

w² + x² + y² + z² = 1

为什么飞控里都用四元数?三个原因:

  1. 无万向锁:随便你怎么转,不会丢失自由度
  2. 计算量小:只有乘法和加法,没有三角函数
  3. 便于插值:两个姿态之间平滑过渡,用四元数球面插值(Slerp)非常方便

个人经验:我建议所有飞控新手直接跳过欧拉角做姿态解算,从四元数入手。虽然刚开始理解起来有点抽象,但一旦习惯了,你会发现它比欧拉角好用太多。

2.5 四元数与旋转矩阵的转换

实际代码里,我们经常需要在四元数和旋转矩阵之间来回转换。比如:

四元数 → 旋转矩阵

R = [1-2(y²+z²),  2(xy-wz),   2(xz+wy);
     2(xy+wz),    1-2(x²+z²), 2(yz-wx);
     2(xz-wy),    2(yz+wx),   1-2(x²+y²)]

旋转矩阵 → 欧拉角

φ = atan2(R[2][1], R[2][2])
θ = -asin(R[2][0])
ψ = atan2(R[1][0], R[0][0])

嗯,这里要注意:atan2函数比atan好,它能处理四个象限的角度。

2.6 知识体系总览

下面这张图,是我自己总结的坐标系与姿态表示的核心逻辑。你看一遍,应该就能把整个脉络串起来了。

坐标系与姿态表示知识体系 地球坐标系 (NED) 机体坐标系 (Body) 旋转矩阵 四元数 欧拉角 旋转矩阵 四元数 ✅ 直观易懂 ❌ 万向锁 ❌ 计算量大 ✅ 数学严谨 ✅ 无万向锁 ❌ 9个三角函数 ✅ 无万向锁 ✅ 计算量小 ✅ 便于插值 实际飞控:IMU数据 → 四元数姿态解算 → 旋转矩阵转欧拉角 → 控制输出 内部运算用四元数,人机交互用欧拉角

2.7 实际代码中的选择

最后,我分享一下在实际飞控代码里,我是怎么用这些概念的:

场景 用什么表示 为什么
姿态解算(IMU融合) 四元数 无万向锁,计算量小,适合MCU
姿态控制(PID) 欧拉角 直观,方便调参
坐标系转换 旋转矩阵 数学上最直接,偶尔用一下
日志记录 欧拉角 人看得懂,方便分析问题

我的建议:写飞控代码时,内部统一用四元数。只在需要输出给用户看的时候,才转成欧拉角。这样既避免了万向锁,又保证了可读性。

好了,坐标系和姿态表示就聊到这儿。这些东西是飞控的“地基”,地基打不牢,后面盖什么楼都得塌。你先把这几个概念吃透,后面讲姿态解算和控制的时候,咱们就能直接上干货了。


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