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 甚至更低,因为机臂长、振动频率低。
3.2 陷波滤波器:精准打击特定频率
低通滤波器是「一刀切」,但有些振动是窄带的——比如电机在某个转速下产生的共振峰。这时候用低通滤波器会把有用的姿态信息也砍掉,得不偿失。
陷波滤波器就是干这个的。它只衰减一个很窄的频率范围,对其他频率几乎没影响。PX4 里支持最多 4 个陷波滤波器,可以同时处理多个共振峰。
我记得有一次帮朋友调一架 5 寸穿越机,悬停时 YAW 轴一直在 5 度范围内抖动。频谱一看,120Hz 处有个尖峰——电机转速刚好跟机臂共振频率重合了。我在 IMU_GYRO_NF_FREQ 里设了 120Hz,带宽 10Hz,抖动立刻消失了。
3.3 频谱分析:找到噪声的「指纹」
说了这么多,怎么知道该用低通还是陷波?截止频率设多少?答案就四个字:频谱分析。
PX4 自带了一个非常好用的工具——ekf2_gyro_fft 日志模块。你只需要在 QGroundControl 里把 IMU_GYRO_FFT_EN 设为 1,然后飞一个悬停 + 小幅机动,日志里就会记录陀螺仪数据的 FFT 结果。
我个人习惯的步骤是这样的:
- 采集数据: 飞机解锁后悬停 30 秒,做几次俯仰滚转机动,然后降落。
- 导出日志: 用 PX4 的
ulog2csv工具把 .ulg 转成 .csv。 - 画频谱图: 用 Python 的 matplotlib 或者直接用 PX4 的
plot_fft.py脚本。 - 找尖峰: 看频谱图上哪些频率的幅值明显高于底噪。
- 定参数: 如果尖峰是窄带的(比如 100Hz 处一个孤立的峰),用陷波滤波器;如果是宽带的(比如 50-150Hz 整体抬升),降低低通截止频率。
核心原则: 滤波器参数不是拍脑袋定的,而是从频谱图上读出来的。你看到的每一个尖峰,都对应着飞机上的一个物理振动源。
下面这张图展示了典型的频谱分析流程:
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 轴不再有那种「砂纸感」。
3.5 滤波器对姿态估计的影响
滤波器参数最终会影响 EKF2 的观测质量。低通截止频率太低,陀螺仪数据延迟变大,EKF2 预测步骤的精度下降;陷波滤波器用多了,相位响应会变得复杂,可能导致 EKF2 的协方差估计偏保守。
我一般会同时看两个指标来评估滤波器效果:
- EKF2 的 innovation 序列: 如果 innovation 均值偏离 0 太多,说明滤波器引入了系统偏差
- 姿态估计的延迟: 快速打舵时,看姿态估计值跟实际动作之间的时间差
嗯,这里要注意:不要为了追求「干净」的传感器数据而过度滤波。我见过有人把低通截止频率降到 20Hz,频谱图确实漂亮,但飞机飞起来像泡在水里一样,反应迟钝。滤波器调参的本质是在噪声抑制和信号保真度之间找平衡。
最后分享一个我自己用的检查清单:
- 悬停时姿态角波动 < 1 度(RMS)
- 快速打舵时没有明显的 overshoot 或延迟感
- 频谱图上没有超过底噪 5 倍以上的尖峰
- EKF2 innovation 的均值在 ±0.1 以内
满足这四点,你的滤波器参数基本就到位了。