几个重要的对象

estimator

VINS Mono的主要功能被封装成了一个类Estimator,在vins_estimator_node中,通过创建一个Estimator的实例estimator来实现功能。我把estimator称作VINS系统,VINS系统有两种状态:

1
2
3
4
5
6
enum SolverFlag
{
    INITIAL, // 还未成功初始化
    NON_LINEAR // 已成功初始化,正处于紧耦合优化状态
};

f_manager

与滑动窗口中特征点相关的操作,被封装为了一个类FeatureManager。在estimator对象内部创建了一个FeatureManager的实例f_manager,作为estimator的成员变量,它负责完成滑动窗口中的特征点管理,三角化,以及关键帧相关的操作。

初始化概述

Estimator::processImage()接收到图像特征点数据后:

  1. 先调用FeatureManager::addFeatureCheckParallax()函数,把图像特征点数据存入FeatureManager对象,并判断是否把滑动窗口中的第二最新帧选为关键帧,然后选择滑动窗口时的边缘化策略marginalization_flag(MARGIN_OLD or MARGIN_SECOND_NEW)。

  2. 然后检查相机与IMU的外参是否已经标定,如果未标定,则进行在线标定(在线标定有失败的可能性)。

  3. 接着再去检查VINS系统的状态,当VINS系统第一次启动,以及VINS系统重启的时候,会处于INITIAL状态。当VINS系统处于INITIAL状态时,会存在两种情况,一是滑动窗口中图像特征点数据的帧数(当前读入的帧也计算在内)没有达到滑动窗口大小WINDOW_SIZE,另一种情况是滑动窗口已经满了。

滑动窗口未塞满

由于图像特征点数据是一帧一帧的塞到滑动窗口中的,所以在VINS系统刚刚启动或者刚刚重启的时候,滑动窗口会没有塞满,此时不进行初始化操作,而且每来一帧图像特征点数据,都会塞到滑动窗口中,直到数量达到WINDOW_SIZE。(代码中窗口大小实际上是WINDOW_SIZE + 1,不过问题不大)

滑动窗口已塞满

当滑动窗口塞满后,先检查相机与IMU的外参是否已经标定,以及离上次初始化操作的时间间隔是否大于一个阈值(比如代码中的0.1s)。如果外参已经标定,且时间间隔大于阈值,才进行初始化操作,否则不进行初始化。初始化操作由Estimator::initialStructure()完成。

在滑动窗口已塞满的情况下,如果由于不满足条件而未进行初始化操作,或者初始化操作失败,则会根据marginalization_flag对窗口进行滑动操作Estimator::slideWindow()