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

各位同学,今天我们来聊聊飞控里最绕不开、也最容易出坑的一个话题——坐标系与旋转。

说实话,我刚开始做四旋翼那会儿,觉得坐标系这东西有啥好学的?不就是几个箭头嘛。结果第一次试飞,飞机在天上翻了个跟头,我在地面站看着姿态数据完全懵了——欧拉角突然跳变,控制量直接饱和。嗯,从那以后我才明白,坐标系搞不清楚,飞控代码写得再漂亮也是白搭。

这一节,我们就把地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数这五样东西彻底捋清楚。你想想看,飞机在天上飞,它得知道自己“朝哪”、“歪了多少”、“转得快不快”。这些信息,全靠坐标系和旋转来描述。

1. 地球坐标系:我们站在哪里看飞机?

地球坐标系,也叫导航坐标系或惯性坐标系(近似)。说白了,就是在地面上选一个固定点,然后定义三个轴:

  • X轴:指向正北(或正东,看具体定义)
  • Y轴:指向正东(或正北,与X轴垂直)
  • Z轴:指向地心(即“向下”)

我习惯用 NED(北-东-地) 坐标系,也就是X北、Y东、Z地。为什么?因为飞控里加速度计测的是重力加速度,方向是向下的,正好和Z轴对齐,省去一个符号转换。

个人经验: 我在做PX4移植时,发现有些传感器输出的是ENU(东-北-天)坐标系。如果不做转换直接喂给NED的飞控,飞机一解锁就往地里钻。所以,拿到传感器数据第一件事——确认坐标系定义。

2. 机体坐标系:飞机自己怎么看自己?

机体坐标系固定在飞机上,随飞机一起运动。原点在飞机质心,三个轴:

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

你想想看,飞机上的IMU(惯性测量单元)测到的角速度和加速度,都是在机体坐标系下的。而我们要控制飞机的位置和姿态,却需要在地球坐标系下描述。这就引出了一个问题——怎么把机体坐标系下的数据,转换到地球坐标系下?

答案就是:旋转。

3. 欧拉角:最直观的旋转描述

欧拉角,说白了就是用三个角度来描述飞机的姿态:

  • 滚转角(Roll,φ):绕X轴旋转,飞机左右倾斜
  • 俯仰角(Pitch,θ):绕Y轴旋转,飞机抬头低头
  • 偏航角(Yaw,ψ):绕Z轴旋转,飞机左右转向

这三个角度的旋转顺序,我建议用 Z-Y-X(先偏航、再俯仰、最后滚转)。为什么?因为这种顺序下,偏航角对应的是机头指向,俯仰角对应的是抬头角度,物理意义最直观。

避坑指南: 我曾经在调试一个视觉定位模块时,发现姿态数据偶尔会“跳变”——从30度直接跳到150度。查了半天,原来是欧拉角的万向锁问题。当俯仰角接近±90度时,滚转和偏航会耦合,导致角度丢失一个自由度。所以,如果你要做全姿态飞行(比如特技动作),千万别只用欧拉角。

4. 旋转矩阵:数学上的“坐标系转换器”

旋转矩阵,就是把一个向量从一个坐标系旋转到另一个坐标系的数学工具。它是一个3x3的正交矩阵,行列式为1。

从机体坐标系到地球坐标系的旋转矩阵,可以用欧拉角表示:

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

注意顺序:先绕Z轴转ψ,再绕Y轴转θ,最后绕X轴转φ。矩阵乘法是从右往左读的。

我个人的习惯是,在代码里把旋转矩阵写成函数,输入欧拉角,输出矩阵。这样调试的时候,可以单独验证每个轴的旋转是否正确。

核心要点: 旋转矩阵的逆矩阵等于它的转置(因为它是正交矩阵)。所以从地球坐标系到机体坐标系,直接用R^T就行,不用重新算。

5. 四元数:飞控里的“真香”选择

说实话,欧拉角和旋转矩阵都有硬伤。欧拉角有万向锁,旋转矩阵有9个参数(计算量大,还容易因为数值误差不再是正交矩阵)。所以,现代飞控里,姿态表示几乎都用 四元数

四元数是一个超复数,形式为:

q = w + xi + yj + zk

其中:
w 是实部
x, y, z 是虚部
i² = j² = k² = ijk = -1

用四元数表示旋转,只需要4个参数,没有万向锁,而且插值平滑。我当年从欧拉角切换到四元数时,最大的感受就是——姿态解算再也不“抽风”了。

四元数和旋转矩阵可以互相转换。比如,从四元数到旋转矩阵:

R = [1-2(y²+z²)  2(xy-wz)    2(xz+wy);
     2(xy+wz)    1-2(x²+z²)  2(yz-wx);
     2(xz-wy)    2(yz+wx)    1-2(x²+y²)]

看着复杂,但代码实现起来就是几行乘法的事。

我的建议: 在飞控代码里,姿态解算和更新全部用四元数。只在需要输出给用户看(比如地面站显示)或者做控制律计算时,才转成欧拉角。这样既避免了万向锁,又保持了直观性。

6. 知识体系总览

下面这张图,是我自己总结的坐标系与旋转的知识结构。你把它理清了,后面学动力学建模就顺了。

坐标系与旋转知识体系 地球坐标系 (NED) 固定在地面,X北Y东Z地 机体坐标系 固定在飞机,X前Y右Z下 需要旋转 需要旋转 旋转的三种数学表示 欧拉角 Roll, Pitch, Yaw 直观,但有万向锁 旋转矩阵 3x3正交矩阵 计算量大,易失正交性 四元数 w + xi + yj + zk 无万向锁,适合计算 推荐:内部用四元数,显示用欧拉角,转换用旋转矩阵

这张图把三个坐标系和三种旋转表示方法串在了一起。你从地球坐标系和机体坐标系出发,中间经过旋转表示,最后落到三种数学工具上。我个人建议你把它打印出来贴在工位上,写代码时瞄一眼,思路会清晰很多。

好了,坐标系与旋转的基础就讲到这里。这些东西看着简单,但实际用起来坑不少。我当年在无人机竞赛里,就因为坐标系搞反,飞机直接撞墙——嗯,那又是另一个故事了。


公众号:蓝海资料掘金营,微信deep3321