第1章:姿态解算算法——欧拉角与四元数、互补滤波原理、Mahony滤波实现、Madgwick滤波实现

1.1 姿态解算到底在解什么?

各位同学,我们先想一个问题:一架eVTOL在空中,你怎么知道它现在是“抬头”还是“低头”?是“左倾”还是“右倾”?

说白了,姿态解算就是回答这个问题。它把IMU(惯性测量单元)里那些乱七八糟的加速度、角速度数据,变成我们人能理解的“角度”。

我个人习惯把姿态解算比作“翻译官”。传感器说的是“原始数据”,飞控需要的是“姿态角”。中间这层翻译,就是算法干的活。

我在项目中遇到过最头疼的事:传感器数据明明没问题,但解算出来的姿态就是抖得厉害。后来发现,不是算法不行,是滤波参数没调好。嗯,这个坑后面我会细说。

1.2 欧拉角:最直观,但有个致命缺陷

欧拉角大家应该不陌生。三个角度:横滚(Roll)、俯仰(Pitch)、偏航(Yaw)。

优点很明显——直观。你一看Roll=10°,就知道飞机向右倾斜了10度。

但问题来了。你想想看,如果Pitch先转到90°,再转Roll会发生什么?

这就是著名的“万向锁”问题。当Pitch接近±90°时,Roll和Yaw会变得无法区分。说白了,你丢失了一个自由度。

对于eVTOL来说,这很要命。 虽然大部分飞行不会到90°俯仰,但万一遇到极端机动或者传感器噪声,欧拉角就直接“崩”了。

警告: 欧拉角不适合全姿态飞行。如果你在做特技飞行或者全向eVTOL,请直接跳过欧拉角,用四元数。

1.3 四元数:数学上优雅,工程上实用

四元数是什么?简单说,它是一个四维复数:q = w + xi + yj + zk。

别被数学吓到。你只需要记住:四元数没有奇点,计算效率高,适合嵌入式实时系统。

我在项目中用过欧拉角,也用过四元数。说实话,自从切换到四元数后,再也没为“万向锁”操过心。而且四元数的更新只需要几个乘法和加法,在STM32F4上跑起来毫无压力。

四元数更新公式(核心):

// 四元数微分方程
q_dot = 0.5 * q * ω

// 其中 ω 是角速度四元数形式 (0, ωx, ωy, ωz)
// 实际代码中写成矩阵乘法

但四元数有个小毛病——它不直观。你看到q=[0.707, 0.707, 0, 0],能立刻想到飞机是什么姿态吗?不能。所以实际工程中,我们通常把四元数转成欧拉角给地面站显示,内部计算全用四元数。

小技巧: 四元数转欧拉角的公式,建议直接查表或者用现成库函数。自己手写容易搞错符号,我吃过这个亏。

1.4 互补滤波原理:简单但有效

为什么要滤波?因为IMU数据有噪声。

加速度计:低频准,高频噪声大。
陀螺仪:高频准,但积分会漂移。

互补滤波的思路很简单:把两者的优点结合起来。

公式就一行:

角度 = α * (角度 + 陀螺仪积分) + (1-α) * 加速度计角度

其中α是权重系数,通常取0.98左右。α越大,越信任陀螺仪;α越小,越信任加速度计。

我曾经在调试时把α设成0.999,结果姿态漂移得厉害。后来改成0.98,稳如老狗。这个参数,说白了就是靠试。

1.5 Mahony滤波:互补滤波的升级版

Mahony滤波是互补滤波的一种改进。它引入了一个PI控制器来修正陀螺仪的偏差。

核心思想:用加速度计和磁力计的测量值,计算出一个“误差”,然后用这个误差去修正陀螺仪的角速度。

代码实现(核心部分):

// 1. 计算误差
error = cross(测量方向, 估计方向)

// 2. PI控制器修正角速度
gyro_bias += Ki * error * dt
gyro_corrected = gyro_raw + Kp * error + gyro_bias

// 3. 更新四元数
q_dot = 0.5 * q * gyro_corrected

我在项目中对比过:Mahony滤波比纯互补滤波的抗干扰能力强很多。特别是在有振动的情况下,Mahony依然能保持稳定。

但要注意:Ki参数不能太大,否则会引入低频振荡。我一般从Ki=0.001开始调,慢慢往上加。

重点: Mahony滤波适合计算资源有限的MCU。如果你用的是STM32F1或者Cortex-M0,Mahony是首选。

1.6 Madgwick滤波:精度更高,计算量稍大

Madgwick滤波是另一个经典算法。它用梯度下降法来优化姿态估计。

和Mahony的区别:

  • Mahony:用PI控制器修正
  • Madgwick:用梯度下降法迭代优化

Madgwick的精度通常比Mahony高一些,但计算量也大一些。不过对于现在的MCU来说,这点计算量不算什么。

核心公式:

// 梯度下降
q_new = q - β * ∇f / ||∇f||

// 其中β是步长,∇f是误差函数的梯度
// 然后和陀螺仪积分结果融合
q_final = (1-γ) * q_gyro + γ * q_gradient

我记得第一次用Madgwick时,发现它的收敛速度比Mahony快。特别是在初始化阶段,Madgwick能很快找到正确的姿态。

但有个坑:β参数很敏感。β太大,姿态会抖动;β太小,收敛慢。我一般从β=0.1开始试。

1.7 三种算法对比

算法 精度 计算量 适用场景
互补滤波 极低 简单飞行器、玩具
Mahony eVTOL、多旋翼
Madgwick 高精度需求、无人机

我个人建议:eVTOL项目直接用Mahony或Madgwick。互补滤波太简单,精度不够。Madgwick虽然计算量大一点,但现在的MCU完全扛得住。

1.8 本章知识体系

下面这张图展示了本章的核心逻辑:

姿态解算算法知识体系 IMU原始数据 加速度 + 角速度 姿态解算算法 互补滤波 Mahony滤波 Madgwick滤波 四元数 / 欧拉角输出

1.9 避坑指南

最后,分享几个我踩过的坑:

  • 陀螺仪零偏校准:上电后一定要静止几秒,采集零偏。我曾经跳过这步,结果悬停时飞机慢慢自旋。
  • 加速度计低通滤波:eVTOL的电机振动很大,加速度计数据必须滤波。我一般用20Hz的截止频率。
  • 四元数归一化:每次更新后都要归一化,否则四元数会越跑越偏。
  • 磁力计干扰:eVTOL的电机和电池会产生强磁场,磁力计数据很容易被干扰。建议用外部磁力计或者做硬铁校准。

好了,这一章就到这里。姿态解算是飞控的基础,后面的控制、导航都依赖它。把这些搞明白,后面的路就好走了。


公众号:蓝海资料掘金营,微信deep3321