【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

相关推荐
事圆则缓10 小时前
Ubuntu 安装与配置 Samba 服务器
linux·服务器·ubuntu
乌恩大侠11 小时前
【Sionna】docker build ubuntu cuda
ubuntu·docker·容器·spark·o-ru·ai-ran
Zucker n15 小时前
Ubuntu24.04结合ollama本地使用Hermes
linux·ubuntu
冰水不凉19 小时前
CodeX 在 Ubuntu 下 vscode 插件的 bug 问题
vscode·ubuntu·bug
bwz999@88.com1 天前
Ubuntu Server 24.04 设置中文
linux·运维·ubuntu
fly-971 天前
Ubuntu FTP/SFTP 报错:找不到匹配的 hostkey 算法 完整解决
linux·ubuntu
Linux-lucky2 天前
36-Linux学习之旅之MySQL主从复制
linux·运维·学习·mysql·ubuntu
承渊政道2 天前
星空组网真实体验:Mac远程访问Ubuntu,SSH与HTTP全流程验证
ubuntu·http·macos·ssh·服务器管理·星空组网
heqingchun162 天前
Ubuntu 22.04 交叉编译 RK3568 MPP + FFmpeg 完整指南
linux·ubuntu·ffmpeg
运维全栈笔记2 天前
Windows 安装 WSL2 并运行 Ubuntu 24.04 指南
linux·网络·windows·ubuntu