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 知识体系总览
下面这张图把坐标系和姿态表示的关系串起来了。你可以把它当作调参时的「地图」。
2.5 实战中的选型建议
说了这么多,到底该用哪个?我根据实际项目经验,给你几个参考原则:
- 调试阶段:用欧拉角。你总不能在示波器上看四元数吧?那四个数谁看得懂。
- 姿态解算(AHRS/INS):用四元数。互补滤波、卡尔曼滤波里,四元数是主流选择。
- 坐标变换(比如把加速度计读数转到导航系):用旋转矩阵。线性变换,一步到位。
- 避免频繁转换:每次转换都有精度损失。我建议在系统初始化时确定一种主表示,其他表示只在需要时计算。
一个小技巧:如果你在做多传感器融合,比如 GPS + IMU + 磁力计,建议统一用四元数做状态量。这样状态维度低(4 维),而且没有奇点问题。我之前的项目就是这么干的,效果很稳。
好了,坐标系和姿态表示就讲到这里。记住一句话:坐标系是骨架,姿态表示是血肉。调参之前,先把骨架搭对。