2、坐标系与旋转:地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数基础

好,咱们正式开始聊飞控里最绕不开的一个话题——坐标系与旋转。

说实话,我当年刚入行时,被这几个概念折磨得不轻。什么欧拉角、四元数,看着公式就头疼。后来在项目里摔过几次机,才真正明白:坐标系搞不清楚,飞控代码写得再漂亮也是白搭

这一节,咱们就把这些基础概念掰开揉碎了讲。你跟着我的思路走,保证能理清楚。

2.1 地球坐标系:飞控的“绝对参考系”

地球坐标系,也叫导航坐标系。说白了,就是给无人机一个“绝对”的位置参考。

我习惯用 NED(北东地) 坐标系:

  • X轴:指向地理北极
  • Y轴:指向地理东向
  • Z轴:指向地心(向下)

为什么Z轴要向下?嗯,这里要注意:这是航空领域的惯例。你想想看,飞机在地面时,高度为0,飞起来后高度为正,Z轴向下正好符合这个直觉。

核心理解:地球坐标系是固定不动的。无人机所有的位置、速度、加速度,最终都要换算到这个坐标系下才有意义。

我在项目中遇到过一个问题:有个同事把GPS的高度数据直接当成“海拔高度”用,结果无人机在丘陵地带飞着飞着就撞山了。为什么?因为GPS给的是WGS84椭球高,不是真正的海拔高。这就是坐标系没对齐的典型坑。

2.2 机体坐标系:无人机“自己”的坐标系

机体坐标系是固定在无人机身上的。不管飞机怎么翻、怎么转,这个坐标系跟着飞机一起动。

标准定义是这样的:

  • X轴:指向机头方向(前进方向)
  • Y轴:指向机身右侧
  • Z轴:指向机身下方

你想想看,无人机上的IMU(惯性测量单元)测量到的加速度和角速度,都是基于机体坐标系的。但我们要控制飞机的位置,必须知道它在“地球坐标系”下的状态。

这就引出了一个问题:怎么把机体坐标系下的数据,转换到地球坐标系下?

答案就是——旋转。

2.3 欧拉角:横滚、俯仰、偏航

欧拉角是最直观的旋转描述方式。它用三个角度来描述一个物体的姿态:

角度 符号 描述 范围
横滚角 φ (phi) 绕X轴旋转,左右倾斜 -180° ~ 180°
俯仰角 θ (theta) 绕Y轴旋转,抬头低头 -90° ~ 90°
偏航角 ψ (psi) 绕Z轴旋转,机头朝向 -180° ~ 180°

我个人习惯用 Z-Y-X 的旋转顺序(先偏航、再俯仰、最后横滚)。这个顺序在飞控领域最常用,也最符合直觉。

注意!欧拉角有个致命问题——万向锁(Gimbal Lock)。

当俯仰角达到 ±90° 时,横滚和偏航会失去一个自由度。我曾经在调试一个特技飞行的无人机时,就因为没处理好万向锁,导致飞机在倒飞时姿态解算直接崩了。嗯,从那以后,我再也不敢在飞控核心代码里只用欧拉角了。

2.4 旋转矩阵:数学上的“坐标系转换器”

旋转矩阵,说白了就是一个3x3的矩阵。它能把一个向量从一个坐标系,旋转到另一个坐标系。

比如,从机体坐标系到地球坐标系的旋转矩阵 R,满足:

P_earth = R * P_body

其中 P_body 是机体坐标系下的向量,P_earth 是地球坐标系下的同一个向量。

旋转矩阵由三个基本旋转矩阵相乘得到:

R = R_z(ψ) * R_y(θ) * R_x(φ)

每个基本旋转矩阵长这样(以绕Z轴旋转为例):

R_z(ψ) = [cosψ  -sinψ   0]
         [sinψ   cosψ   0]
         [0      0      1]

你想想看,三个矩阵乘在一起,虽然公式看着复杂,但计算机算起来非常快。而且旋转矩阵没有万向锁问题。

我的经验:在实际飞控代码里,我很少直接手写旋转矩阵的乘法。一般都是用现成的数学库,比如PX4里的matrix库,或者自己封装好的函数。但理解原理很重要——至少你得知道,为什么旋转矩阵的逆等于它的转置(因为它是正交矩阵)。

2.5 四元数:飞控的“终极武器”

四元数,听起来很玄乎。其实它就是一个四维的复数扩展:

q = w + xi + yj + zk

其中 w 是实部,x、y、z 是虚部。约束条件:w² + x² + y² + z² = 1(单位四元数)。

为什么飞控要用四元数?三个理由:

  1. 无万向锁:这是最大的优势。做全姿态飞行时,四元数是唯一的选择。
  2. 计算量小:四元数乘法只需要16次浮点运算,而旋转矩阵乘法需要27次。
  3. 插值平滑:两个姿态之间做平滑过渡,四元数的球面线性插值(SLERP)非常优雅。

我记得第一次在STM32上跑四元数解算时,发现CPU占用率从30%降到了8%。那一刻我就明白了——四元数才是飞控的标配

四元数和旋转矩阵可以互相转换。比如,从四元数到旋转矩阵的公式:

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²) ]

看着复杂?别怕。实际代码里,你只需要调用一个函数:quat2rotm(q) 就行了。

核心理解:在飞控里,我们通常用四元数做姿态解算和更新,用欧拉角做显示和调试,用旋转矩阵做坐标系转换。三者各司其职。

2.6 实战中的选择建议

好了,理论讲完了。咱们聊聊实际项目中怎么选。

场景 推荐使用 原因
姿态解算(IMU融合) 四元数 无万向锁,计算量小
姿态显示(地面站) 欧拉角 直观,人眼容易理解
坐标系转换(控制律) 旋转矩阵 方便做向量运算
姿态插值(云台控制) 四元数 SLERP平滑无突变

我的建议:刚开始学飞控时,先用欧拉角理解姿态的概念。等你要写实际飞控代码了,果断切换到四元数。我曾经见过一个团队,因为一直用欧拉角做姿态控制,结果在横滚角超过90°时直接炸机。这个教训,希望你不要重蹈覆辙。

最后,送你一句话:坐标系是飞控的“语言”,旋转是飞控的“语法”。这两样搞不明白,后面的PID调参、卡尔曼滤波都是空中楼阁。

下一节,咱们就基于这些坐标系知识,开始聊角速度环的调优。到时候你会发现,今天打下的基础,全都能用上。