3. 坐标系与运动学:地轴系、体轴系、欧拉角、四元数、坐标变换
各位同学,咱们今天聊点硬核的——坐标系。说实话,我见过太多飞控新手,代码写得飞起,结果一上真机就炸,十有八九是坐标系搞反了。我自己刚入行那会儿,也犯过这种低级错误,差点把一架测试机的机翼给掰折了。所以这一章,咱们把坐标系和运动学彻底捋清楚。
3.1 地轴系:我们站在哪里看飞机?
地轴系,也叫惯性系(近似)。说白了,就是假设地球不动,我们站在地面上看飞机怎么飞。通常我们用 NED 坐标系:
- N(北):指向地理北极
- E(东):指向正东
- D(下):指向地心(注意是向下!)
为什么是向下?因为重力方向是向下的,这样定义后,重力加速度在 D 轴上就是正的 g = 9.81 m/s²。嗯,这里要注意,很多新手会搞反,把 D 轴朝上,结果重力加速度符号搞错,积分出来的高度直接飞了。
3.2 体轴系:飞机自己怎么看自己?
体轴系是固定在飞机上的坐标系。想象你坐在驾驶舱里,你的前方、右方、下方就是体轴系的三个轴:
- X(滚转轴):指向机头前方
- Y(俯仰轴):指向机身右侧
- Z(偏航轴):指向机身下方(同样向下)
体轴系会随着飞机姿态变化而变化。我在做 eVTOL 项目时,遇到过一个问题:传感器安装时,IMU 的 X 轴和机头方向差了 2 度。你想想看,2 度误差在悬停时可能不明显,但一旦进入前飞模式,姿态解算就会累积偏差,最后导致控制发散。所以,体轴系一定要和传感器安装方向严格对齐,或者做精确的标定补偿。
3.3 欧拉角:用三个角度描述姿态
欧拉角是我们最直观的姿态描述方式。它用三个角度来描述从地轴系到体轴系的旋转:
- 偏航角 ψ(Yaw):绕 Z 轴旋转,范围 [-π, π]
- 俯仰角 θ(Pitch):绕 Y 轴旋转,范围 [-π/2, π/2]
- 滚转角 φ(Roll):绕 X 轴旋转,范围 [-π, π]
旋转顺序是:先偏航,再俯仰,最后滚转。这个顺序不能乱,否则你得到的姿态就是错的。我曾经调试一个飞控,发现姿态解算总是跳变,查了两天才发现是旋转顺序写反了——先滚转再俯仰,结果在俯仰角接近 90 度时出现了万向锁。
3.4 四元数:优雅地解决万向锁
四元数是一个超复数,形式为 q = w + xi + yj + zk,其中 w 是实部,x, y, z 是虚部。它用四个参数来描述旋转,没有奇点,计算效率也高。
我个人习惯在飞控内部全部用四元数做姿态解算,只在输出给地面站或日志记录时,才转换成欧拉角。为什么?因为四元数插值平滑,不会出现欧拉角的跳变问题。
四元数到欧拉角的转换公式(常用):
// 四元数 q = (w, x, y, z)
// 计算欧拉角
roll = atan2(2*(w*x + y*z), 1 - 2*(x*x + y*y))
pitch = asin(2*(w*y - z*x))
yaw = atan2(2*(w*z + x*y), 1 - 2*(y*y + z*z))
atan2 和 asin 计算较慢。如果只是做控制,可以保留四元数形式,只在需要可视化时转换。
3.5 坐标变换:从地轴系到体轴系
坐标变换的核心是旋转矩阵。从地轴系到体轴系的旋转矩阵 R 由三个基本旋转矩阵相乘得到:
R = R_roll * R_pitch * R_yaw
其中:
R_yaw = [cosψ, sinψ, 0;
-sinψ, cosψ, 0;
0, 0, 1]
R_pitch = [cosθ, 0, -sinθ;
0, 1, 0;
sinθ, 0, cosθ]
R_roll = [1, 0, 0;
0, cosφ, sinφ;
0, -sinφ, cosφ]
有了这个矩阵,我们就可以把地轴系下的向量(比如重力、风速)转换到体轴系下:
v_body = R * v_ned
反过来,从体轴系到地轴系,只需要用 R 的转置(因为旋转矩阵是正交矩阵):
v_ned = R^T * v_body
我在做 eVTOL 的过渡飞行控制时,经常需要把体轴系下的升力、阻力转换到地轴系下,用来计算爬升率和水平加速度。这一步如果算错,整个控制律都会乱套。
3.6 知识体系总览
下面这张图是我自己画的,把这一章的核心逻辑串起来了。你仔细看一遍,应该能明白坐标系、欧拉角、四元数之间的关系。
3.7 避坑指南
最后,我把自己踩过的坑总结一下,你们以后遇到了能少走弯路:
- 我曾经在初始化四元数时,忘记归一化,结果姿态解算越来越飘。记住:四元数必须保持单位模长,每次更新后都要归一化。
- 我曾经在坐标变换时,把旋转矩阵的方向搞反了,导致控制量反相,飞机一离地就往反方向翻。后来我养成了一个习惯:每次写完坐标变换代码,先用单位向量测试一下,比如把地轴系的北向向量 [1,0,0] 转过去,看看是不是变成了体轴系的前向。
- 我曾经在欧拉角转四元数时,忽略了角度范围限制,导致在边界处出现跳变。建议:所有角度输入都先做归一化到 [-π, π]。
好了,坐标系和运动学就讲到这里。这些东西是飞控的基石,你花再多时间在上面都值得。下一章咱们聊动力学,到时候会用到今天讲的这些变换,所以务必把这一章吃透。