天天看点

ORB-SLAM学习(1)—— Tracking线程

ORB-Slam的线程启动写在System类的构造函数,Tracking,LocalMapping和LoopClosing三个线程在System函数中启动,其中Tracking运行在主线程中。线程启动后,ORBSlam2再通过调用TrackMonocular(im,tframe)将图像传给Tracking线程,而TrackMonocular函数中调用了Tracking类的GrabImageMonocular(im,timestamp),才真正进入Tracking的图像处理过程。

代码架构

ORB-SLAM学习(1)—— Tracking线程

Tracking线程函数主要功能和流程

orb-slam做匹配的过程用的都ORB特征描述子。先在8层图像金字塔中,提取FAST特征点。提取特征点的个数根据图像分辨率不同而不同,高分辨率的图像提取更多的角点。然后对检测到的特征点用ORB来描述,用于之后的匹配和识别。跟踪这部分主要用了几种模型:运动模型(Tracking with motion model)、关键帧(Tracking with reference keyframe)和重定位(Relocalization)。

运动模式 TrackWithMotionModel

ORB-SLAM学习(1)—— Tracking线程
  1. 先通过上一帧的位姿和速度预测当前帧相机的位姿。
  2. 通过PnP方法估计相机位姿,在将上一帧的地图点投影到当前固定大小范围的帧平面上,如果匹配点少,那么扩大两倍的采点范围,只有在匹配点大于20个的时候,才算是匹配成功。
  3. 然后进行一次BA算法,通过最小二乘法优化相机的位姿。
  4. 优化位姿之后,对当前帧的关键点和地图点,抛弃无用的杂点,剩下的点供下一次操作使用。

关键帧模式 TrackReferenceKeyFrame

ORB-SLAM学习(1)—— Tracking线程
  1. 首先求解当前帧的BOW向量。
  2. 再搜索当前帧和关键帧之间的关键点匹配关系,如果这个匹配关系小于15对的话,就Track失败了。
  3. 接着将当前帧的位置假定到上一帧的位置那里,并通过最小二乘法优化相机的位姿。
  4. 最后依然是抛弃无用的杂点,当match数大于等于10的时候,返回true成功。

全局重定位 Relocalization

ORB-SLAM学习(1)—— Tracking线程

假如使用上面的方法,当前帧与最近邻关键帧的匹配也失败了,那么意味着需要重新定位才能继续跟踪。此时,只有去和所有关键帧匹配,看能否找到合适的位置。

  1. 首先,计算当前帧的BOW向量,在关键帧词典数据库中选取若干关键帧作为候选。
  2. 其次,寻找有足够多的特征点匹配的关键帧;最后,利用RANSAC迭代,然后使用PnP算法求解位姿。

局部地图跟踪 TrackLocalMap

在估计好相机位姿和地图点位姿之后,需要跟踪局部地图,这个过程相当于是通过投影方法,从刚才生成的地图点MapPoint中找到更多的匹配关系,来精确我们的估计结果。前面的几种跟踪方式,是帧与帧之间的联系,这里我们进行局部地图的跟踪,也就是通过更多的3D-2D的匹配对来对位姿进行约束,跟踪这个局部地图之前,我们先构建这个局部地图,也就是局部keyframe和局部mappoint.

-Covisibility Graph-局部关键帧也就是当前帧拥有共同Map Point的关键帧,及这些关键帧在Covisibility Graph(共同map point数大于10)

-局部map point也就是局部关键帧对应的map point

  1. 更新Covisibility Graph, 更新局部关键帧
  2. 根据局部关键帧,更新局部地图点,接下来运行过滤函数 isInFrustum
  3. 将地图点投影到当前帧上,超出图像范围的舍弃
  4. 当前视线方向v和地图点云平均视线方向n, 舍弃n*v<cos(60)的点云
  5. 舍弃地图点到相机中心距离不在一定阈值内的点
  6. 计算图像的尺度因子 isInFrustum 函数结束
  7. 进行非线性最小二乘优化8. 更新地图点的统计量

跟踪确定关键帧 NeedNewKeyFrame

  1. 在上一次进行重定位之后,过了20帧数据,或关键帧数小于20个,不满足不能生成
  2. 在上一个关键帧插入之后,过了20帧,或 局部建图是空闲状态。
  3. 当前帧跟踪到大于若干个点
  4. 当前帧的跟踪点数小于90%的参考关键帧跟踪点数,并且当前帧跟踪点数大于15

参考博文

https://blog.csdn.net/chishuideyu/article/details/75560999

https://blog.csdn.net/chishuideyu/article/details/75314896

https://blog.csdn.net/qq_30356613/article/details/80586872

https://blog.csdn.net/u010128736/article/details/53339311

继续阅读