2. 坐标系与姿态表示:地心地固系、导航坐标系、载体坐标系;欧拉角、四元数、旋转矩阵的转换与优劣

做导航调参,绕不开坐标系和姿态表示。说白了你得先搞清楚「我在哪」和「我朝哪」。我见过不少新手,一上来就调 PID,结果坐标系搞反了,飞机直接翻跟头。嗯,这节课咱们就把这几个坐标系和姿态表示方法彻底捋清楚。

2.1 三大坐标系:你得先知道自己在哪

导航里常用的坐标系有三个,我习惯把它们分成「地球的」「导航用的」和「载体自己的」。

坐标系 英文缩写 原点 轴定义 典型用途
地心地固系 ECEF 地球质心 X 指向本初子午线与赤道交点,Z 指向北极,Y 按右手定则 GPS 解算、卫星轨道
导航坐标系 NED / ENU 载体所在位置 NED:北-东-地;ENU:东-北-天 惯导解算、控制律
载体坐标系 Body 载体质心 X 前,Y 右,Z 下(航空惯例) IMU 测量、姿态控制

避坑指南:我曾经在项目里遇到过一个坑——GPS 输出的是 ECEF 坐标,但控制律需要 NED 坐标。直接拿 ECEF 的差值去算控制量,结果飞机在悬停时一直往一个方向飘。后来才发现,必须先把 ECEF 转成经纬高,再投影到当地 NED 系。

2.2 姿态表示:三种方式,各有千秋

姿态就是载体坐标系相对于导航坐标系的旋转关系。常用的有三种:欧拉角、旋转矩阵、四元数。你想想看,为什么要有三种?因为每种都有它的脾气。

2.2.1 欧拉角

欧拉角就是俯仰、横滚、偏航(Pitch, Roll, Yaw)。直观,好理解。我刚开始做飞控时,调试界面里看的就是这三个角。

  • 优点:物理意义明确,人眼一看就懂。
  • 缺点:有万向锁问题。当俯仰角接近 ±90° 时,横滚和偏航会耦合,丢失一个自由度。

注意:万向锁不是数学 bug,是欧拉角表示法的固有缺陷。如果你在做全姿态飞行(比如无人机翻转),千万别只用欧拉角做内环姿态控制。

2.2.2 旋转矩阵

旋转矩阵是一个 3x3 的正交矩阵,能把一个向量从一个坐标系旋转到另一个坐标系。

// 从载体坐标系到导航坐标系的旋转矩阵示例
// 假设已知欧拉角:roll = φ, pitch = θ, yaw = ψ
R = Rz(ψ) * Ry(θ) * Rx(φ)

// 其中:
Rz(ψ) = [cosψ  -sinψ  0;  sinψ  cosψ  0;  0  0  1]
Ry(θ) = [cosθ   0      sinθ;  0    1    0;  -sinθ  0  cosθ]
Rx(φ) = [1      0      0;  0    cosφ  -sinφ;  0  sinφ  cosφ]
  • 优点:没有万向锁,计算稳定。
  • 缺点:9 个参数,冗余。每次更新后需要重新正交化,否则误差会累积。

我的习惯:在需要频繁做向量旋转的场景(比如从 IMU 测量值转换到导航系),我会用旋转矩阵。因为它就是线性变换,计算效率高。但记得每隔一段时间做一次正交化修正。

2.2.3 四元数

四元数是一个超复数,q = w + xi + yj + zk,其中 w 是实部,x, y, z 是虚部。它用 4 个参数表示三维旋转。

// 四元数乘法(用于姿态更新)
q_new = q * Δq

// 其中 Δq 由角速度积分得到
Δq = [cos(||ω||·Δt/2);  (ω/||ω||)·sin(||ω||·Δt/2)]

// 用四元数旋转向量
v' = q * v * q_conjugate
  • 优点:无万向锁,参数少(4 个),插值平滑,适合做姿态融合。
  • 缺点:不够直观,调试时得转成欧拉角看。

2.3 三种姿态表示的转换

实际工程中,这三种表示经常需要互相转换。我整理了一个对照表,方便你查阅。

转换方向 公式/方法 注意事项
欧拉角 → 旋转矩阵 按 Z-Y-X 顺序连乘 注意旋转顺序,不同行业惯例不同
旋转矩阵 → 欧拉角 atan2 解算 注意奇点(θ = ±90°)
欧拉角 → 四元数 半角公式组合 注意角度单位(弧度 vs 度)
四元数 → 旋转矩阵 直接代入四元数元素 确保四元数已归一化
旋转矩阵 → 四元数 从矩阵迹求解 注意数值稳定性,避免除以零
四元数 → 欧拉角 先转矩阵,再解欧拉角 同样注意奇点

实战建议:我个人习惯在 IMU 数据预处理阶段用四元数做姿态更新和融合,在控制律输出阶段转成欧拉角给电机混控。这样既保证了内环的平滑性,又方便调试时观察。

2.4 知识体系总览

下面这张图把坐标系和姿态表示的关系串起来了。你可以把它当作调参时的「地图」。

坐标系与姿态表示知识体系 坐标系与姿态表示知识体系 地心地固系 (ECEF) 导航坐标系 (NED/ENU) 载体坐标系 (Body) 欧拉角 (P/R/Y) 旋转矩阵 (3x3) 四元数 (w,x,y,z) 核心原则 坐标系定义姿态的参考基准,姿态表示描述坐标系之间的旋转关系。 调参时,先确认坐标系定义,再选择合适的姿态表示。 工程选型建议 • 调试阶段:用欧拉角,直观易读 • 姿态融合/更新:用四元数,平滑无奇点 • 向量旋转/坐标变换:用旋转矩阵,计算高效

2.5 实战中的选型建议

说了这么多,到底该用哪个?我根据实际项目经验,给你几个参考原则:

  1. 调试阶段:用欧拉角。你总不能在示波器上看四元数吧?那四个数谁看得懂。
  2. 姿态解算(AHRS/INS):用四元数。互补滤波、卡尔曼滤波里,四元数是主流选择。
  3. 坐标变换(比如把加速度计读数转到导航系):用旋转矩阵。线性变换,一步到位。
  4. 避免频繁转换:每次转换都有精度损失。我建议在系统初始化时确定一种主表示,其他表示只在需要时计算。

一个小技巧:如果你在做多传感器融合,比如 GPS + IMU + 磁力计,建议统一用四元数做状态量。这样状态维度低(4 维),而且没有奇点问题。我之前的项目就是这么干的,效果很稳。

好了,坐标系和姿态表示就讲到这里。记住一句话:坐标系是骨架,姿态表示是血肉。调参之前,先把骨架搭对。