概述
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.四自由度位姿图优化
原论文:
- 系统从测量预处理(IV)开始,在其中提取和跟踪特征,对两个连续帧间的IMU测量值进行预积分。
- 初始化过程(V)提供了所有必要的值,包括姿态、速度、重力向量、陀螺仪偏置和三维特征位置,用于引导随后的基于非线性优化的VIO。
- VIO(VI)与重定位(VII)模块紧密地融合了预先积分的IMU测量、特征观测和回环重新检测到的特征。最后,位姿图优化模块(VIII)接受几何验证的重定位结果,并进行全局优化以消除漂移。
- VIO、重新定位和位姿图优化模块在多线程设置中同时运行。每个模块有不同的运行速度和实时保证,以确保在任何时候可靠运行。
在正常运行过程中,初始化只进行一次。前端负责不断地提取特征点发给后端;后端负责IMU数据采集,预积分和优化/滑窗等操作。前端和后端在运行过程中不断地循环。
或者:
这个系统包括以下几个过程:特征提取与发布;IMU提取与预积分;初始化;滑窗与优化;回环检测。
代码主要包括3个node:feature_tracker,vins_estimator,pose_graph,其中feature_tracker仅负责特征点提取和发布,pose_graph关键帧的选择/位姿图建立/回环检测,而vins_estimator的内容最多了,包含了初始化,滑窗,优化等后端内容和IMU预积分等前端内容,并且在这个结点里分出了2个线程。
一般来讲,一个标准的SLAM系统是前后端分离的,如下图所示,
而VINS-MONO系统,他的前端仅包括光流计算;初始化等工作都放在vins_estimator里面了。
我的理解它之所以这么做,是因为IMU的数据获取如果放在前端,预积分完了之后还需要advertise到ROS系统里,让后端接收,与其这样,还不如让后端直接接收IMU数据就在后端处理了,减少通信过程。
VINS节点通信过程如下图所示,‘
rqt_graph
node only
更具体一些如下,
node all:
代码的文件目录
代码的文件目录
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 论文解读
最后
以上就是忧郁小天鹅为你收集整理的VINS-MONO概述的全部内容,希望文章能够帮你解决VINS-MONO概述所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复