3. 滤波器调参(IMU):深入理解截止频率、陷波滤波器、低通滤波器对姿态估计的影响,以及如何通过频谱分析确定最佳参数。

IMU 滤波器调参,说白了就是跟噪声和延迟做斗争。你想想看,飞控读到的加速度计和陀螺仪数据,其实混着各种振动噪声。如果不处理,姿态估计就会抖得像筛糠;如果处理过头,飞控反应又慢半拍,飞机一推油门就抬头。

我个人习惯把滤波器调参分成三步走:先搞清楚噪声长什么样,再选合适的滤波器类型,最后用频谱分析定死参数。咱们一步步来。

3.1 低通滤波器:最基础的噪声抑制

低通滤波器是 IMU 信号处理的第一道防线。它的作用很简单——把高于截止频率的成分砍掉。PX4 里默认用的是二阶巴特沃斯低通滤波器,滚降特性比较平缓,不会引入太多相位畸变。

截止频率怎么选?我见过不少新手直接套默认值 100Hz,结果飞机一飞高就晃。为什么?因为机臂振动频率往往在 80-120Hz 之间,100Hz 的截止频率根本挡不住。

参数 默认值 推荐范围 说明
IMU_GYRO_CUTOFF 80 Hz 30-100 Hz 陀螺仪低通截止频率
IMU_ACCEL_CUTOFF 80 Hz 20-80 Hz 加速度计低通截止频率
IMU_GYRO_NF_FREQ 0 Hz 按需设置 陀螺仪陷波中心频率
IMU_GYRO_NF_BW 0 Hz 5-20 Hz 陷波带宽

这里有个经验值:对于 250mm 轴距的四旋翼,陀螺仪低通截止频率设在 50-60Hz 比较稳妥。大飞机(600mm 以上)可以放到 40Hz 甚至更低,因为机臂长、振动频率低。

小技巧: 如果你发现飞机悬停时电机声发闷,或者推油门时机体有明显延迟感,说明低通截止频率设得太低了。这时候可以试着每次提高 10Hz,直到手感恢复。

3.2 陷波滤波器:精准打击特定频率

低通滤波器是「一刀切」,但有些振动是窄带的——比如电机在某个转速下产生的共振峰。这时候用低通滤波器会把有用的姿态信息也砍掉,得不偿失。

陷波滤波器就是干这个的。它只衰减一个很窄的频率范围,对其他频率几乎没影响。PX4 里支持最多 4 个陷波滤波器,可以同时处理多个共振峰。

我记得有一次帮朋友调一架 5 寸穿越机,悬停时 YAW 轴一直在 5 度范围内抖动。频谱一看,120Hz 处有个尖峰——电机转速刚好跟机臂共振频率重合了。我在 IMU_GYRO_NF_FREQ 里设了 120Hz,带宽 10Hz,抖动立刻消失了。

注意: 陷波滤波器不是万能的。如果振动能量分散在很宽的频带上(比如 50-200Hz 都有),用陷波滤波器效果很差。这时候应该先检查机械结构——螺丝松了?桨叶不平衡?电机轴承磨损了?先把物理问题解决掉,再用滤波器做精细调整。

3.3 频谱分析:找到噪声的「指纹」

说了这么多,怎么知道该用低通还是陷波?截止频率设多少?答案就四个字:频谱分析。

PX4 自带了一个非常好用的工具——ekf2_gyro_fft 日志模块。你只需要在 QGroundControl 里把 IMU_GYRO_FFT_EN 设为 1,然后飞一个悬停 + 小幅机动,日志里就会记录陀螺仪数据的 FFT 结果。

我个人习惯的步骤是这样的:

  1. 采集数据: 飞机解锁后悬停 30 秒,做几次俯仰滚转机动,然后降落。
  2. 导出日志: 用 PX4 的 ulog2csv 工具把 .ulg 转成 .csv。
  3. 画频谱图: 用 Python 的 matplotlib 或者直接用 PX4 的 plot_fft.py 脚本。
  4. 找尖峰: 看频谱图上哪些频率的幅值明显高于底噪。
  5. 定参数: 如果尖峰是窄带的(比如 100Hz 处一个孤立的峰),用陷波滤波器;如果是宽带的(比如 50-150Hz 整体抬升),降低低通截止频率。

核心原则: 滤波器参数不是拍脑袋定的,而是从频谱图上读出来的。你看到的每一个尖峰,都对应着飞机上的一个物理振动源。

下面这张图展示了典型的频谱分析流程:

频谱分析辅助滤波器调参流程 1. 采集飞行数据 2. 导出 ulog 日志 3. 生成频谱图 4. 识别噪声尖峰 窄带尖峰 → 陷波滤波器 设置中心频率 & 带宽 宽带噪声 → 降低低通截止 每次降低 10Hz 测试 5. 验证飞行效果 提示:每次只改一个参数,飞一次看效果。不要同时调低通和陷波,否则你根本不知道哪个起了作用。

3.4 实战案例:一架 450mm 四旋翼的调参过程

去年我帮一个开源项目调一架 450mm 四旋翼,用的是 Pixhawk 4 + PX4 v1.13。飞机一解锁,遥控器上就能感觉到高频抖动。我直接连上 QGC,打开日志分析。

频谱图显示:

  • 80Hz 处有一个幅值 0.15 rad/s 的尖峰(电机基频)
  • 160Hz 处有一个幅值 0.08 rad/s 的二次谐波
  • 30-50Hz 频段底噪偏高(约 0.02 rad/s)

我的处理方案:

  • 在 IMU_GYRO_NF_FREQ 里设第一个陷波 80Hz,带宽 10Hz
  • 第二个陷波设 160Hz,带宽 8Hz
  • 低通截止频率从 80Hz 降到 60Hz,压制底噪

改完之后再飞一次,频谱图上 80Hz 和 160Hz 的尖峰基本消失了,底噪也降到了 0.01 rad/s 以下。飞机手感明显变顺,YAW 轴不再有那种「砂纸感」。

避坑指南: 我曾经在调一架 7 寸机时,把陷波带宽设得太宽(30Hz),结果把有用的姿态信息也滤掉了,飞机一打舵就 overshoot。后来我才意识到,陷波带宽一般不要超过中心频率的 15%。比如 100Hz 的陷波,带宽设 10-15Hz 就够了。

3.5 滤波器对姿态估计的影响

滤波器参数最终会影响 EKF2 的观测质量。低通截止频率太低,陀螺仪数据延迟变大,EKF2 预测步骤的精度下降;陷波滤波器用多了,相位响应会变得复杂,可能导致 EKF2 的协方差估计偏保守。

我一般会同时看两个指标来评估滤波器效果:

  • EKF2 的 innovation 序列: 如果 innovation 均值偏离 0 太多,说明滤波器引入了系统偏差
  • 姿态估计的延迟: 快速打舵时,看姿态估计值跟实际动作之间的时间差

嗯,这里要注意:不要为了追求「干净」的传感器数据而过度滤波。我见过有人把低通截止频率降到 20Hz,频谱图确实漂亮,但飞机飞起来像泡在水里一样,反应迟钝。滤波器调参的本质是在噪声抑制和信号保真度之间找平衡。

最后分享一个我自己用的检查清单:

  • 悬停时姿态角波动 < 1 度(RMS)
  • 快速打舵时没有明显的 overshoot 或延迟感
  • 频谱图上没有超过底噪 5 倍以上的尖峰
  • EKF2 innovation 的均值在 ±0.1 以内

满足这四点,你的滤波器参数基本就到位了。