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 欧拉角:用三个角度描述姿态

欧拉角是我们最直观的姿态描述方式。它用三个角度来描述从地轴系到体轴系的旋转:

  1. 偏航角 ψ(Yaw):绕 Z 轴旋转,范围 [-π, π]
  2. 俯仰角 θ(Pitch):绕 Y 轴旋转,范围 [-π/2, π/2]
  3. 滚转角 φ(Roll):绕 X 轴旋转,范围 [-π, π]

旋转顺序是:先偏航,再俯仰,最后滚转。这个顺序不能乱,否则你得到的姿态就是错的。我曾经调试一个飞控,发现姿态解算总是跳变,查了两天才发现是旋转顺序写反了——先滚转再俯仰,结果在俯仰角接近 90 度时出现了万向锁。

万向锁(Gimbal Lock): 当俯仰角 θ = ±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))
小技巧: 在嵌入式平台上,atan2asin 计算较慢。如果只是做控制,可以保留四元数形式,只在需要可视化时转换。

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 知识体系总览

下面这张图是我自己画的,把这一章的核心逻辑串起来了。你仔细看一遍,应该能明白坐标系、欧拉角、四元数之间的关系。

地轴系 (NED) 北-东-下 体轴系 (XYZ) 前-右-下 欧拉角 ψ, θ, φ 四元数 q = (w, x, y, z) 旋转矩阵 R 3x3 正交矩阵 地轴系和体轴系通过旋转矩阵 R 相互转换 欧拉角和四元数都可以生成旋转矩阵 欧拉角和四元数之间也可以互相转换

3.7 避坑指南

最后,我把自己踩过的坑总结一下,你们以后遇到了能少走弯路:

  • 我曾经在初始化四元数时,忘记归一化,结果姿态解算越来越飘。记住:四元数必须保持单位模长,每次更新后都要归一化。
  • 我曾经在坐标变换时,把旋转矩阵的方向搞反了,导致控制量反相,飞机一离地就往反方向翻。后来我养成了一个习惯:每次写完坐标变换代码,先用单位向量测试一下,比如把地轴系的北向向量 [1,0,0] 转过去,看看是不是变成了体轴系的前向。
  • 我曾经在欧拉角转四元数时,忽略了角度范围限制,导致在边界处出现跳变。建议:所有角度输入都先做归一化到 [-π, π]

好了,坐标系和运动学就讲到这里。这些东西是飞控的基石,你花再多时间在上面都值得。下一章咱们聊动力学,到时候会用到今天讲的这些变换,所以务必把这一章吃透。


专注资料整理