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