【Basalt】Basalt主流程梳理

一句话总结这个工程里的 VIO 主流程:

图像特征跟踪 + IMU 预积分预测 -> 关键帧管理与三角化建点 -> 滑窗联合优化 -> 边缘化 -> 输出位姿/速度/零偏

如果你愿意,我下一步可以继续帮你把这个文件画成一张"函数调用关系图"或者"时序图",把 vio_run_mcap.cpp -> SqrtKeypointVioEstimator::initialize -> measure -> optimize -> marginalize 这一条链再梳成更直观的图。

这个文件本质上不是"VIO 算法实现本体",而是一个把"数据读取 -> 前端光流/特征跟踪 -> 后端 VIO -> 可视化/轨迹输出"串起来的运行入口。主入口在 src/vio_run_mcap.cpp

主流程
main() 先解析命令行、加载配置和标定,然后把数据集读进来,再创建前端和后端:

然后程序起几个线程把数据流真正跑起来:

所以从程序视角看,链路就是:

Dataset -> feed_images/feed_imu -> OpticalFlow -> VIO Estimator -> 状态/轨迹输出

算法调用的主要接口

你如果要找"算法真正从哪里进",主要盯这几个接口:

==========================================================================

==========================================================================

如果往算法实现里继续钻,这个工程当前用的核心实现是 SqrtKeypointVioEstimator,主逻辑在 src/vi_estimator/sqrt_keypoint_vio.cpp

SLAM/VIO 的主流程

按算法逻辑,可以概括成这条线:

  1. 图像进入前端,提取/跟踪特征,形成 OpticalFlowResult

    入口连接点在 src/vio_run_mcap.cpp

  2. IMU 连续进入后端队列

    src/vio_run_mcap.cpp

  3. 后端处理线程启动后,循环取一帧视觉数据 curr_frame

    src/vi_estimator/sqrt_keypoint_vio.cpp

  4. 如果系统还没初始化,就用最早 IMU 的重力方向估初始姿态

    src/vi_estimator/sqrt_keypoint_vio.cpp

  5. 对相邻图像帧之间的 IMU 做预积分,得到 IntegratedImuMeasurement

    src/vi_estimator/sqrt_keypoint_vio.cpp

  6. 调用 measure(curr_frame, meas) 处理当前帧

    这是每帧视觉惯导融合的核心入口,见 src/vi_estimator/sqrt_keypoint_vio.cpp

  7. measure() 里先用 IMU 预测当前状态
    meas->predictState(...)

    src/vi_estimator/sqrt_keypoint_vio.cpp

  8. 把当前帧观测和已有地图点关联,给老地图点加新观测
    lmdb.addObservation(...)

    src/vi_estimator/sqrt_keypoint_vio.cpp

  9. 判断是否插入关键帧

    判断依据是已连接点比例是否太低,见 src/vi_estimator/sqrt_keypoint_vio.cpp

  10. 若插入关键帧,则对新特征做三角化,生成新 landmark
    lmdb.addLandmark(...)

    src/vi_estimator/sqrt_keypoint_vio.cpp

  11. 调用 optimize_and_marg(...)

    先优化,再边缘化,见 src/vi_estimator/sqrt_keypoint_vio.cpp

  12. optimize()

    构建滑窗状态的线性系统,视觉残差和 IMU 残差一起进优化,LM 迭代求解

    src/vi_estimator/sqrt_keypoint_vio.cpp

  13. marginalize()

    对旧状态、旧关键帧、丢失地标做边缘化,维持固定大小滑窗

    src/vi_estimator/sqrt_keypoint_vio.cpp

  14. 输出当前 PoseVelBiasState

    推到 out_state_queue,外层线程把它存成轨迹

    src/vi_estimator/sqrt_keypoint_vio.cpp

相关推荐
逆向编程4 小时前
如何在Ubuntu虚拟机中使用Vim编辑器?
ubuntu·编辑器·vim
KuYouRan5 小时前
ubuntu22.04用RTX2060显卡玩steam游戏
linux·其他·ubuntu·游戏
HABuo6 小时前
【linux线程(二)】线程互斥、线程同步、条件变量详细剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
MIXLLRED6 小时前
树莓派4B(Ubuntu 22.04 Jammy arm64)上从源码编译安装 librealsense
ubuntu·树莓派·librealsense
刘瑜澄7 小时前
[邪修方法]ubuntu 25 wayland窗口协议下使用utools
linux·运维·ubuntu·wayland·utools
奇树谦9 小时前
Ubuntu 24 常用截图工具一键安装脚本+自定义快捷键配置指南
linux·运维·ubuntu
biubiubiu07069 小时前
Ubuntu 22.04 中 cron 和 systemd timer 的区别与使用
linux·运维·ubuntu
逆向编程9 小时前
Ubuntu 虚拟机 Python3 + pip 完整安装教程
linux·ubuntu·pip
IAUTOMOBILE10 小时前
Ubuntu 22.04 下 NVIDIA H100 服务器完整部署攻略:驱动、Fabric Manager 与 Container Toolkit 配置
服务器·ubuntu·fabric