ORB-SLAM2的三大线程几乎都是每个部分对应一个函数,非常清晰。函数名起的都十分贴切,望文就能生义,我们更应该关注的是里面的关键帧地图点这些变量是怎么流转的。
Tracking线程的流程就是:首先输入一帧图像,然后实际上接着进行5步。初始化(实际上相机刚开始需要初始化过程)、图像预处理(提取ORB特征点)、初始位姿估计(根据前一张图片或者附近的一张图片估计当前帧的位姿)、基于当前帧的位姿构建当前帧的局部地图(当前帧附近的很小的一部分地图)、是否生成新的关键帧
PS:通过追踪局部帧的地图而建图,实际上后面有专门负责建设局部地图的线程,所以这里的局部地图并没有用来建图,只是用来优化当前帧的位姿
一、跟踪线程各成员函数/变量
1、跟踪状态
(1)枚举类型eTrackingState
Tracking类中定义枚举类型eTrackingState,表示跟踪状态,系统创建时设值SYSTEM_NOT_READY
,加载好后设值NO_IMAGES_YET
,对于单目视觉至少有两帧图像才能成功,对于双目视觉需要一帧图像就鞥初始化成功,如果一帧图像的特征点过少也不能初始化成功
值 | 意义 |
---|---|
SYSTEM_NOT_READY | 系统没有准备好,一般就是在启动后加载配置文件和词典文件时候的状态 |
NO_IMAGES_YET | 还没有接收到输入图像 |
NOT_INITIALIZED | 接收到图像但未初始化成功 |
OK | 跟踪成功 |
LOST | 跟踪失败 |
(2)Tracking类的成员变量
Tracking类的成员变量mState
和mLastProcessedState
分别表示当前帧的跟踪状态和上一帧的跟踪状态
成员变量 | 访问控制 | 意义 |
---|---|---|
eTrackingState mState | public | 当前帧mCurrentFrame的跟踪状态 |
eTrackingState mLastProcessedState | public | 前一帧mLastFrame的跟踪状态 |
(3)跟踪状态流程
2、初始化
初始化部分只在系统开始的几帧有,初始化分为:单目初始化、双目初始化。
单目初始化帧initializer比较复杂,需要两帧之间匹配,双目初始化和RGBD初始化就没那么复杂了,实际上双目初始化和RGBD初始化都只需要一个条件:只要左目图像能找到超过500个特征点那就算双目初始化成功
双目相机和RGBD相机的输入经过预处理提取特征点,是以同样的方式进行处理的
成员函数/变量 | 访问控制 | 意义 |
---|---|---|
Frame mCurrentFrame | public | 当前帧 |
KeyFrame* mpReferenceKF | protected | 参考关键帧 初始化成功的帧会被设为参考关键帧 |
std::vector<KeyFrame*> mvpLocalKeyFrames | protected | 局部关键帧列表,初始化成功后向其中添加局部关键帧 |
std::vector<MapPoint*> mvpLocalMapPoints | protected | 局部地图点列表,初始化成功后向其中添加局部地图点 |
此博客参考ncepu_Chen的《5小时让你假装大概看懂ORB-SLAM2源码》