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_modelcalib:相机参数标定camera_models:各种相机模型类chessboard:检测棋盘格gplsparse_graphintrinsic_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_estimatorfactor:实现IMU、camera等残差模型initial:系统初始化,外参标定,SFMutility:相机可视化,四元数等数据转换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概述相关推荐

  1. m2dgr数据集在vins mono运行

    m2dgr数据集在vins mono运行 1.代码的修改 1.1 yaml文件的修改 1.2修改VINS-mono轨迹保存代码 1.3修改launch文件 2 EVO显示轨迹 2.1运行比较结果 参考 ...

  2. SLAM之小觅相机跑开源方案(ORB_SLAM2,VINS MONO,VINS FUSION,RTAB-Map)

    传感器: 小觅相机标准版 开源SLAM方案: ORB_SLAM2,VINS MONO,VINS FUSION,RTAB-Map 测试地点: 室内大厅(光线不均)/ 露天阳台 实现形式: 小觅相机 / ...

  3. 的环境下 qt 运行在_Ubuntu16.04环境下运行vins mono(环境配置及编译)之ROS kinetic的安装...

    所需环境:ubuntu16.04+ROS kinetic+opencv 3.3.1+eigen3.3.3+ceres solver 1.14 1.ROS Kinetic 的安装 (1)设置source ...

  4. VINS Fusion GPS融合部分

    概述 VINS Fusion在VINS Mono的基础上,添加了GPS等可以获取全局观测信息的传感器,使得VINS可以利用全局信息消除累计误差,进而减小闭环依赖. 局部传感器(如相机,IMU,激光雷达 ...

  5. vins 解读_代码解读 | VINS 视觉前端

    AI 人工智能 代码解读 | VINS 视觉前端 本文作者是计算机视觉life公众号成员蔡量力,由于格式问题部分内容显示可能有问题,更好的阅读体验,请查看原文链接:代码解读 | VINS 视觉前端 v ...

  6. 国内 Mono 相关文章汇总

    一则新闻<软件服务提供商Xamarin融资1200万美元>,更详细的内容可以看Xamarin的官方博客Xamarin raises $12M to help you make better ...

  7. SLAM的通用框架:GSLAM

    SLAM的通用框架:GSLAM GSLAM: A General SLAM Framework and Benchmark 论文链接: http://openaccess.thecvf.com/con ...

  8. 三维视觉惯性SLAM的有效Schmidt-EKF

    三维视觉惯性SLAM的有效Schmidt-EKF An Efficient Schmidt-EKF for 3D Visual-Inertial SLAM 论文地址: http://openaccess ...

  9. 基于简化点云地图的语义边缘对齐的单目定位方法

    标题:Compact 3D Map-Based Monocular Localization Using Semantic  Edge Alignment 作者:Kejie Qiu, Shenzhou ...

  10. CamVox:一种低成本、高精度的激光雷达辅助视觉SLAM系统

    标题:VCamVox: A Low-cost and Accurate Lidar-assisted Visual SLAM System 作者:Yuewen Zhu, Chunran Zheng, ...

最新文章

  1. c++精确到小数点后两位_高考试卷的小数点是怎么算入总分的?
  2. Azure DevOps 中 Dapr项目自动部署流程实践
  3. controller属于哪一层_别急着换5G,4G手机同样值得考虑!哪几款安卓手机称得上4G机皇?...
  4. java从键盘上录入信息
  5. uitextfield 键盘类型_以编程方式更改UITextField键盘类型
  6. vue-element-admin 设置默认语言
  7. Java API下载和查阅方法
  8. java适配器模式_java设计模式之适配器模式
  9. halcon中的深度学习
  10. 提升 10 倍!阿里云对象存储 OSS 可用性 SLA 技术揭秘
  11. 计算机专业英文面试,计算机专业面试英文自我介绍
  12. Kernel 日志缓存大小修改
  13. 为什么会出现403 Forbidden错误?三分钟教你快速解决问题!
  14. 编写一个触发器:当修改一个学生专业的时候(转专业),则自动将本学期新专业同学全都选修的课程给该同学选修
  15. 解空间树和搜索空间树
  16. 续 winform 打包-集合dotnetfx文件夹到一个exe
  17. 科技热点周刊|Linux 30 周年、Horizon Workroom 发布、Humanoid Robot、元宇宙
  18. 密码极客经济学博士揭秘,2020年哪个区块链项目最值期待?
  19. 【无标题】关于Java——给即将开学的弟弟送上一份礼物
  20. mysql兼容微信表情

热门文章

  1. combo 口切换配置
  2. extjs6 清除grid中combo列的值
  3. 计算机B类会议排名,计算机学科会议排名
  4. 【HenCoder】HTTPS 为什么是安全的
  5. 高效的敏捷测试第四课 测试的团队协作
  6. 知识图谱学习资料汇总
  7. Google着手与 Open AI 合作预防人工智能暴走
  8. logback 多实例 归档问题 无法自动删除.tmp文件问题
  9. 事件起泡 Event bubbling
  10. eclipse中下划线显示不出来问题解决