1.概述
tracking
线程是ORBSLAM系列的三大核心线程之一,主要做的事是接收一张图像帧和一组IMU数据,计算相机在相邻图像帧之间的运动和当前时刻位姿,并根据需要创建关键帧。根据模块的功能不同,tracking
线程主要包含:纯视觉初始化,跟踪运动模型,跟踪参考关键帧,跟踪局部地图,重定位和创建关键帧
-
纯视觉初始化
纯视觉初始化主要是根据特征点得到3D空间点,并初始化一个地图。双目初始化比较简单,可以直接得到3D空间点坐标,单目初始化需要先计算基础矩阵和单应矩阵恢复两帧之间的相机运动,然后恢复出不带尺度信息的3D空间点,初始化地图。 -
跟踪模块
跟踪线程中的跟踪主要经过两阶段跟踪才会得到最终精确的位姿:帧间跟踪和局部地图跟踪,每个阶段的跟踪都伴随优化。
帧间跟踪分为跟踪运动模型和跟踪参考关键帧,运动模型假设帧间的运动相同来获取优化的初始位姿以加快优化的迭代,跟踪参考关键帧则是基于常规的特征匹配进行了,但也会使用BOW词袋搜索加速匹配 -
跟踪局部地图
将局部地图中的3D地图点根据第一阶段计算得到的位姿,重新投影到当前的图像帧,然后计算一个重投影误差,通过优化重投影误差获取当前帧的精确位姿 -
重定位模块
在当前已经创建的所有关键帧数据库中,基于BOW词袋向量搜索快速给当前帧找一个参考关键帧,然后再进行更加细致的匹配和优化 -
关键帧创建模块
ORBSLAM3基于当前系统的跟踪质量和关键帧创建间隔将图像帧封装成关键帧,并传递给局部建图线程,在局部建图线程处理完关键帧后再关键帧传递给回环检测线程。 -
纯定位模式
同时tracking
线程支持一个纯定位模式,该模式不创建关键帧,主要依托跟踪运动模型和重定位实现定位功能,纯定位模式最好在存在先验地图的前提下运行,但根据测试结果面对比较恶劣的环境即使有先验地图纯定位模式会出现较大的定位误差,虽然后面有可能依靠重定位找回,但是环境恶劣那段的定位信息基本是不可用的。
如下图所示是纯定位模式和SLAM模式下的一段轨迹对比,当车辆运行到曝光比较强烈的环境中时,先验地图中的数据不足以提供较好的匹配数据,导致运动轨迹出现较大波动,后面经过转弯时轨迹甚至出现了跳变现象,而在SLAM模式下当出现这种情况时会创建新的关键帧来保证稳定跟踪的进行。
另外,基于EuroC的双目数据集测试,在纯定位情况下跟踪速度和SLAM模式下其实相差不多。因为正常情况下ORBSLAM的计算开销主要集中在特征提取、描述子计算模块,实际上跟踪花费的时间比较少,因此显得纯定位模式有些鸡肋,需要在其他的方面再继续优化。
Tracking线层流程图如下:
2.功能函数入口
SLAM系统由ROS节点创建,经过时间戳同步后送给System成员函数,然后在System中调用Tracking线程函数跟踪一帧数据并返回位姿,数据流动过程大致如下:
以双目模式为例,Tracking的跟踪函数入口为GrabImageStereo(...)
,在该函数中将原始图像数据转换成灰度图像,根据传感器类型构造一个Frame类,Frame是ORBSLAM的基本单元,详细内容见博客:
《2.4ORB-SLAM3之Frame构造简介》