第3章:坐标系基础(下):欧拉角与方向余弦矩阵,旋转顺序的工程陷阱
好,我们接着聊坐标系。上一章我们把参考坐标系和机体坐标系的关系理清了,但有个关键问题一直悬着:怎么用数学描述两个坐标系之间的相对姿态?
说白了,就是飞机在空中转了多少度,怎么算出来的。这章我重点讲两个工具——欧拉角和方向余弦矩阵。顺便,我会把当年踩过的旋转顺序的坑,一五一十告诉你。
1. 欧拉角:最直观,也最危险
欧拉角的概念很简单:用三个角度描述刚体在空间中的姿态。在飞行器领域,我们通常用俯仰角θ、偏航角ψ、滚转角φ。
你想想看,一架飞机在空中,先绕Z轴转个偏航角,再绕Y轴转个俯仰角,最后绕X轴转个滚转角——三个角度一组合,姿态就定了。听起来很直观对吧?
但这里有个大坑:旋转顺序不是唯一的。
我个人习惯用Z-Y-X(偏航-俯仰-滚转)顺序,这也是航空航天领域最常用的。但如果你用Z-X-Y或者别的顺序,同样的三个角度值,算出来的姿态完全不同。
2. 方向余弦矩阵:稳定但计算量大
方向余弦矩阵(DCM)是一个3×3的正交矩阵,它的每个元素都是两个坐标系对应轴之间的夹角余弦值。说白了,就是用一个矩阵把两个坐标系之间的旋转关系完整描述出来。
它的好处是:没有奇点,没有万向锁。坏处是:9个元素,计算量比欧拉角大得多。
我记得在早期飞控中,处理器性能有限,大家更倾向于用欧拉角。但现在芯片性能上来了,DCM用得越来越多。
从机体坐标系到惯性坐标系的DCM可以写成:
C_b^n =
[ cosθ cosψ, sinφ sinθ cosψ - cosφ sinψ, cosφ sinθ cosψ + sinφ sinψ ]
[ cosθ sinψ, sinφ sinθ sinψ + cosφ cosψ, cosφ sinθ sinψ - sinφ cosψ ]
[ -sinθ, sinφ cosθ, cosφ cosθ ]
嗯,看着有点吓人。但实际用的时候,你只需要记住:这个矩阵是正交的,它的逆等于它的转置。这个性质在工程中非常有用。
3. 旋转顺序的工程陷阱
好,重点来了。我直接说结论:旋转顺序决定了欧拉角的物理含义。
举个例子:
- 顺序A:先偏航30°,再俯仰20°,最后滚转10°
- 顺序B:先滚转10°,再俯仰20°,最后偏航30°
同样的三个角度值,最终姿态完全不同。为什么会这样?因为旋转不满足交换律。你想想看,先转左再抬头,和先抬头再转左,结果能一样吗?
我在项目中遇到过一件事:某次联调,飞控团队和导航团队用的旋转顺序不一致。飞控用Z-Y-X,导航用Z-X-Y。结果飞机一上天,姿态数据全乱套了。查了三天才找到原因。
4. 欧拉角与DCM的转换
实际工程中,我们经常需要在欧拉角和DCM之间来回转换。比如:
- 传感器输出欧拉角 → 需要转成DCM用于姿态解算
- 姿态控制算法输出DCM → 需要转成欧拉角用于显示
从DCM提取欧拉角的公式(Z-Y-X顺序):
θ = -arcsin(C[2][0])
φ = atan2(C[2][1], C[2][2])
ψ = atan2(C[1][0], C[0][0])
注意:这里用atan2而不是atan,因为atan2能处理四个象限的情况,避免角度判断错误。
5. 知识结构图
下面这张图,是我梳理的本章核心逻辑。你一看就明白欧拉角和DCM的关系,以及旋转顺序为什么重要。
6. 避坑指南
最后,我把自己这些年踩过的坑总结一下,你直接拿去用:
- 旋转顺序必须文档化:我曾经因为没写清楚顺序,导致两个团队联调时数据对不上。后来我在代码里加了一行注释
// 旋转顺序:Z-Y-X (偏航-俯仰-滚转),再也没出过问题。 - 万向锁不是理论问题,是工程问题:在仿真中,俯仰角接近90°时,欧拉角微分方程会发散。我建议在飞控代码中加一个保护逻辑:当|θ| > 85°时,切换到四元数或DCM。
- atan2比atan安全得多:提取欧拉角时,永远用atan2。我见过有人用atan,结果在第二象限角度算出来全是错的。
- DCM的正交性会随时间漂移:长时间运行后,DCM的数值误差会导致它不再是正交矩阵。需要定期做正交化修正。我一般每100步做一次Gram-Schmidt正交化。
嗯,这章内容就这些。欧拉角和DCM是飞行器姿态描述的基础,看似简单,但细节决定成败。你把这些搞清楚了,后面学四元数、姿态解算算法就会轻松很多。
公众号:蓝海资料掘金营,微信deep3321