详谈ORB-SLAM2的跟踪线程Tracking

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类的成员变量mStatemLastProcessedState分别表示当前帧的跟踪状态和上一帧的跟踪状态

成员变量访问控制意义
eTrackingState mStatepublic当前帧mCurrentFrame的跟踪状态
eTrackingState mLastProcessedStatepublic前一帧mLastFrame的跟踪状态
(3)跟踪状态流程

在这里插入图片描述

2、初始化

在这里插入图片描述
初始化部分只在系统开始的几帧有,初始化分为:单目初始化、双目初始化。

单目初始化帧initializer比较复杂,需要两帧之间匹配,双目初始化和RGBD初始化就没那么复杂了,实际上双目初始化和RGBD初始化都只需要一个条件:只要左目图像能找到超过500个特征点那就算双目初始化成功

双目相机和RGBD相机的输入经过预处理提取特征点,是以同样的方式进行处理的

成员函数/变量访问控制意义
Frame mCurrentFramepublic当前帧
KeyFrame* mpReferenceKFprotected参考关键帧
初始化成功的帧会被设为参考关键帧
std::vector<KeyFrame*> mvpLocalKeyFramesprotected局部关键帧列表,初始化成功后向其中添加局部关键帧
std::vector<MapPoint*> mvpLocalMapPointsprotected局部地图点列表,初始化成功后向其中添加局部地图点

此博客参考ncepu_Chen的《5小时让你假装大概看懂ORB-SLAM2源码》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客范儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值