几个重要的对象
estimator
VINS Mono的主要功能被封装成了一个类Estimator
,在vins_estimator_node中,通过创建一个Estimator
的实例estimator
来实现功能。我把estimator称作VINS系统,VINS系统有两种状态:
|
|
f_manager
与滑动窗口中特征点相关的操作,被封装为了一个类FeatureManager
。在estimator对象内部创建了一个FeatureManager
的实例f_manager,作为estimator的成员变量,它负责完成滑动窗口中的特征点管理,三角化,以及关键帧相关的操作。
初始化概述
当Estimator::processImage()
接收到图像特征点数据后:
先调用
FeatureManager::addFeatureCheckParallax()
函数,把图像特征点数据存入FeatureManager
对象,并判断是否把滑动窗口中的第二最新帧选为关键帧,然后选择滑动窗口时的边缘化策略marginalization_flag
(MARGIN_OLD
orMARGIN_SECOND_NEW
)。然后检查相机与IMU的外参是否已经标定,如果未标定,则进行在线标定(在线标定有失败的可能性)。
接着再去检查VINS系统的状态,当VINS系统第一次启动,以及VINS系统重启的时候,会处于
INITIAL
状态。当VINS系统处于INITIAL
状态时,会存在两种情况,一是滑动窗口中图像特征点数据的帧数(当前读入的帧也计算在内)没有达到滑动窗口大小WINDOW_SIZE
,另一种情况是滑动窗口已经满了。
滑动窗口未塞满
由于图像特征点数据是一帧一帧的塞到滑动窗口中的,所以在VINS系统刚刚启动或者刚刚重启的时候,滑动窗口会没有塞满,此时不进行初始化操作,而且每来一帧图像特征点数据,都会塞到滑动窗口中,直到数量达到WINDOW_SIZE
。(代码中窗口大小实际上是WINDOW_SIZE + 1
,不过问题不大)
滑动窗口已塞满
当滑动窗口塞满后,先检查相机与IMU的外参是否已经标定,以及离上次初始化操作的时间间隔是否大于一个阈值(比如代码中的0.1s)。如果外参已经标定,且时间间隔大于阈值,才进行初始化操作,否则不进行初始化。初始化操作由Estimator::initialStructure()
完成。
在滑动窗口已塞满的情况下,如果由于不满足条件而未进行初始化操作,或者初始化操作失败,则会根据marginalization_flag
对窗口进行滑动操作Estimator::slideWindow()
。