第1章:坐标系与姿态表示

各位同学好,我是老张。搞了十几年固定翼飞控,今天咱们聊聊最基础、也最容易踩坑的东西——坐标系和姿态表示。

说实话,我见过太多新手一上来就写代码,结果飞机在天上乱翻跟头。为什么?坐标系搞混了。你想想看,地面站显示的是北东地,飞控算的是前右下,传感器给的是右前上……不乱才怪。

1.1 地球坐标系

地球坐标系,说白了就是给飞机一个“绝对位置”的参考。常用的有两种:

  • NED坐标系:北东地。X轴指向北,Y轴指向东,Z轴指向地心。我习惯用这个,因为直观。
  • ENU坐标系:东北天。X轴指向东,Y轴指向北,Z轴指向天。GPS原始数据通常是这个。

注意:我曾经在项目里把NED和ENU搞反了,结果飞机一解锁就往地下钻。嗯,那次炸机让我记住了——GPS转NED时,Z轴要取反。

实际工程中,我们通常用经纬高(LLA)来表示位置,但飞控内部计算必须转成NED。为什么?因为NED是平面直角坐标系,算距离、算速度都方便。

1.2 机体坐标系

机体坐标系是固定在飞机上的。我习惯这么定义:

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

这个定义和大多数飞控一致。但要注意,有些开源飞控(比如PX4)的机体坐标系是X前、Y左、Z上。如果你混用,姿态解算会直接崩掉。

我的习惯:拿到一个新飞控,第一件事就是看它的机体坐标系定义。别信文档,直接看源码里的旋转矩阵。

1.3 欧拉角

欧拉角是描述姿态最直观的方式。三个角度:

角度 符号 范围 说明
滚转角 φ (phi) -180° ~ 180° 绕X轴旋转
俯仰角 θ (theta) -90° ~ 90° 绕Y轴旋转
偏航角 ψ (psi) -180° ~ 180° 绕Z轴旋转

欧拉角有个致命问题——万向锁。当俯仰角接近±90°时,滚转和偏航会耦合,丢失一个自由度。我在做垂直起降固定翼时遇到过这个问题,飞机在过渡阶段俯仰角接近90°,欧拉角直接炸了。

核心结论:欧拉角只适合做显示和简单控制,不适合做姿态解算和导航融合。

1.4 四元数

四元数是个数学工具,用来避免万向锁。形式很简单:

q = [w, x, y, z]

其中:
w = cos(θ/2)
x = sin(θ/2) * cos(α)
y = sin(θ/2) * cos(β)
z = sin(θ/2) * cos(γ)

嗯,看着有点抽象。我换个说法:四元数就是用四个数表示一个旋转。它没有奇点,计算效率高,适合做姿态融合。

我个人习惯在飞控里全程用四元数。只有输出给地面站显示时,才转成欧拉角。

避坑指南:四元数必须归一化!我曾经因为忘记归一化,导致姿态漂移了20度。检查了三天才发现是这个问题。

1.5 旋转矩阵

旋转矩阵是连接不同坐标系的桥梁。从机体坐标系到NED坐标系的旋转矩阵是:

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θ                ]

这个矩阵我建议你手推一遍。我在做传感器融合时,每次都要确认旋转矩阵的方向——是从机体到NED,还是从NED到机体?搞反了,加速度计数据就全错了。

1.6 知识体系总览

下面这张图是我自己画的,把本章的核心逻辑串起来了:

坐标系与姿态表示知识体系 地球坐标系 机体坐标系 姿态表示 NED / ENU / LLA X前 Y右 Z下 欧拉角 / 四元数 旋转矩阵:连接坐标系与姿态 应用:姿态解算 → 导航融合 → 飞控输出

1.7 工程实践建议

最后,我总结几条实战经验:

  1. 统一坐标系:整个飞控系统只用一种坐标系定义。我推荐NED + 机体X前Y右Z下。
  2. 姿态用四元数:内部计算全程四元数,只在显示时转欧拉角。
  3. 旋转矩阵写死:把旋转矩阵写成常量,不要每次计算。省CPU,也省心。
  4. 加断言检查:在关键位置检查四元数模长是否为1,旋转矩阵行列式是否为1。

记住:坐标系和姿态是飞控的“语言”。语言不通,飞机就乱飞。我见过太多炸机案例,根源都是坐标系搞错了。

好了,这一章就到这儿。下一章咱们聊传感器模型——IMU、GPS、空速管,这些东西怎么建模,怎么融合。

专注资料整理