VINS-Mono 整体框架概述

VINS-Mono,即 Monocular Visual-Inertial SLAM,是港科大沈劭劼老师组开源的系统,主打 单目 + IMU。分别在 Robot 端和 IOS 端均做了实现并开源了出来。本篇为 VINS-Mono 框架的概览。本人才学疏浅,有理解不深和错误的地方,请多多指教!

VINS-Mono 整体框架概述

简介

Related Papers

  • Online Temporal Calibration for Monocular Visual-Inertial Systems, Tong Qin, Shaojie Shen, IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS, 2018), pdf

  • VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator, Tong Qin, Peiliang Li, Zhenfei Yang, Shaojie Shen, IEEE Transactions on Robotics

  • 此外,本文档参考沈劭劼老师于 2017 年 6 月 9 日在泡泡机器人上的公开课课件和视频。

VINS,即 Visual-Inertial System,视觉 - 惯导融合系统。实际中有很多应用场景,如无人机定位、移动端的 AR 应用。一个完善的 VINS 系统,需要有下面三个特性:

  • 物理尺度信息
  • Robust and smooth odometry,即 local accuracy
  • Loop closure,全局一致性 global consistency

VINS 系统相关的工作:

  • MSCKF(2007)

    • Google Tango Project 所用技术
  • okvis(2015)

    • 开源,eth-asl 组的工作
  • Visual-Inertial ORB-SLAM(2017)

  • Apple ARKit

    • 沈老师在报告中提到,在 iPhone 上(vins-mono 也做了 ios 端的实现),Apple ARKit 的近距离表现要比 vins-mono 好,远距离还是可以比一比的
  • Qualcomm Snapdragon 835

VINS-Mono,即 Monocular Visual-Inertial SLAM,是港科大沈劭劼老师组开源的系统,主打 单目 + IMU。分别在 Robot 端和 IOS 端均做了实现并开源了出来。

问题挑战

Monocular Vision 方面

  • 单目不具备物理尺度的观测

  • Up-to-scale SfM

Monocular Visual-Inertial Systems 方面

加上 IMU 后,尺度信息变得可观,但是存在以下问题:

即:

  • 需要知道初始速度与姿态

    • 加速度计测出来的是加速度,做二次积分,积第二次的时候当然是需要知道初速度的
    • 加速度计数据是带有重力加速度的信息。为了避免把重力值积分给积进去,所以相当于是需要知道整个系统的姿态的
  • 相机和 IMU 之间的外参标定,即旋转和平移

    • 沈老师提到在实验中,两者之间的旋转是非常非常重要的,歪一点点系统就崩了,而平移相对没有那么的敏感
  • 为了估计那些估计量,需要整个系统对多个点的多次观测

    • 所以就是需要一套 formulation 来做这个 multi-observation constraints,递推为 SLAM 里的 Graph SLAM formulation

同步与时间戳问题

最理想的当然是第一种。第二种情况的 offset 是可以比较容易标定出来的,第三种是最差的,offset 是一个时变的量。vins-mono 的开源版本代码是直接按照第一种方式来处理的,但是实际表现上在第二种和第三种情况表现也还可以,比如手机上一般就是第二种和第三种情况。

整体框架

主要就是五块东西。代码中主要开启了四个线程:前段图像跟踪、Sliding-window V-I-BA 非线性优化(初始化和 imu 预积分也在这个线程里)、闭环检测和全局的 Pose Graph 的优化。

Measurement Preprocessing

测量值预处理:

  • 对相机图像进行特征点检测和跟踪

  • 与 IMU 进行预积分

Initialization

初始化:

非常非常重要,单目视觉中很多的东西比如 imu 的 bias、尺度等信息都是无法直接观测出来的,都是需要算出来的。整个系统是一个非常非线性化的系统,非线性系统若收敛肯定是要初始值的,特别是这种对状态都无法直接观测的情况下。vins-mono 花了比较大的精力对初始值进行处理。

Local Visual-Inertial Bundle Adjustment with Relocalization

Local Visual-Inertial Bundle Adjustment with Relocalization:

初始化之后,就进入了一个基于非线性优化的,滑动窗口 Visual-Inertial Bundle Adjustment。将视觉约束、IMU 约束和闭环约束放在一个大的目标函数中进行非线性优化,求解滑窗内所有帧的 PVQ、bias 等。

基于 Graph 的形式给表示出来,并且维护一个滑动窗口来保证算 VI Odometry 时的运算复杂度保持在一个固定的状态下。

绿色的帧就是回环检测的到的,跟当前的滑动窗口里的已知位置的蓝色帧有共同观测,然后就能根据这些已知位置的帧做一个重定位。vins-mono 里的重定位也是一个 紧耦合 的形式,即回环检测的帧和当前的帧之间的位置信息是通过他们互相看到一套同样的特征点的一个互匹配得到的。并且 Relocalization 后,与后面的 Global Pose Graph 在某种程度上也牵扯在一起。

Loop detection

回环检测:

为实现重定位功能,肯定是需要回环检测的。

Global pose graph SLAM

全局 Pose Graph 优化:

后端的一个大规模 Pose Graph 优化,保证全局一致性。

在不断地运行中,会把 keyframe 给保存下来,然后通过不断地回环检测检测到了一些特征点匹配,把这些匹配给通过一个 Pose Graph 的优化把它们的误差给消除掉。也就相当于是前面那个 sliding window 是一直可以基于这个 Pose Graph 做一个重定位的操作的。