1. 项目背景与核心需求
在无人机飞控系统中,扩展卡尔曼滤波器(EKF2)是状态估计的核心算法模块。当传感器数据流出现短暂中断时,如何维持系统稳定运行成为关键挑战。这个项目要解决的正是在新传感器数据接入前的"空窗期"状态维持问题。
我曾在多个工业级无人机项目中遇到过类似场景:GPS信号被高楼遮挡、视觉里程计因光照变化失效、气压计受气流干扰...这些都会导致EKF2的观测数据突然中断。传统做法是直接触发故障保护,但这样会导致飞行器频繁进入保守模式,严重影响作业效率。
2. 技术方案设计思路
2.1 传感器失效检测机制
我们采用三级检测策略:
- 信号有效性检查(数据范围、变化率)
- 时间连续性检查(数据更新时间戳)
- 物理一致性检查(多传感器交叉验证)
具体实现时,在ekf2_main.cpp中增加了checkSensorValidity()函数,对每路输入数据进行实时诊断。例如对GPS数据会检查:
cpp复制bool GPS_valid = (gps_data.fix_type >= 3) &&
(gps_data.eph < 5.0f) &&
(hrt_elapsed_time(&gps_data.timestamp) < 200000);
2.2 状态预测与保持算法
当检测到传感器失效时,系统自动切换至预测模式:
- 短期(<1s):使用IMU数据进行惯性导航
- 中期(1-5s):引入运动模型预测
- 长期(>5s):触发降级策略
关键参数包括:
| 预测阶段 | 使用数据源 | 位置误差增长 | 姿态误差增长 |
|---|---|---|---|
| 短期 | IMU | 0.5m/s | 0.1°/s |
| 中期 | 运动模型 | 1.2m/s | 0.3°/s |
| 长期 | 历史轨迹 | 3.0m/s | 1.0°/s |
3. 具体实现细节
3.1 缓冲区管理
我们设计了环形缓冲区来存储历史状态:
cpp复制struct ekf_state_buffer {
uint64_t timestamp;
matrix::Vector3f position;
matrix::Quatf quaternion;
matrix::Vector3f velocity;
} buffer[BUFFER_SIZE];
缓冲区更新策略采用加权平均法,新数据权重随时间指数衰减:
code复制w = exp(-(t_now - t_sample)/tau)
其中tau根据传感器类型配置,GPS通常取2.0,视觉里程计取1.0。
3.2 预测模型实现
在ekf2_utils.cpp中实现了三种预测模型:
- 匀速模型(默认)
- 匀加速模型(需历史加速度数据)
- 运动学模型(含机体动力学参数)
模型切换逻辑如下:
mermaid复制graph TD
A[传感器失效] -->|t<1s| B[IMU惯性导航]
A -->|1s<t<5s| C[运动模型预测]
A -->|t>5s| D[历史轨迹保持]
4. 实际测试与调参经验
4.1 参数调试要点
经过大量实飞测试,总结出关键参数经验值:
-
IMU预测阶段:
- 陀螺零偏稳定性需<0.5°/h
- 加速度计噪声密度<100μg/√Hz
- 预测时间窗口建议0.8-1.2s
-
运动模型阶段:
- 模型切换迟滞阈值设为0.3s
- 最大允许预测速度变化率2m/s²
- 航向角预测权重设为0.7
4.2 典型问题排查
问题1:GPS重捕获后位置跳变
- 原因:预测阶段累积误差未及时修正
- 解决:增加重捕获时的平滑过渡算法:
cpp复制void smoothTransition() {
// 使用二阶低通滤波器
_position = _alpha * new_pos + (1-_alpha)*_position;
_alpha = constrain(_alpha * 1.1, 0, 0.9);
}
问题2:视觉里程计失效后姿态漂移
- 原因:IMU零偏未及时估计
- 解决:在预测阶段启用零偏在线校准:
cpp复制if (predict_time > 0.5f) {
updateBiasEstimate();
}
5. 性能优化技巧
-
内存优化:
- 将状态缓冲区从全精度float改为半精度
- 使用SIMD指令加速矩阵运算
-
时序优化:
- 预测计算放在低优先级线程
- 使用时间片轮转调度
-
能耗优化:
- 预测阶段降低IMU采样率
- 动态调整EKF更新频率
实测在STM32H7平台上,优化后CPU占用率从32%降至18%,内存消耗减少40%。
6. 不同场景下的配置建议
根据多年项目经验,总结出典型应用场景的最佳配置:
| 场景类型 | 最大预测时间 | 首选运动模型 | 位置误差阈值 |
|---|---|---|---|
| 室内无人机 | 3.0s | 匀速模型 | 0.5m |
| 农业植保机 | 5.0s | 轨迹保持 | 2.0m |
| 物流配送无人机 | 2.5s | 匀加速模型 | 1.0m |
| 测绘无人机 | 1.5s | IMU惯性 | 0.3m |
对于特殊场景如隧道巡检,建议:
- 预先录制轨迹模板
- 启用RF辅助定位
- 设置保守的误差阈值
7. 扩展应用与未来改进
当前系统还存在一些可优化空间:
- 引入深度学习预测模型
- 增加多机协同定位支持
- 开发基于UWB的辅助定位模块
在实际部署中发现,结合简单的环境特征匹配(如视觉二维码),可以显著延长有效预测时间。我们在仓库巡检无人机上测试时,仅靠天花板特征就能维持8秒以上的稳定定位。