1. 姿态控制基础:坐标系定义与欧拉角、四元数基础、刚体运动学方程、姿态表示方法对比

各位同学,咱们开始第一讲。姿态控制,说白了就是让飞行器知道自己“脑袋朝哪、身子正不正”。我做了这么多年飞控,见过太多因为坐标系搞混导致炸机的案例。所以这一章,咱们把地基打牢。

1.1 坐标系定义:你得有个“绝对参考”

飞控里最常用的两套坐标系:世界坐标系(NED)和机体坐标系(Body)。我个人习惯把世界坐标系想象成“大地上的北东地”,机体坐标系就是“机头朝哪、右翼朝哪、肚子朝哪”。

  • NED坐标系:X轴指向北,Y轴指向东,Z轴指向地心。原点通常在地面起飞点。
  • Body坐标系:X轴指向机头,Y轴指向右翼,Z轴指向机身下方。原点在飞行器质心。

嗯,这里要注意:两个坐标系之间的转换,是所有姿态算法的起点。你想想看,如果传感器读到的数据是机体坐标系下的,而你要控制的是世界坐标系下的姿态,中间差了啥?——旋转矩阵。

我的经验: 在PX4和ArduPilot的源码里,NED是默认的世界坐标系。但有些惯性导航算法用ENU(东北天),如果你混用,结果就是“你以为它在平飞,其实它在倒立”。我曾经在移植算法时吃过这个亏,调试了一整天才发现是坐标系定义不一致。

1.2 欧拉角:直观但“有坑”

欧拉角用三个角度描述姿态:滚转(Roll, φ)、俯仰(Pitch, θ)、偏航(Yaw, ψ)。直观吧?一看就懂。但为什么很多飞控工程师对它又爱又恨?

因为万向锁(Gimbal Lock)。当俯仰角接近±90°时,滚转和偏航会耦合,丢失一个自由度。说白了,你没法区分“是滚转还是偏航造成的旋转”。

欧拉角优点 欧拉角缺点
物理意义直观,人脑易理解 存在万向锁问题
计算简单,占用资源少 三角函数运算多,精度受限
适合人机交互显示 插值不平滑,不适合姿态融合
避坑指南: 我曾经在写姿态解算模块时,直接用欧拉角做互补滤波。结果飞行器做大机动时,角度跳变导致控制量突变,差点炸机。后来我改用四元数做内部运算,只在输出给地面站时转成欧拉角。记住:内部运算用四元数,人机交互用欧拉角。

1.3 四元数基础:飞控的“内功心法”

四元数是个超复数,形式为 q = w + xi + yj + zk,其中w是实部,x、y、z是虚部。它用四个参数表示三维旋转,没有万向锁,插值平滑,计算效率高。

为什么飞控里都用它?我给你列几个理由:

  • 无奇点:无论怎么转,都不会出现万向锁。
  • 易插值:球面线性插值(SLERP)可以平滑过渡姿态。
  • 计算快:乘法只涉及加减乘除,没有三角函数。

来看一段四元数乘法的代码,这是姿态融合的核心操作:

// 四元数乘法:q = q1 * q2
void quaternion_multiply(float q1[4], float q2[4], float q_out[4]) {
    q_out[0] = q1[0]*q2[0] - q1[1]*q2[1] - q1[2]*q2[2] - q1[3]*q2[3];
    q_out[1] = q1[0]*q2[1] + q1[1]*q2[0] + q1[2]*q2[3] - q1[3]*q2[2];
    q_out[2] = q1[0]*q2[2] - q1[1]*q2[3] + q1[2]*q2[0] + q1[3]*q2[1];
    q_out[3] = q1[0]*q2[3] + q1[1]*q2[2] - q1[2]*q2[1] + q1[3]*q2[0];
}

嗯,代码看着有点长,但实际在STM32或DSP上跑,也就几十个时钟周期。我个人习惯把四元数归一化放在每次更新后,防止累积误差导致模长偏离1。

1.4 刚体运动学方程:姿态怎么“动”起来

有了姿态表示,还得知道姿态怎么随时间变化。刚体运动学方程描述了角速度与姿态变化率的关系。

用四元数表示的运动学方程:

dq/dt = 0.5 * q ⊗ ω

其中ω是机体角速度(陀螺仪测量值),⊗表示四元数乘法。这个方程是姿态解算的核心,所有互补滤波、卡尔曼滤波都在用它做预测。

如果用欧拉角表示,方程会长这样:

φ_dot = p + q*sin(φ)*tan(θ) + r*cos(φ)*tan(θ)
θ_dot = q*cos(φ) - r*sin(φ)
ψ_dot = (q*sin(φ) + r*cos(φ)) / cos(θ)

看到没?当θ接近90°时,cos(θ)趋近于0,ψ_dot会爆炸。这就是万向锁的数学本质。

核心结论: 实际飞控中,我们几乎只用四元数形式的运动学方程。欧拉角形式只在调试或显示时使用。记住这个原则,能省掉你80%的调试时间。

1.5 姿态表示方法对比:选对工具做对事

我把三种主流姿态表示方法放在一起对比,方便你选型:

方法 参数数量 奇点 计算效率 插值平滑性 典型应用
欧拉角 3 有(俯仰±90°) 低(含三角函数) 差 地面站显示、遥控器
旋转矩阵 9 无 中(矩阵乘法) 中 视觉SLAM、坐标变换
四元数 4 无 高(仅加减乘除) 好(SLERP) 飞控姿态解算、IMU融合

你想想看,飞控里每秒要跑几百上千次姿态更新,选四元数几乎是必然的。旋转矩阵虽然无奇点,但9个参数冗余,计算量大;欧拉角虽然直观,但奇点致命。

我的建议: 如果你刚开始写飞控,先用四元数做所有内部运算。等系统稳定了,再在日志和地面站里转成欧拉角显示。别问我怎么知道的——我第一版飞控代码就是用欧拉角写的,结果在测试俯仰90°时直接失控,还好当时绑了安全绳。

1.6 本章知识体系总览

下面这张图总结了本章的核心逻辑:从坐标系出发,经过姿态表示,再到运动学方程,最后落地到工程选型。你可以把它当作飞控姿态部分的“地图”。

姿态控制基础 - 知识体系框架图 姿态控制基础 - 知识体系框架 坐标系定义 NED vs Body 姿态表示方法 欧拉角 / 四元数 / 旋转矩阵 刚体运动学方程 dq/dt = 0.5 * q ⊗ ω 工程选型对比 内部四元数 / 显示欧拉角 关键结论与避坑 1. 坐标系一致性是姿态解算的前提 混用NED/ENU会导致灾难性错误 2. 欧拉角直观但有万向锁 俯仰±90°时滚转/偏航耦合 3. 四元数无奇点、计算快 是飞控内部运算的首选 4. 运动学方程是姿态预测的核心 四元数形式避免三角函数爆炸 5. 工程选型原则: 内部运算 → 四元数 人机交互 → 欧拉角 坐标变换 → 旋转矩阵

这张图把本章的知识点串起来了。你从坐标系出发,选择姿态表示方法,然后推导运动学方程,最后根据工程需求做选型。每一步都有坑,但只要你按这个框架走,就不会迷路。