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

好,咱们正式开始聊飞控里最基础、也最容易翻车的一块内容——坐标系与姿态表示。

说实话,我刚开始做飞控那会儿,觉得坐标系嘛,不就是几个箭头嘛,有啥好学的?结果第一次调参,飞机在天上乱转,我盯着日志看了三天,才发现是坐标系搞反了。嗯,从那以后,我再也不敢小看这一章了。

2.1 地球坐标系:我们到底在哪儿?

地球坐标系,说白了就是给飞机一个“绝对位置”的参考。你想想看,飞机在天上飞,总得知道自己在哪儿吧?

常用的地球坐标系有两种:

  • NED坐标系(北-东-地):X轴指向北,Y轴指向东,Z轴指向地心。我个人习惯用这个,因为直观,符合直觉。
  • ENU坐标系(东-北-天):X轴指向东,Y轴指向北,Z轴指向天。GPS数据通常给的是这个。

我在项目中遇到过一个问题:GPS模块输出的经纬度是ENU,但飞控内部用的是NED。一开始没注意,直接拿来用,结果飞机往北飞,它往东偏。你说气不气人?

⚠️ 注意: 不同传感器可能使用不同的地球坐标系。GPS用ENU,惯导用NED,磁力计用当地水平坐标系。一定要在代码里显式转换,别偷懒。

2.2 机体坐标系:飞机自己的视角

机体坐标系是固定在飞机上的。不管飞机怎么转,这个坐标系跟着飞机走。

标准定义是这样的:

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

为什么这么定义?因为方便啊。你想想看,油门推大,飞机沿X轴加速;副翼右偏,飞机绕X轴旋转。多直观。

我记得有一次调试,一个实习生把机体坐标系的Y轴定义反了。结果飞机横滚的时候,往左打杆它往右翻。嗯,还好是在仿真里发现的。

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

欧拉角就是三个角度:横滚角(Roll)俯仰角(Pitch)偏航角(Yaw)

说白了,就是飞机绕三个轴转了多少度。

  • Roll(φ):绕X轴旋转,范围 ±180°
  • Pitch(θ):绕Y轴旋转,范围 ±90°
  • Yaw(ψ):绕Z轴旋转,范围 ±180°

欧拉角的好处是直观,看一眼就知道飞机姿态。但坏处也很明显——万向锁(Gimbal Lock)

💡 关键点: 当俯仰角接近 ±90° 时,横滚和偏航会耦合在一起,丢失一个自由度。这就是万向锁。我当年做固定翼飞控时,有一次飞机垂直俯冲,姿态解算直接炸了,就是因为万向锁。

所以,欧拉角只适合做人机交互(比如地面站显示),不适合做姿态解算

2.4 旋转矩阵:数学上最严谨的方式

旋转矩阵是一个 3×3 的矩阵,用来描述从一个坐标系到另一个坐标系的旋转关系。

从机体坐标系到地球坐标系的旋转矩阵长这样:

R = [cosθ·cosψ,  sinφ·sinθ·cosψ - cosφ·sinψ,  cosφ·sinθ·cosψ + sinφ·sinψ]
    [cosθ·sinψ,  sinφ·sinθ·sinψ + cosφ·cosψ,  cosφ·sinθ·sinψ - sinφ·cosψ]
    [-sinθ,       sinφ·cosθ,                    cosφ·cosθ           ]

看着挺吓人,对吧?其实你不用背,知道怎么用就行。

旋转矩阵的好处是:

  • 没有奇点(不会出现万向锁)
  • 可以连续旋转(矩阵乘法)
  • 数学性质好(正交矩阵,逆等于转置)

但坏处是:计算量大。每次更新姿态都要做 9 个元素的矩阵乘法,在嵌入式上有点吃不消。

💡 小技巧: 如果你用旋转矩阵,记得定期做正交化修正。因为数值误差会让矩阵慢慢偏离正交性,导致姿态漂移。我一般每 100 步做一次 Gram-Schmidt 正交化。

2.5 四元数:飞控工程师的终极武器

四元数,说白了就是一个“带约束的复数”。它用四个数表示旋转:

q = w + xi + yj + zk

其中 w 是实部,x、y、z 是虚部。约束条件是:w² + x² + y² + z² = 1。

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

  1. 没有万向锁——这是最大的优势
  2. 计算量小——只有 4 个元素,比旋转矩阵的 9 个少多了
  3. 插值平滑——可以做球面线性插值(SLERP),姿态过渡很自然

四元数转欧拉角的公式:

roll  = atan2(2*(w*x + y*z), 1 - 2*(x² + y²))
pitch = asin(2*(w*y - z*x))
yaw   = atan2(2*(w*z + x*y), 1 - 2*(y² + z²))

嗯,这个公式我每次写代码都要翻笔记。记不住没关系,知道去哪儿查就行。

⚠️ 注意: 四元数一定要归一化!我见过太多人忘了这步,结果姿态越算越偏。每次更新完四元数,立刻做一次归一化,养成习惯。

2.6 实际项目中的选择建议

说了这么多,到底用哪个?我个人的经验是这样的:

场景 推荐表示 原因
姿态解算(IMU融合) 四元数 无奇点、计算快
地面站显示 欧拉角 直观、人看得懂
控制律计算 旋转矩阵 方便做向量旋转
数据存储/传输 四元数 占用空间小、精度高

我曾经在一个项目里,为了省事,全程用欧拉角做姿态解算。结果飞机做大机动时直接失控。嗯,那次之后,我再也不敢在核心算法里用欧拉角了。

💡 我的建议: 内部计算用四元数,输出显示转欧拉角。这是最稳妥的方案。代码里准备好四元数↔欧拉角↔旋转矩阵的转换函数,随时调用。

好了,坐标系与姿态表示就聊到这儿。下一章我们讲传感器——IMU、GPS、磁力计,这些东西怎么读数据、怎么处理噪声。到时候你会发现,坐标系的知识全用得上。