3、姿态表示基础:欧拉角、旋转矩阵、四元数的定义、转换关系及在飞控中的应用

姿态控制是飞控系统的核心闭环,而姿态表示则是该闭环的数学基石。PX4、ArduPilot 等主流飞控源码中,姿态数据在传感器融合(EKF2/互补滤波)、控制器解算(角度环/角速度环)以及指令生成(姿态设定值)之间频繁流转。理解欧拉角、旋转矩阵与四元数三者的定义、转换关系及各自的工程适用场景,是读懂飞控源码、定位姿态异常(如万向节锁、控制发散)的前提。本章将从数学定义出发,结合飞控源码中的实际数据结构与算法路径,系统梳理三种表示方法的本质联系与工程取舍。

姿态表示三角关系与飞控应用映射 欧拉角 (Roll/Pitch/Yaw) 定义:绕机体三轴依次旋转 特点:直观、有万向节锁 飞控用途:遥控遥测、姿态设定 源码变量:attitude.roll/pitch/yaw 旋转矩阵 (DCM) 定义:3x3正交矩阵 R 特点:无奇异、计算量较大 飞控用途:向量坐标变换 源码变量:R[3][3] 或 DCM 四元数 (Quaternion) 定义:q = w + xi + yj + zk 特点:紧凑、无奇异、易插值 飞控用途:姿态解算、控制内核 源码变量:attitude.q[4] R = Rz·Ry·Rx 特征向量法 atan2 与 asin 转换(注意奇异性) 飞控源码中的实际应用链路 传感器融合(EKF2) → 四元数状态量 → 控制律(角速度环) → 欧拉角输出

上图展示了三种姿态表示方法在飞控系统中的核心定位与转换关系。欧拉角提供直观的物理意义,旋转矩阵擅长向量坐标变换,四元数则是现代飞控姿态解算与控制的内核。下面我们逐一深入剖析。

3.1 欧拉角:直观但存在奇异的姿态描述

核心原理

欧拉角通过三次绕不同坐标轴的旋转来定义刚体姿态。飞控中通常采用 Z-Y-X 内旋顺序(即先偏航 Yaw,再俯仰 Pitch,最后横滚 Roll),对应机体坐标系相对于地面坐标系的旋转。其数学本质是三个基本旋转矩阵的乘积:R = Rz(ψ) · Ry(θ) · Rx(φ)。其中 φ(Roll)、θ(Pitch)、ψ(Yaw)分别对应横滚角、俯仰角和偏航角。PX4 源码中,vehicle_attitude_setpoint 消息直接使用欧拉角作为用户期望姿态的输入接口,而 vehicle_attitude 消息则输出当前欧拉角用于地面站显示。

判断方法与操作流程

在飞控调试中,判断欧拉角是否处于正常范围是第一步。通常约定:Roll 和 Pitch 限制在 ±90° 以内(实际飞行中极少超过 ±60°),Yaw 为 ±180°。当 Pitch 接近 ±90° 时,欧拉角描述会出现万向节锁现象——此时 Yaw 与 Roll 的旋转轴重合,导致自由度丢失。操作流程上,若地面站观察到 Pitch 接近 90° 且 Yaw/Roll 数据剧烈跳变,应首先检查是否触发了奇异条件,而非传感器故障。

欧拉角参数范围飞控源码中的典型应用风险点
Roll (φ)-180° ~ +180°横滚通道控制、姿态显示与 Pitch 耦合时产生奇异
Pitch (θ)-90° ~ +90°俯仰通道控制、倾角限制±90° 时万向节锁
Yaw (ψ)-180° ~ +180°航向控制、GPS 融合跨越 ±180° 时的角度跳变

案例拆解:PX4 中欧拉角设定值的异常跳变

