对比 OpenVINS 与 msckf_vio 的流程与算法
1. 架构与数据流对比
OpenVINS(单进程、前后端合一)

…1 个主节点:ov_msckf 里同时做跟踪 + 滤波。
…配置:config//estimator_config.yaml + kalibr_*.yaml。
MSCKF_VIO(双节点、前后端分离)
…2 个 nodelet:image_processor(纯视觉)+ vio(纯滤波)。
…中间话题:msckf_vio/CameraMeasurement(已跟踪好的特征坐标)。
…配置:Kalibr 导出的 camchain-imucam-euroc.yaml,经 rosparam load。
2. IMU 数据处理流程对比
共同思想
…IMU 高频入缓冲,在图像/特征时刻一次性积分到该时刻。
…状态含:姿态、速度、位置、陀螺/加计偏置;用 IMU 做预测,视觉做更新。
OpenVINS

MSCKF_VIO

void MsckfVio::featureCallback(const CameraMeasurementConstPtr& msg) {
if (!is_gravity_set) return;
...
batchImuProcessing(msg->header.stamp.toSec());
stateAugmentation(msg->header.stamp.toSec());
addFeatureObservations(msg);
removeLostFeatures(); // 内含 MSCKF 更新
pruneCamStateBuffer();
publish(msg->header.stamp);
差异要点:OpenVINS 初始化更灵活(动态 MLE 等);MSCKF_VIO 强依赖 开头静止 200 IMU;OpenVINS 强调 相机–IMU 时间偏移 与多种 IMU 内参;MSCKF_VIO 强调 论文里的可观性约束(null space) 和 外参在滤波状态里。
3. 图像数据处理流程对比
OpenVINS

MSCKF_VIO

差异要点:OpenVINS 跟踪与 EKF 同进程、共享状态;MSCKF_VIO 跟踪与 EKF 解耦,只传 2D 观测。OpenVINS 前端可换描述子、可 ArUco;MSCKF_VIO 前端固定为 网格 FAST + KLT + 立体几加粗样式何。
4. 滤波 / 算法对比(核心)
两者都源于 Mourikis & Roumeliotis MSCKF:路标 不进状态,用多相机 clone 上的观测约束,对特征维做 零空间投影(SVD),再 EKF 更新。
单次「图像时刻」算法顺序(对照)
OpenVINS(do_feature_propagate_update):
…IMU 传播 + 增加 IMU clone
…选 丢失/边缘化/SLAM 特征
…UpdaterMSCKF::update
…UpdaterSLAM::update + delayed init
…重三角化、marg 最老 clone
MSCKF_VIO(featureCallback):
…batchImuProcessing(IMU 传播 + 可观性修正)
…stateAugmentation(增加相机 clone + 扩协方差)
…addFeatureObservations
…removeLostFeatures → 建 H、SVD、measurementUpdate
…pruneCamStateBuffer(关键帧式删相机状态)
注意:OpenVINS 增的是 IMU 位姿 clone;MSCKF_VIO 增的是 相机位姿 clone(再由 IMU+外参得到),这是实现上最显眼的结构差异,但 MSCKF 约束本质相同。
5. 配置与 EuRoC 使用差异

6. 怎么选 / 怎么理解「跑飞」
流程: OpenVINS 更「一体化、可扩展」;MSCKF_VIO 更「经典论文复现、前后端硬拆分」。
算法:
OpenVINS = MSCKF + SLAM + FEJ + 标定 + ZUPT;
MSCKF_VIO = 纯 MSCKF + 可观性约束 + 外参 EKF + QR 更新。
调参: OpenVINS 对 yaml/编码/中文注释敏感;MSCKF_VIO 对 静止初始化、Kalibr 外参符号、双节点延迟 更敏感。
7. 哪一帧 / 哪条消息触发 EKF?

8. 时序示意(稳态,同一 bag 某一帧)
时间轴上 竖线 = 一次完整 EKF(MSCKF 测量更新 + 传播到该图像时刻)。
同一物理帧:OpenVINS 在 稍后某条 IMU 上才处理该帧图像;MSCKF_VIO 在 features 发布时立即 处理,IMU 在 featureCallback 内 批量积到 t_cam。两者都把 状态时间对齐到相机时刻,但 调度线程不同(OpenVINS:IMU 驱动队列;MSCKF_VIO:特征消息驱动)。
9. 启动阶段时序

10. 快速对照(复制用)

11. 初始化
OpenVINS 的初始姿态(四元数 q_GtoI:全局系 G → IMU 系 I)不是来自外参 yaml,而是在 VIO 正式 EKF 更新之前,由 ov_init 里的 InertialInitializer 算出来并写入 state->_imu。EuRoC 默认配置走的是 静态初始化。
选哪条初始化路径?
姿态怎么来?(核心)
和 MSCKF_VIO 的对比
一句话:EuRoC 默认下,OpenVINS 的初始姿态来自 静止段 IMU 加计平均方向,通过 Gram–Schmidt 对齐到配置的重力向量 [0,0,9.81],得到 roll/pitch;yaw 在初始化时不可观、由构造 x/y 轴的方式任意固定;之后由滤波器用视觉–惯性继续估计。若一直 init 失败,可看 log 里 [init-s] / [init]: disparity 是否在等 jerk 或视差过大。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)