2、坐标系与变换:地理坐标系(NED)与机体坐标系定义、欧拉角与旋转矩阵、方向余弦矩阵(DCM)的推导

各位同学,欢迎来到第二章。

这一章,咱们聊聊坐标系。说白了,飞控算法里的一切计算,都离不开坐标系。你想想看,无人机在天上飞,它自己觉得是“向前”,但地面看可能是“斜着”。这中间的偏差怎么消除?就得靠坐标系变换。

我个人习惯,把坐标系理解成“参考系”。你站在地上看飞机,是一个参考系;飞机自己看自己,是另一个参考系。飞控的核心任务之一,就是在这两个参考系之间来回“翻译”。

2.1 地理坐标系(NED)定义

先说说地理坐标系。业内最常用的,就是NED坐标系。

  • N(North):指向地理北,也就是正北方向。
  • E(East):指向地理东,与N垂直。
  • D(Down):指向地心,也就是垂直向下。

这个坐标系是固定在地球上的。你站在地面上,N就是你的前方(朝北),E是你的右手边(朝东),D就是你的脚下(朝地心)。

重要概念:NED坐标系是右手系吗?

答案是:不是。NED是左手系。因为N×E = -D,而不是+D。这一点很多初学者会搞混。我在项目中遇到过,有人用右手系的公式去算NED下的旋转,结果姿态全反了。

为什么飞控要用NED?说白了,因为大部分导航算法(比如GPS、惯性导航)都是基于NED设计的。你想想看,GPS给的是经纬高,这天然就是NED的输入。

2.2 机体坐标系定义

接下来是机体坐标系。这个坐标系是固定在飞机上的。

  • X轴(Roll轴):指向机头方向。
  • Y轴(Pitch轴):指向机头右侧(右翼方向)。
  • Z轴(Yaw轴):指向机身下方(垂直向下)。

注意,机体坐标系是右手系。X×Y = Z。这一点和NED不同。

嗯,这里要注意:机体坐标系的原点通常选在飞机的重心。为什么?因为所有的力矩计算,都是绕重心转的。你如果选在机头,那算出来的力矩还得平移,麻烦得很。

我的经验:在代码里定义机体坐标系时,一定要明确“前、右、下”的对应关系。我曾经见过一个团队,把Z轴定义成了向上(也就是“前、右、上”),结果和IMU的加速度计数据对不上,排查了整整两天。

2.3 欧拉角与旋转矩阵

好了,两个坐标系定义完了。现在的问题是:怎么把一个坐标系下的向量,转换到另一个坐标系下?

最直观的方法,就是用欧拉角。

欧拉角有三个:横滚角(Roll,φ)俯仰角(Pitch,θ)偏航角(Yaw,ψ)

旋转顺序呢?业内标准是:Z-Y-X(先偏航,再俯仰,最后横滚)。

为什么是这个顺序?你想想看,飞机在空中,先转方向(偏航),再抬头低头(俯仰),最后侧身(横滚)。这个顺序最符合直觉。

旋转矩阵长什么样?我直接给出来:

// 绕Z轴旋转(偏航)
Rz(ψ) = [cosψ  -sinψ  0]
        [sinψ   cosψ  0]
        [0      0     1]

// 绕Y轴旋转(俯仰)
Ry(θ) = [cosθ   0   sinθ]
        [0      1   0   ]
        [-sinθ  0   cosθ]

// 绕X轴旋转(横滚)
Rx(φ) = [1   0      0   ]
        [0   cosφ  -sinφ]
        [0   sinφ   cosφ]

// 总旋转矩阵:R = Rz(ψ) * Ry(θ) * Rx(φ)
// 注意顺序:先乘的在后

这个总矩阵展开后,有9个元素。我不建议你手算,直接用代码库里的函数就行。但你要理解它的物理意义:每一列,代表机体坐标系的轴在NED坐标系下的投影。

避坑指南:我曾经在项目里遇到过“万向锁”问题。当俯仰角接近±90°时,横滚和偏航会耦合,导致姿态解算失效。解决办法?要么限制俯仰角范围,要么改用四元数。

2.4 方向余弦矩阵(DCM)的推导

方向余弦矩阵,说白了就是旋转矩阵的另一种叫法。但它的推导思路,更“几何”一些。

DCM的核心思想是:两个坐标系之间的旋转关系,可以用它们基向量之间的夹角余弦来表示

假设NED坐标系有三个基向量:n(北)、e(东)、d(地)。机体坐标系有三个基向量:x(机头)、y(右翼)、z(机腹)。

那么,DCM矩阵的每个元素,就是两个基向量之间的点积:

C = [x·n   x·e   x·d]
    [y·n   y·e   y·d]
    [z·n   z·e   z·d]

你看,这个矩阵的每一行,就是机体坐标系的基向量在NED坐标系下的坐标。反过来,每一列,就是NED坐标系的基向量在机体坐标系下的坐标。

为什么叫“方向余弦”?因为两个单位向量的点积,就等于它们夹角的余弦值。所以这个矩阵里全是余弦值,故得名。

DCM有一个非常重要的性质:它是正交矩阵。也就是说,它的逆等于它的转置:

C^(-1) = C^T

这个性质太有用了。你想想看,从机体到NED的变换矩阵是C,那从NED到机体的变换矩阵就是C^T。不用求逆,直接转置就行,计算量小很多。

实际应用:在飞控代码里,我们通常用DCM来更新姿态。每次IMU输出角速度后,我们用角速度更新DCM矩阵,然后再从DCM里提取欧拉角。这个过程叫“姿态更新”。

2.5 三种表示方法的对比

表示方法 优点 缺点 适用场景
欧拉角 直观,容易理解 有万向锁,插值困难 人机交互、显示
旋转矩阵(DCM) 无奇点,计算稳定 9个参数,冗余大 姿态更新、坐标变换
四元数 无奇点,4个参数,计算快 不够直观 姿态解算、滤波

我个人习惯:内部计算用四元数,输出显示用欧拉角,中间传递用DCM。这样既保证了计算效率,又方便调试。

小技巧:在代码里,我建议你写一个“姿态类”,里面同时维护四元数、DCM和欧拉角。每次更新时,只更新四元数,然后从四元数同步到DCM和欧拉角。这样既避免了重复计算,又保证了数据一致性。

2.6 本章小结

好了,这一章的内容就这些。我们来回顾一下:

  • NED坐标系:北-东-地,左手系,固定在地球上。
  • 机体坐标系:前-右-下,右手系,固定在飞机上。
  • 欧拉角:横滚、俯仰、偏航,旋转顺序Z-Y-X。
  • 旋转矩阵:从机体到NED的变换,9个参数。
  • DCM:方向余弦矩阵,本质就是旋转矩阵,正交性是其核心性质。

下一章,咱们聊聊四元数。这东西比欧拉角好用得多,但理解起来也稍微绕一点。做好准备。

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