3、坐标系与旋转:地理坐标系与机体坐标系,旋转矩阵与方向余弦矩阵

各位同学,咱们今天聊点硬核的。坐标系和旋转,说白了就是姿态解算的「世界观」。你想想看,一个飞行器在天上飞,它怎么知道自己头朝哪、背朝哪?靠的就是这两套坐标系之间的换算关系。

我刚开始做飞控那会儿,总觉得坐标系这东西太抽象。直到有一次调试四旋翼,飞机明明给了俯仰指令,它却偏航了……查了半天,原来是坐标系搞反了。嗯,从那以后,我再也不敢小看这个基础了。

3.1 地理坐标系:我们感知世界的「绝对参考」

地理坐标系,也叫导航坐标系。它固定在地球上,不随飞行器转动。

我个人习惯用 NED 系,也就是北-东-地。为什么?因为大部分惯性传感器(加速度计、陀螺仪)的输出,天然就适合用这个系来理解。

  • X轴:指向地理北(North)
  • Y轴:指向地理东(East)
  • Z轴:指向地心(Down),也就是重力方向

你可能会问:「为什么 Z 轴要指向下?」其实这是为了跟加速度计的输出对齐。加速度计静止时测到的是 1g 向上的力,在 NED 系里,这个力正好是 +Z 方向。嗯,这样处理起来就顺了。

小技巧: 如果你用 ENU 系(东-北-天),Z 轴朝上。两种都可以,但千万别混用。我见过一个项目,导航用 NED,控制用 ENU,结果飞机一上天就翻跟头。

3.2 机体坐标系:飞行器自己的「身体坐标」

机体坐标系固定在飞行器上,跟着它一起转。通常这样定义:

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

说白了,机体坐标系就是「我」的视角。你坐在飞机里,往前看是 X,往右看是 Y,往下看是 Z。所有传感器(IMU)测到的数据,默认都是在这个坐标系下的。

我在项目中遇到过一个问题:加速度计装在飞控板上,但飞控板在飞机里装歪了。结果测出来的加速度全是偏的。后来我学乖了,每次装机前先做一次「传感器到机体」的标定,把安装误差转成旋转矩阵,一劳永逸。

3.3 旋转矩阵:连接两个世界的「桥梁」

现在问题来了:地理坐标系和机体坐标系之间怎么换算?

答案就是旋转矩阵。它本质上是一个 3x3 的矩阵,能把一个向量从一个坐标系旋转到另一个坐标系。

假设你有一个向量 v 在地理坐标系下的坐标是 v_n,在机体坐标系下的坐标是 v_b,那么:

v_b = R * v_n

其中 R 就是旋转矩阵。反过来:

v_n = R^T * v_b

注意,旋转矩阵有个重要性质:它是正交矩阵,所以逆矩阵等于转置矩阵。这个性质在代码里特别有用,省去了求逆的麻烦。

核心要点: 旋转矩阵的每一列,其实就是地理坐标系的基向量在机体坐标系下的投影。反过来,每一行是机体坐标系的基向量在地理坐标系下的投影。

3.4 方向余弦矩阵:换个名字,同一个东西

方向余弦矩阵(DCM),其实就是旋转矩阵。为什么叫「方向余弦」?因为矩阵里的每个元素,都是两个坐标轴之间夹角的余弦值。

举个例子:R[0][0] 是机体 X 轴与地理 X 轴夹角的余弦。R[0][1] 是机体 X 轴与地理 Y 轴夹角的余弦。以此类推。

我刚开始学的时候,觉得 DCM 这个名字太绕了。后来想通了:你管它叫旋转矩阵还是方向余弦矩阵,代码里就是一个 3x3 的 float 数组。重要的是你理解它怎么用。

名称 本质 常见场景
旋转矩阵 3x3 正交矩阵 通用坐标变换
方向余弦矩阵 同上,元素为余弦值 姿态解算、导航

3.5 核心逻辑:一张图看懂坐标系与旋转

下面我用一张 SVG 图,把整个知识体系串起来。你仔细看,其实就三个东西:两个坐标系 + 一个矩阵。

地理坐标系 (NED) X (北) Y (东) Z (地) 旋转矩阵 R (方向余弦矩阵) 3x3 正交矩阵 机体坐标系 (Body) X (机头) Y (右翼) Z (向下) v_b = R * v_n v_n = R^T * v_b

这张图的核心逻辑很简单:

  • 左边是地理坐标系,固定不动
  • 右边是机体坐标系,跟着飞机转
  • 中间是旋转矩阵 R,负责把地理坐标转到机体坐标

你想想看,姿态解算的本质是什么?就是实时估计这个 R 矩阵。当飞机转动时,R 矩阵跟着变,我们通过陀螺仪、加速度计、磁力计的数据,不断更新 R,就能知道飞机当前是什么姿态。

3.6 避坑指南:我曾经踩过的坑

讲几个我实际项目中遇到的坑,你以后遇到了能少走弯路。

坑一:旋转顺序搞反
我曾经在代码里把 v_b = R * v_n 写成了 v_b = v_n * R。矩阵乘法不满足交换律,结果算出来的姿态全是反的。飞机一推杆,它抬头;一拉杆,它低头。调试了整整两天才发现。
坑二:忘记归一化
旋转矩阵必须是正交矩阵,但数值计算中累积误差会让它慢慢「漂移」。我建议每迭代 100 步做一次正交化修正,否则矩阵会越来越「歪」,最后姿态全乱套。
我的习惯: 在代码里用一个结构体封装旋转矩阵,提供乘法、转置、正交化三个基本操作。这样不管后面用四元数还是欧拉角,底层都是同一套逻辑,改起来方便。

3.7 小结

这一章我们聊了:

  • 地理坐标系 NED:固定在地球上,是绝对参考
  • 机体坐标系 Body:固定在飞行器上,是相对参考
  • 旋转矩阵 / 方向余弦矩阵:连接两个坐标系的桥梁

说白了,姿态解算就是不断求解这个 R 矩阵的过程。下一章我们会深入讲怎么用陀螺仪数据来更新 R,那才是真正动真格的地方。

嗯,今天就到这儿。你先把坐标系和旋转矩阵搞明白,后面的内容才能跟得上。


专注资料整理