
1. 200 Hz IMU 不能逐步进 BA
IMU 200 Hz、相机 30 Hz——每个 IMU 样本独立成因子,BA 算力爆炸;优化迭代中 bias 变就重积,线性化点不一致,滤波器过度自信。预积分把 区间压成一条相对运动约束,bias 变时用一阶修正而非重积——Forster on-manifold 预积分是 VIO 后端标准件。对接开源实现时,重力坐标系搞反、协方差少乘 、bias 变了却忘记修正,是三大高频坑;表现往往是 EuRoC 能复现、真机尺度呼吸。
2. 预积分增量
以线性化点 在 body 系中值积分:
同理累加。同时递推对 bias 的 Jacobian 与协方差 (9 或 15 维,视实现)。中值积分 vs 欧拉须与论文/代码一致——混用会在 Chi2 上表现为「看起来收敛但 bias 怪」。
3. bias 一阶修正
优化中 ,不重新积分:
同理。VINS-Mono、OpenVINS、GTSAM ImuFactor 都遵循此结构——这是「可重复线性化」的关键。仅当 超过阈值才触发重积,阈值与 Allan 标定质量相关。实现时把 与 同线程递推,勿分开维护两套积分器。
4. 因子残差(概念)
连接关键帧 :
bias 建模 random walk:。用 加权。重力 在 world 系的符号须与视觉、初始化一致——不一致时 会吸收,短期 EuRoC 仍好看,真机高速转弯掉高程。ImuFactor 的 Chi2 长期偏离 dof,优先查模型与噪声,而非先调视觉权重。
5. 协方差与 √dt 陷阱
离散 Lyapunov:。 来自 Allan variance。连续噪声密度 (rad/s/√Hz)到离散:不同库差 或 ——填参前读文档,勿从论文直接抄数。协方差与残差必须在同一线性化点计算。Allan 拟合的 进 yaml 前对照 VINS/OpenVINS wiki 的 conversion 段,抄错一次就要重跑整条回归。
6. 工程根因表
| 症状 | 可能根因 |
|---|---|
| 尺度呼吸 | 预积分协方差过小 / bias 未联合估计 |
| 高度漂移 | 重力方向错 / 未收敛 |
| 转弯掉高程 | 错 / 外参旋转错 |
| bias 发散 | 相机-IMU 时间戳未对齐 |
调噪声前,先确认 stamp_diff = cam - imu 分布;加速度单位 m/s² 不是 g;IMU 与图像 补偿是否启用。预积分模块与 ESKF 传播若用不同重力符号,表现类似噪声填错。
7. 单元测试
固定一段 IMU,对比「bias 变后一阶修正」与「完整重积分」的 ,差应 < 1e-4。把预积分模块从 VIO 拆出来单测,能拦住大部分实现 bug——比跑整条 EuRoC 更快定位。
8. 与 ESKF 的接口
预积分因子和 ESKF 传播必须共享同一测量模型与噪声离散化——一个用中值积分、一个用欧拉,融合会系统性冲突。ESKF 给帧间预测,预积分给 KF 间约束;两者对 、 的处理不一致时,表现为「滤波稳、优化抖」或反过来。
9. 案例:时间戳错位伪装成噪声问题
cam-imu 差 5 ms 未补偿,调小 gyro 噪声仍 bias 发散——先画 stamp_diff 直方图,再动 Allan 参数。加速度单位用 g 而非 m/s² 时,尺度错 9.81 倍,EuRoC 有时仍「能跑」,真机直线加速段立刻露馅。
10. 验收
- IMU 因子 Chi2 接近 dof;
- 去掉 IMU 因子后 ATE 明显恶化(消融);
- bias 估计量级与 Allan 一致;
- 预积分与独立传播在固定 bias 下一致;
- bias 变化时一阶修正 vs 重积分误差 < 1e-4。
预积分对了,VIO 后端才是在优化物理;错了,bias 会吸收一切,轨迹看起来稳、尺度却在呼吸。把预积分单测纳入 CI,比每次改完跑全长 EuRoC 更省机时。ImuFactor 与 ESKF 传播共用同一份 与 bias 模型注释,避免两处各写一版。关键帧间隔变大时,预积分区间变长,一阶 bias 修正误差上限须单测覆盖。
相关
也可以看看
johan's blog