【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

相关推荐
XIAOHEZIcode1 天前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
张飞飞飞飞飞14 天前
Tmux命令使用教程
linux·服务器·ubuntu
盼小辉丶14 天前
Ubuntu极速部署OpenClaw完全指南(本地模型+DeepSeek)
linux·ubuntu·openclaw
黑白园14 天前
【环境搭建】Ubuntu安装(一)
linux·ubuntu
Moshow郑锴14 天前
Ubuntu用SDKMAN轻松管理多个Java 版本
java·ubuntu·sdkman
error:(14 天前
Ubuntu 22.04 GNOME远程桌面配置问题排查与解决全流程
linux·运维·ubuntu
Java知识技术分享14 天前
在windows上使用wsl安装Ubuntu~linux系统
linux·人工智能·windows·ubuntu
天疆说14 天前
在 Ubuntu 24.04 上安装 MATLAB R2021b
数据库·ubuntu·matlab
Clang's Blog14 天前
Ubuntu(20.04/22.04/24.04)国内环境一键安装 Docker、JDK17 和 Maven
ubuntu·docker·maven
izcll14 天前
ubuntu系统安装软件的方法
linux·运维·ubuntu