某多旋翼在自动航线飞行中,地面站显示 Yaw 角在 179° 与 -179° 之间反复跳变。初步分析:航向控制指令在角度环绕处未做平滑处理。检查源码发现,mc_att_control 模块中偏航误差计算使用了直接相减:yaw_error = target_yaw - current_yaw,当目标为 179°、当前为 -179° 时,误差为 358°,控制器会错误地选择大幅旋转方向。修复方案是引入角度归一化函数:yaw_error = wrap_pi(target_yaw - current_yaw),将误差映射到 -180°~+180° 区间。修改后航向平滑过渡,跳变消失。此案例说明欧拉角虽然直观,但在边界处理上需要额外逻辑。

风险提醒:欧拉角在飞控中仅适合作为外部接口或显示用途,绝不可直接用于姿态控制内环积分。因为其微分方程在 Pitch=±90° 时存在奇异点,会导致控制律计算溢出。

3.2 旋转矩阵:坐标变换的万能工具

核心原理

旋转矩阵(Direction Cosine Matrix, DCM)是一个 3×3 的正交矩阵,满足 RTR = I 且 det(R)=1。其每一列表示机体坐标轴在地面坐标系中的方向余弦。飞控中,DCM 最重要的作用是向量坐标变换:将加速度计测量的比力从机体坐标系转换到地面坐标系,或将期望推力向量从地面系转换到机体系。PX4 的 math::Matrix3f 类封装了 DCM 运算,EKF2 中维护的 R 矩阵即为当前姿态的 DCM 表示。

判断方法与操作流程

验证 DCM 是否有效,可通过正交性检查:计算 R·RT 是否接近单位矩阵。在源码调试中,若发现加速度融合异常,可打印 DCM 的第三行(即地面系 Z 轴在机体系中的投影),正常情况下其模长应为 1。操作流程:在飞控日志中提取 R[2][0], R[2][1], R[2][2],计算平方和,若偏差超过 0.01 则说明矩阵已退化,需要重新初始化。

案例拆解:DCM 在互补滤波中的正交化修正

经典互补滤波(如 Mahony 算法)中,每次更新后 DCM 会因积分漂移失去正交性。源码中常见的修正方法是:R = R * (1.5*I - 0.5*R*RT),该公式通过牛顿迭代将矩阵投影回 SO(3) 流形。某飞控在长时间飞行后出现姿态漂移,日志显示 DCM 正交性误差从 0.001 增长至 0.05。加入上述修正后,误差稳定在 0.0005 以内。此案例表明,DCM 虽然计算量较大(9 个元素),但其数学性质便于检测和修正。

经验提示:在飞控源码中,若需要频繁进行向量旋转(如将磁力计数据转换到地面系),优先使用 DCM 而非四元数。因为四元数旋转向量需要额外的共轭乘法,而 DCM 直接矩阵乘法即可,代码更简洁且不易出错。

3.3 四元数:飞控姿态解算的工业标准

核心原理

四元数 q = w + xi + yj + zk 是一种超复数,其中 w 为标量部分,(x,y,z) 为矢量部分。单位四元数满足 w²+x²+y²+z²=1,可表示三维空间中的旋转。其核心优势在于:无奇异点、存储紧凑(4 个浮点数)、插值平滑(球面线性插值 Slerp)。PX4 的 vehicle_attitude 消息中 q[4] 数组即为当前姿态四元数,EKF2 的状态向量中直接包含四元数分量作为状态量。

判断方法与操作流程

四元数的有效性检查包括:模长是否接近 1(容差 1e-4),以及 w 分量是否为正(若 w<0,则 q 与 -q 表示同一旋转,但习惯上取 w>0 以减少计算歧义)。在飞控源码中,四元数更新通常采用一阶龙格-库塔积分:q_dot = 0.5 * q ⊗ ω,其中 ω 为机体角速度四元数(实部为 0)。操作流程上,每次更新后需重新归一化:q = q / norm(q),防止模长漂移。

特性欧拉角旋转矩阵四元数
存储量3 个浮点数9 个浮点数4 个浮点数
奇异性有(Pitch=±90°)无无
计算效率高(但需三角函数)低(矩阵乘法)中(乘法较少)
插值能力差(线性插值不自然)差(需重新正交化)优(Slerp)
飞控应用用户接口、显示坐标变换姿态估计、控制内核

