4. 姿态估计核心参数:EKF2参数详解
姿态估计,说白了就是飞控的“大脑”在判断自己到底朝哪、飞多快、在哪儿。PX4 用的核心算法是扩展卡尔曼滤波器(EKF2)。很多新手一上来就调 PID,结果飞机还是乱晃,其实根子往往在 EKF2 的参数没设对。
我个人习惯,调飞控的第一步不是动 PID,而是先看 EKF2 的日志。为什么?因为如果姿态估计本身都是错的,你调再好的控制器也没用。你想想看,一个喝醉的人去开车,方向盘再灵敏也白搭。
4.1 EKF2的核心参数体系
EKF2 的参数很多,但真正需要你关心的,其实就三大块:IMU 积分、视觉/惯导融合、GPS 融合。我把它们拆开来讲。
核心原则:EKF2 的参数调优,本质上是告诉滤波器“你该信谁多一点”。信 IMU?信 GPS?还是信视觉?每个传感器的噪声参数,就是它们的“信用分”。
4.1.1 IMU积分参数
IMU 是姿态估计的基石。加速度计和陀螺仪的噪声参数,直接影响滤波器的预测精度。
| 参数名 | 默认值 | 作用 | 我的经验 |
|---|---|---|---|
EKF2_GYR_NOISE |
1.0e-2 | 陀螺仪噪声标准差 | 震动大的机架(如X型四轴),我建议调到 2.0e-2 |
EKF2_ACC_NOISE |
3.5e-1 | 加速度计噪声标准差 | 有减震板的机架可以降到 2.0e-1 |
EKF2_GYR_B_NOISE |
1.0e-4 | 陀螺仪零偏漂移噪声 | 这个值一般不动,除非你发现零偏收敛太慢 |
EKF2_ACC_B_NOISE |
3.0e-3 | 加速度计零偏漂移噪声 | 温度变化大的场景,可以适当调大 |
嗯,这里要注意。IMU 参数不是越小越好。你把噪声设得太小,滤波器就会“死磕”IMU 数据,一旦有震动干扰,姿态就会跟着抖。我在项目中遇到过一架六轴,飞控日志里姿态角一直在 ±2° 跳动,查了半天发现是 EKF2_GYR_NOISE 设得太低,震动全被当成真实运动了。
4.1.2 视觉/惯导融合参数
视觉定位(VIO)现在越来越普及。PX4 支持通过 MAVLink 接入视觉里程计数据。关键参数是这几个:
EKF2_EV_NOISE:视觉观测的噪声标准差。默认 0.1m,如果你用的是 Intel T265 或 Realsense,我建议调到 0.05m,精度更高。EKF2_EV_DELAY:视觉数据的时间延迟补偿。这个参数特别坑。默认是 0ms,但实际视觉处理有延迟,一般在 10-30ms。调不对的话,飞机会出现“滞后感”。EKF2_EV_POS_X/Y/Z:视觉传感器相对于飞控中心的安装位置偏移。很多人忘了设这个,导致位置估计有系统偏差。
避坑指南:我曾经在室内用视觉定位飞行,飞机总是往右偏 10cm。查了半天日志,发现 EKF2_EV_POS_Y 设成了 0,但相机实际装在机头右侧 8cm 处。补上这个偏移后,定位精度直接提升了一个档次。
4.1.3 GPS融合参数
室外飞行,GPS 是主力。但 GPS 信号受环境影响很大,参数调不好,飞着飞着就可能“飘走”。
| 参数名 | 默认值 | 说明 |
|---|---|---|
EKF2_GPS_NOISE |
0.5m | GPS水平位置噪声。城市峡谷或树荫下,建议调到 1.0-2.0m |
EKF2_GPS_P_NOISE |
0.1m/s | GPS速度噪声。动态飞行时,可以适当调大 |
EKF2_GPS_CHECK |
1 | GPS数据质量检查开关。建议保持开启 |
EKF2_GPS_POS_X/Y/Z |
0 | GPS天线相对于飞控中心的偏移。这个一定要设! |
为什么 GPS 天线偏移这么重要?因为 GPS 测的是天线位置,而飞控控制的是机体中心。如果天线装在机尾,转弯时就会产生一个“杠杆效应”,导致位置估计出现偏差。我见过一个案例,飞手抱怨飞机在悬停时画圈,最后发现就是 GPS 偏移没设。
4.2 如何通过日志判断EKF性能
参数调得好不好,不能靠感觉。PX4 的 ulog 日志里,有几个关键字段能告诉你 EKF 的真实状态。
4.2.1 核心日志字段解读
打开你的日志文件(用 FlightPlot 或 pyulog 都行),重点关注这几个变量:
estimator_status.vel_innov:速度新息。理想值在 ±0.5 以内。如果超过 ±1.0,说明滤波器对速度的预测和观测不一致,可能是 GPS 噪声参数不对。estimator_status.pos_innov:位置新息。同样,理想值在 ±0.5m 以内。如果持续偏大,检查 GPS 或视觉的噪声设置。estimator_status.gps_check_fail_flags:GPS 质量检查失败标志。如果这个值不为 0,说明 GPS 数据被拒了,飞控会切换到纯惯导模式,位置会漂。estimator_status.filter_fault_flags:滤波器故障标志。一旦出现,说明 EKF 已经“崩溃”了,必须马上排查。
警告:如果你在日志里看到 filter_fault_flags 不为 0,不要继续飞行。这通常意味着 IMU 数据异常、传感器时间戳错乱,或者参数设置严重不合理。先在地面站上回放日志,找到故障原因再试飞。
4.2.2 实战诊断流程
我一般按这个步骤来诊断 EKF 性能:
- 看新息曲线:打开 vel_innov 和 pos_innov,看是否在零轴附近波动。如果持续偏大,先调大对应的噪声参数。
- 看协方差:检查
estimator_status.covariances,协方差太大说明滤波器对状态估计没信心,需要更多观测数据。 - 看传感器融合状态:检查
estimator_status.fusion_status,确认 GPS、视觉、磁力计是否都在正常融合。 - 看时间延迟:如果用了视觉,检查
estimator_status.ev_delay是否和实际延迟匹配。
4.3 EKF2参数调优知识体系
为了让你更直观地理解 EKF2 参数之间的关系,我画了一张图。这张图展示了从传感器输入到状态估计的完整链路,以及每个环节对应的关键参数。
4.4 实战案例:一次完整的EKF调优过程
我记得有一次帮朋友调一架大型六轴。飞机在 GPS 模式下悬停,高度和位置都在 ±1m 内波动,飞起来很不舒服。
第一步,我看了日志里的 pos_innov,发现水平位置新息在 ±0.8m 之间跳,明显偏大。这说明 GPS 噪声参数设得太乐观了。
第二步,我检查了 gps_check_fail_flags,发现偶尔有卫星颗数不足的报错。原来飞场周围有高楼遮挡。
我的调整方案:
- 把
EKF2_GPS_NOISE从 0.5m 调到 1.5m,让滤波器不那么信任 GPS - 把
EKF2_GPS_P_NOISE从 0.1m/s 调到 0.3m/s,适应动态环境 - 同时把
EKF2_ACC_NOISE从 0.35 调到 0.5,让 IMU 在 GPS 信号差时多承担一些
改完之后再飞,位置波动降到了 ±0.3m 以内。朋友说“这飞机终于像样了”。
小技巧:调参时不要一次改太多。我习惯一次只改 1-2 个参数,然后飞一个起落看日志。改多了你根本不知道哪个参数起了作用。
4.5 常见问题速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 悬停时位置漂移 | GPS噪声参数过小,或GPS偏移未设 | 检查 EKF2_GPS_NOISE 和 EKF2_GPS_POS_* |
| 姿态角高频抖动 | 陀螺仪噪声参数过小 | 适当调大 EKF2_GYR_NOISE |
| 视觉定位滞后 | 视觉延迟补偿不准 | 调整 EKF2_EV_DELAY |
| 日志中协方差持续增大 | 传感器数据质量差,或参数不匹配 | 检查各传感器噪声参数,确认数据源正常 |
| 滤波器故障标志位出现 | IMU异常、时间戳错乱、参数严重错误 | 立即停飞,回放日志逐项排查 |