【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

相关推荐
letisgo52 小时前
VMware Workstation + Ubuntu 26.04 LTS 小白运维部署手册
linux·运维·ubuntu
祁白_21 小时前
Ubuntu_Docker_零基础搭建与基础使用笔记
笔记·ubuntu·docker
通信小小昕1 天前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
CedarQR1 天前
万字长文:从零在 RK3588 上部署 PaddleSpeech 中文 TTS 全流程(FastSpeech2 + HiFiGAN)
开发语言·c++·嵌入式硬件·ubuntu·json
雷工笔记1 天前
Ubuntu迁移记录
笔记·ubuntu
一叶龙洲1 天前
ubuntu26.04 xfce美化成mac
服务器·ubuntu·macos
一叶龙洲2 天前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
敖行客 Allthinker2 天前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu
keyipatience2 天前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu