VINS-MONO概述

VINS-Mono是HKUST的Shen Shaojie团队开源的一套Visual-Inertial融合定位算法,https://github.com/HKUST-Aerial-Robotics/VINS-Mono,是用紧耦合方法实现的,通过单目+IMU恢复出尺度,效果很好,接下来对会该算法框架逐步解析,以便二次开发。

那么为什么要进行视觉与IMU的融合呢,自己总结的主要有以下几点:

  • 视觉与IMU的融合可以借助IMU较高的采样频率,进而提高系统的输出频率。
  • 视觉与IMU的融合可以提高视觉的鲁棒性,如视觉SLAM因为某些运动或场景出现的错误结果。
  • 视觉与IMU的融合可以有效的消除IMU的积分漂移。
  • 视觉与IMU的融合能够校正IMU的Bias。
  • 单目与IMU的融合可以有效解决单目尺度不可观测的问题。

总体布局

该算法主要有以下几个模块:
1.预处理
图像特征光流跟踪
IMU数据预积分
2.初始化
纯视觉Sfm
Sfm与IMU积分的松耦合
3.基于滑动窗口的非线性优化实现紧耦合
4.回环检测与重定位
5.四自由度位姿图优化

原论文:
VINS-MONO概述_第1张图片

  • 系统从测量预处理(IV)开始,在其中提取和跟踪特征,对两个连续帧间的IMU测量值进行预积分。
  • 初始化过程(V)提供了所有必要的值,包括姿态、速度、重力向量、陀螺仪偏置和三维特征位置,用于引导随后的基于非线性优化的VIO。
  • VIO(VI)与重定位(VII)模块紧密地融合了预先积分的IMU测量、特征观测和回环重新检测到的特征。最后,位姿图优化模块(VIII)接受几何验证的重定位结果,并进行全局优化以消除漂移。
  • VIO、重新定位和位姿图优化模块在多线程设置中同时运行。每个模块有不同的运行速度和实时保证,以确保在任何时候可靠运行。

在正常运行过程中,初始化只进行一次。前端负责不断地提取特征点发给后端;后端负责IMU数据采集,预积分和优化/滑窗等操作。前端和后端在运行过程中不断地循环。

或者:
VINS-MONO概述_第2张图片这个系统包括以下几个过程:特征提取与发布;IMU提取与预积分;初始化;滑窗与优化;回环检测。

代码主要包括3个node:feature_tracker,vins_estimator,pose_graph,其中feature_tracker仅负责特征点提取和发布,pose_graph关键帧的选择/位姿图建立/回环检测,而vins_estimator的内容最多了,包含了初始化,滑窗,优化等后端内容和IMU预积分等前端内容,并且在这个结点里分出了2个线程。

一般来讲,一个标准的SLAM系统是前后端分离的,如下图所示,
VINS-MONO概述_第3张图片而VINS-MONO系统,他的前端仅包括光流计算;初始化等工作都放在vins_estimator里面了。
我的理解它之所以这么做,是因为IMU的数据获取如果放在前端,预积分完了之后还需要advertise到ROS系统里,让后端接收,与其这样,还不如让后端直接接收IMU数据就在后端处理了,减少通信过程。

VINS节点通信过程如下图所示,‘
rqt_graph
node only
VINS-MONO概述_第4张图片更具体一些如下,
node all:
VINS-MONO概述_第5张图片代码的文件目录

代码的文件目录
1、ar_demo:一个ar应用demo
2、benchmark_publisher:接收并发布数据集的基准值
3、camera_model
   calib:相机参数标定
   camera_models:各种相机模型类
   chessboard:检测棋盘格
   gpl
   sparse_graph
   intrinsic_calib.cc:相机标定模块main函数
4、config:系统配置文件存放处
5、feature_trackers:
   feature_tracker_node.cpp ROS 节点函数,回调函数
   feature_tracker.cpp 图像特征光流跟踪
6、pose_graph:
   keyframe.cpp 关键帧选取、描述子计算与匹配
   pose_graph.cpp 位姿图的建立与图优化
   pose_graph_node.cpp ROS 节点函数,回调函数,主线程
7、support_files:帮助文档、Bow字典、Brief模板文件
8、vins_estimator
   factor:实现IMU、camera等残差模型
   initial:系统初始化,外参标定,SFM
   utility:相机可视化,四元数等数据转换
   estimator.cpp:紧耦合的VIO状态估计器实现
   estimator_node.cpp:ROS 节点函数,回调函数,主线程
   feature_manager.cpp:特征点管理,三角化,关键帧等
   parameters.cpp:读取参数

接下来为论文中的符号与坐标系定义:

  • w是世界坐标系(world frame)。重力方向与世界坐标系z轴对齐。
  • b是本体坐标系(body frame),我们把它定义为与IMU坐标系相同。
  • c是相机坐标系(camera frame)。我们同时使用旋转矩阵R和Hamilton四元数q来表示旋转。我们主要在状态向量中使用四元数,也用旋转矩阵来表示三维向量的旋转。
  • ck​表示获取第k个图像时的相机坐标系。⊗表示两个四元数之间的乘法运算。gw是世界坐标系上的重力向量。最后,我们将(^)表示为某一具体量的噪声测量值或估计值。

更多可见VINS-Mono 论文解读

你可能感兴趣的:(SLAM,VINS-MONO,slam,自动驾驶)