案例拆解:四元数在 EKF2 中的状态更新与故障恢复

某固定翼无人机在高速飞行中,EKF2 报告姿态发散。分析日志发现,四元数模长在 0.5 秒内从 1.0 衰减至 0.92,导致旋转矩阵非正交。根因是陀螺仪噪声过大,且更新步长 h=0.01s 时,一阶积分误差累积。修复措施:① 在源码中增加四元数模长监测,当 |1-norm|>0.01 时强制重置为最近有效值;② 将积分方法升级为二阶龙格-库塔(中点法),减少离散化误差。修改后,四元数模长稳定在 0.999~1.001 之间,姿态恢复平稳。此案例展示了四元数在飞控中的核心地位——其数值稳定性直接决定整个控制链路的可靠性。

源码实践:在 PX4 的 AttitudeControl.cpp 中,控制器输入为四元数设定值 q_sp 和当前四元数 q,通过计算相对旋转 q_rel = q_sp * q.inversed() 得到误差四元数,再提取其矢量部分作为比例控制的误差项。这种设计避免了欧拉角微分方程的奇异问题,使得控制器在全姿态范围内保持稳定。

3.4 三种表示的转换关系与工程选型

核心原理

转换关系是飞控源码中频繁调用的数学工具。欧拉角转四元数:q = q_yaw(ψ) ⊗ q_pitch(θ) ⊗ q_roll(φ),其中各轴四元数可直接由半角公式计算。四元数转欧拉角:φ = atan2(2(wx+yz), 1-2(x²+y²)),θ = asin(2(wy-zx)),ψ = atan2(2(wz+xy), 1-2(y²+z²))。四元数转旋转矩阵:R = I + 2w·[v]× + 2[v]ײ,其中 [v]× 为矢量部分的反对称矩阵。

判断方法与操作流程

在飞控源码中,转换函数通常位于 math::Quaternion 类中。判断转换是否正确的快速方法是:将同一姿态分别用三种方式表示,然后互相转换,验证误差小于 1e-6。操作流程上,当需要从传感器融合模块(四元数)输出到地面站(欧拉角)时,应使用官方提供的 to_euler() 方法,而非自行推导公式,以避免符号错误。

案例拆解:PX4 中四元数转欧拉角的精度验证

在开发自定义飞控时,团队需要将 EKF2 输出的四元数转换为欧拉角用于日志记录。初始实现直接套用标准公式,但在 Pitch=85° 时发现 Roll 和 Yaw 出现微小抖动。排查发现,asin 函数在输入接近 ±1 时对数值误差敏感。解决方案:在调用 asin 前将输入限制在 [-1, 1] 区间内,并增加 M_PI_2 的边界处理。修正后,全姿态范围内转换误差小于 0.01°。此案例提醒我们,数学公式的数值稳定性在飞控这种实时系统中至关重要。

选型建议:在飞控源码中,遵循以下原则:
① 传感器融合(EKF2/互补滤波)内部一律使用四元数,避免奇异和漂移;
② 坐标变换(如加速度计数据转地面系)使用旋转矩阵,代码可读性好;
③ 用户交互层(遥控器输入、地面站显示)使用欧拉角,但必须做好角度环绕处理。

3.5 总结复盘:姿态表示的工程要点

本章的核心结论可归纳为三点:第一,欧拉角是“人机接口”,适合展示和简单设定,但绝不能用于控制内环;第二,旋转矩阵是“变换工具”,适合向量旋转,但需关注正交性维护;第三,四元数是“控制内核”,适合姿态估计与插值,但需注意归一化。在飞控源码阅读中,遇到姿态相关变量时,首先判断其数据类型(Quatf、Matrix3f 还是 Eulerf),再决定调用相应的转换函数。实际调试中,若发现姿态控制异常,优先检查四元数模长和 DCM 正交性,这两项指标能快速定位数值发散问题。掌握这三种表示方法的本质联系,是深入理解飞控姿态控制链路的第一步,也是后续学习控制律设计、传感器融合的基础。