SLAM代码(ORB-SLAM阅读)
主要步骤

1. 为什么是这样的步骤,为什么只要这几个步骤,为什么是这样的顺序?
2. 这样做的目的是什么?
步骤1.1
ORB的跟踪器使用一个运动模型,在每次完成位姿计算之后会跟新这个运动模型,根据匀速度模型进行对上一帧的MapPoints进行跟踪,根据上一帧特征点对应的3D点投影的位置缩小特征点匹配范围。这里意思是说我们假设相机是匀速运动的,然后根据上一帧的位姿,我么预测到这一帧对应的位姿,然后使用这个位姿计算路标点在当前帧的投影,这样我们对于特征点的大致范围就知道,这样会大大减小计算量。 在文章中写道如果找不多足够的点,那么会设定一个更宽的范围进行寻找。在使用PnP计算完位姿之后,然后可以剔除那些Outliers。如果恒速模型是空的或者刚完成重定位,这时候选择上一帧的位姿作为当前帧的初始位置,通过BOW的方式在参考帧中找到当前特征点的匹配点,方法仍然PnP。为一个不同点就是匹配的对象不同。
在ORB在跟踪的时候中存在两种模式一种是VO,这种模式下建图是同时进行的,另外一个模式是只跟踪,那么这种状态下建图就停止了。另种状态下的内容差不多,主要是只跟踪状态下位姿的来源有两个一个是来自运动模型的,一个是来自重定位的,如果重定位成功了那么我们就使用重定位的我位姿,如果不成功那么我们就使用VO的。所以该种模式下重定位每一帧都会跑。
步骤1.2
那么优化完了,我们可以得到测量数据了,但是为了完成下一次的跟踪,我们还有一些工作要做。
1. update Local KeyFrame
2. update Local Points
3. SearchLocalPoints
4. Pose Optimization
为什么?我们先看他到底做了哪些事就是他的目的是什么。在更新KeyFrame中增加了路标点对当前关键帧的索引。
我们是通过的正匹配找到的这些路标点,然后还没有整理好这些路标点和当前关键帧的索引关系,不然后就没法使用这个帧进行下一帧的匹配了(第三步,),因为我们通过参考关键帧找到匹配的路标点。在帧间匹配得到初始的姿态后,现在对local map进行跟踪得到更多的匹配,这个过程,并优化当前位姿local map:当前帧、当前帧的MapPoints、当前关键帧与其它关键帧共视关系。在步骤1.1中主要是两两跟踪(恒速模型跟踪上一帧、跟踪参考帧),这里搜索局部关键帧后搜集所有局部MapPoints,然后将局部MapPoints和当前帧进行投影匹配,得到更多匹配的MapPoints后进行Pose优化。
如何找到跟多的匹配呢?
- 遍历当前帧的mvpMapPoints,标记这些MapPoints不参与之后的搜索,因为当前的mvpMapPoints一定在当前帧的视野中
- 将所有局部MapPoints投影到当前帧,判断是否在视野范围内,然后进行投影匹配
- 如何找到更多的路标点呢?这里通过已有的路标点,找到那些看到这些路标点的关键帧,分两步完成,首先去统计,统计完了然后逐个添加到一个容器,然后遍历这个容器里的每一帧找到预支有共视关系以其他本身的添加局部关键帧,添加该镇的子关键帧和父关键帧。
- 这些路标点可以大致分为两类,一类是当前帧和参考关键帧共有的,另外一些通过其他帧添加进来的,后边添加进来的路标点可以用来优化位姿。
