【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

相关推荐
闫利朋6 小时前
Ubuntu 24.04 桌面安装向日葵完整指南
linux·运维·ubuntu
勤自省9 小时前
《RDK X5 ROS 2 Humble 安装与验证:从零到 Hello World》
windows·ubuntu·ssh·ros2
威迪斯特14 小时前
Ubuntu的apt命令详解:系统管理的核心工具
运维·服务器·ubuntu·apt·下载·包管理·维护
freewlt16 小时前
TypeScript 5.5 新特性深度解析:类型系统的又一次进化
linux·ubuntu·typescript
Sapphire~18 小时前
Linux-15 ubuntu 和 windows 双系统,更新系统导致丢失ubuntu 入口
linux·运维·ubuntu
温柔一只鬼.18 小时前
Ubuntu 安装 Python 3.10 完整指南
linux·运维·ubuntu
daemon.qiang18 小时前
Ubuntu 20.04+安装JFrog CLI超详细指南
linux·运维·ubuntu
湖城彭于晏18 小时前
VMware Ubuntu 固定IP + 上网 + 远程访问 完整教程
linux·ubuntu·vmware
剪刀石头布Cheers18 小时前
Ubuntu Hermes安装关键步骤
linux·运维·ubuntu·ai·agent·hermes
Lupino1 天前
别让服务器“吃里扒外”:从流量耗尽封禁,到一行命令瞬间反杀
ubuntu