坐标系与变换:从地面到天空的数学桥梁
做飞控仿真,第一个绕不开的坎就是坐标系。我记得刚入行那会儿,总觉得坐标系这东西太抽象,不就是几个箭头嘛。直到第一次把仿真数据跟实际试飞数据做对比,发现姿态角全对不上,才意识到——坐标系选错了,后面全是白干。
今天咱们就把这几个坐标系和它们之间的变换关系,掰开了讲清楚。
1. 地心惯性系(ECI)
地心惯性系,简称ECI。它的原点在地球质心,Z轴指向北极,X轴指向春分点,Y轴按右手定则补齐。
为什么需要它?因为牛顿定律只适用于惯性系。你想想看,飞机在天上飞,地球本身还在自转。如果用地固系去算加速度,那离心力和科里奥利力全得手动加进去,麻烦得很。
我个人习惯的做法是:所有动力学方程都在ECI系下推导,最后再变换到其他坐标系输出。这样逻辑最清晰,不容易出错。
关键点:ECI系是惯性系,牛顿第二定律直接适用。其他坐标系都不是严格的惯性系。
2. 地心地固系(ECEF)
ECEF系跟地球固连,一起旋转。原点还是地心,Z轴指向北极,X轴指向本初子午线与赤道的交点。
这个坐标系最大的用处是——定位。GPS输出的经纬高,本质上就是ECEF系的球坐标表示。
我在做无人机物流项目时,遇到过一个问题:GPS给出的位置是ECEF系下的,但飞控需要的是相对于起飞点的位置。这就涉及到ECEF到导航坐标系的变换。嗯,这里要注意,变换矩阵跟纬度有关,不能偷懒用常数。
| 坐标系 | 原点 | 特点 | 适用场景 |
|---|---|---|---|
| ECI | 地心 | 惯性系,不旋转 | 动力学方程 |
| ECEF | 地心 | 随地球旋转 | GPS定位、导航 |
| 机体坐标系 | 飞机质心 | 固连于机体 | 姿态控制、传感器 |
3. 机体坐标系
机体坐标系,说白了就是坐在飞机里看世界。X轴指向机头,Y轴指向右翼,Z轴指向机腹(右手定则)。
为什么需要它?因为IMU(惯性测量单元)就装在飞机上,它测到的加速度和角速度都是机体坐标系下的。你要做控制,也得在机体坐标系下给舵面指令。
我曾经犯过一个低级错误:把机体坐标系下的加速度直接当成惯性系下的加速度去积分算速度。结果速度越算越离谱,飞控直接炸了。后来才意识到——加速度计测的是比力,而且是在机体系下,必须经过坐标变换才能用。
避坑指南:IMU输出的数据默认在机体坐标系下。如果你要用它做导航解算,必须先变换到导航系或惯性系。
4. 欧拉角与旋转矩阵
欧拉角,就是大家熟悉的俯仰角θ、滚转角φ、偏航角ψ。它们描述了机体坐标系相对于导航坐标系的姿态。
旋转顺序我建议用Z-Y-X(偏航-俯仰-滚转),这是航空航天领域的惯例。为什么是这个顺序?因为偏航角变化范围最大(0~360°),放在最后一步可以避免一些奇异性问题。
旋转矩阵长这样:
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φ]
注意顺序:先乘的矩阵在右边。也就是说,一个向量从导航系变换到机体系,要先经过滚转,再俯仰,最后偏航。
小技巧:如果你记不住旋转矩阵,可以用MATLAB的angle2dcm函数验证。我每次写代码都会用这个函数做一次交叉验证,确保没写反。
5. 四元数基础
欧拉角有个致命问题——万向锁。当俯仰角接近±90°时,滚转和偏航会耦合在一起,丢失一个自由度。这在飞行器做大机动时特别危险。
四元数就是来解决这个问题的。它用四个参数表示旋转,没有奇异性,而且插值平滑。
四元数的定义:
q = [q0, q1, q2, q3]^T
其中:
q0 = cos(θ/2)
q1 = ex * sin(θ/2)
q2 = ey * sin(θ/2)
q3 = ez * sin(θ/2)
ex, ey, ez 是旋转轴的单位向量
θ 是旋转角度
四元数乘法不满足交换律,这个要特别注意。我刚开始写四元数更新算法时,把乘法顺序搞反了,结果姿态解算结果一直在漂。查了两天bug才发现是这个问题。
四元数到欧拉角的转换:
φ = atan2(2*(q0*q1 + q2*q3), 1 - 2*(q1^2 + q2^2))
θ = asin(2*(q0*q2 - q3*q1))
ψ = atan2(2*(q0*q3 + q1*q2), 1 - 2*(q2^2 + q3^2))
核心建议:在飞控仿真中,内部姿态解算用四元数,对外输出用欧拉角。这样既避免了万向锁,又方便人理解。
知识体系总览
下面这张图,是我自己总结的坐标系与变换的知识结构。你把它理清楚了,后面六自由度仿真的框架就搭好了。
这张图把今天讲的内容串起来了。你仔细看,ECI和ECEF之间是地球自转关系,ECEF到机体坐标系需要位置变换,而机体坐标系的姿态则通过欧拉角或四元数来描述。旋转矩阵就是连接这些坐标系的数学工具。
我个人建议,刚开始做仿真时,先把ECI到ECEF的变换写对,再处理机体坐标系。一步一步来,别想着一步到位。我曾经见过一个团队,上来就搞四元数+旋转矩阵的联合解算,结果代码写了一堆,最后发现是坐标系定义反了——白白浪费了两周时间。
经验之谈:写代码前,先在纸上把坐标系画出来,标清楚每个轴的方向。这个习惯帮我避免过至少十次以上的低级错误。
好了,坐标系与变换这部分就讲到这里。你把这些基础打牢了,后面六自由度仿真模型的搭建就会顺畅很多。
公众号:蓝海资料掘金营,微信deep3321