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

做飞控这么多年,我越来越觉得坐标系和姿态表示是整个系统的「地基」。地基没打牢,后面什么控制算法、状态估计都是空中楼阁。今天咱们就把这块硬骨头啃下来。

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

先说说地球坐标系。说白了,就是给飞行器一个「绝对位置」的参考。

我个人习惯把地球坐标系想象成一个巨大的三维网格,原点在地球中心。X轴指向春分点,Z轴指向北极,Y轴按右手定则补齐。这个坐标系不随飞行器转动,所以叫「惯性系」——当然严格来说地球本身也在转,但飞控里我们通常把它当惯性系用。

嗯,这里要注意:实际工程中我们常用的是NED坐标系(北-东-地)。

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

为什么Z轴向下?因为这样跟重力方向一致,计算起来方便。我在做第一个四旋翼项目时,就因为搞反了Z轴方向,仿真里飞机直接「坠毁」了——后来才发现是坐标系符号搞反了。

核心要点:地球坐标系是固定不动的,所有姿态和位置的最终参考都回到这里。

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

机体坐标系就简单了——它跟着飞机走。原点在飞机重心,X轴指向机头,Y轴指向右翼,Z轴指向机腹(向下)。

你想想看,飞机上的传感器(IMU、磁力计)测量的数据,都是在这个坐标系下的。所以我们需要一个「桥梁」,把机体坐标系的数据转换到地球坐标系去。

这个桥梁,就是姿态表示。

4.3 欧拉角:最直观的姿态描述

欧拉角大家应该不陌生。三个角度:滚转角(φ)、俯仰角(θ)、偏航角(ψ)

我记得刚入行时,觉得欧拉角太直观了,简直完美。直到有一次做特技飞行仿真,飞机翻了个跟头,欧拉角直接「炸了」——这就是著名的万向锁问题。

避坑指南:我曾经在无人机编队项目中,因为用了欧拉角做姿态插值,结果在俯仰角接近90°时,偏航和滚转突然「跳变」,编队直接乱套。后来全部改用四元数才解决。

欧拉角的旋转顺序也很关键。飞控里最常用的是Z-Y-X顺序(先偏航,再俯仰,最后滚转)。顺序不同,结果完全不同。

旋转顺序 应用场景 注意事项
Z-Y-X 大多数飞控系统 避免俯仰角接近±90°
Z-X-Z 某些机器人系统 万向锁问题更隐蔽

4.4 旋转矩阵:数学上的桥梁

旋转矩阵就是把欧拉角「翻译」成数学运算的工具。一个3×3的矩阵,乘以一个向量,就能完成坐标系转换。

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

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

注意顺序!先乘Rx,再乘Ry,最后乘Rz。顺序错了,姿态就全错了。

小技巧:我习惯在MATLAB里用 angle2dcm(ψ, θ, φ, 'ZYX') 直接生成旋转矩阵,省得自己手算。但一定要搞清楚输入顺序和单位(弧度还是角度)。

4.5 四元数:工程上的最优解

四元数,说白了就是「没有万向锁的欧拉角」。它用四个数表示旋转:q = [w, x, y, z],其中w是标量部分,(x,y,z)是向量部分。

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

  1. 无万向锁:任意姿态都能平滑表示
  2. 计算效率高:比旋转矩阵少乘几次
  3. 插值平滑:做姿态平滑过渡时不会跳变

我记得第一次在STM32上实现四元数更新时,发现浮点运算太慢。后来改用一阶龙格-库塔法做离散化,才把更新频率跑到了1kHz以上。

四元数更新公式(离散化后):

q_new = q_old + 0.5 * dt * Ω * q_old

其中 Ω = [0, -p, -q, -r;
           p,  0,  r, -q;
           q, -r,  0,  p;
           r,  q, -p,  0]

p, q, r 是陀螺仪测得的角速度
重要提醒:四元数必须归一化!我见过太多新手忘了这步,结果姿态越算越偏。每次更新后都要做:q = q / norm(q)

4.6 三种表示方式的对比

表示方式 优点 缺点 工程建议
欧拉角 直观、易理解 万向锁、插值困难 仅用于人机交互显示
旋转矩阵 数学性质好、易推导 9个参数、计算量大 用于坐标变换计算
四元数 无奇点、效率高、易插值 不够直观 飞控核心算法首选

实际项目中,我通常这样搭配使用:

  • 传感器数据融合 → 四元数
  • 控制律计算 → 四元数转旋转矩阵
  • 地面站显示 → 四元数转欧拉角

说白了,就是「内部用四元数,外部用欧拉角」。这样既保证了计算稳定性,又方便人看。

个人经验:在Simulink里做飞控仿真时,我习惯用「Quaternion」模块做姿态更新,用「Rotation Matrix」模块做坐标变换。这两个模块在Aerospace Blockset里都有,直接拖出来用就行。但一定要搞清楚输入输出单位,我吃过这个亏。

好了,坐标系和姿态表示这块,核心就是这些。记住一句话:地球坐标系是锚,机体坐标系是船,欧拉角是船上的旗,旋转矩阵是缆绳,四元数是舵。各有用处,缺一不可。


专注资料整理