ORB-SLAM策略思考之LocalMapping线程
1 插入关键帧
- 在局部建图线程中做了关键帧队列,防止来自跟踪线程的插入关键帧丢失
- 跟踪线程中,没有做匹配地图点到插入关键帧之间的观测信息,因此需要更新相对地图点的深度信息,描述子信息和视角方向信息
- 需要对插入关键帧更新共视信息,维护共视图
- 跟踪线程中,没有新生成地图点信息,但是新生成了的关键帧信息,因此这里需要将关键帧添加到地图中去
2 最近添加的地图点删除
- 删除的地图点针对的是当前帧之前,由局部建图线程创建的地图点指针,目的是为了提前删除和当前关键帧不相关的地图点,从而执行局部BA,并不一定是删除地图中对应的地图点(策略是先删除之后再创建)
- 满足如下一个条件,就需要删除地图点
- 地图点是坏点,或者说是标记为要被删除的点
- 地图点在跟踪线程起到的作用较小,表现在地图点被匹配的数目和地图点被观测数目的比例上(在全局地图中删掉)
- 删除关键帧匹配很少的关键帧,但值得注意的是,由于后续会创建新的地图点,因此为了防止删除上次刚刚创建的地图点,这里还要避免删除前两次新增的地图点(在全局地图中删除)
- 删除距离当前关键帧较远的创建的地图点(不在全局地图中删除)
3 新地图点创建
- 新地图点创建的是与当前关键帧可以产生匹配的地图点,目的同样是为了之后的局部BA
- 使用最优一阶相连关键帧和当前关键帧,使用基础矩阵进行三角化匹配新增匹配特征点
- 三角化匹配会跳过已经两关键帧中已经存在的匹配地图点信息
- 三角化匹配是根据词袋特征匹配实现的
- 三角化新产生的匹配点对,并对三角化的点进行筛选,筛选条件如下:
- 两个相机坐标系下的正深度
- 两个像素坐标下的去畸变投影区域限制
- 根据深度和经验检查尺度一致性(1.5*金字塔缩放因子比例)
- 对三角化成功的点,添加到全局地图中去
4 地图点融合
- 正向融合,对与当前帧一阶相连和二阶相连的关键帧中的匹配信息进行修正
- 融合的地图点为当前关键帧中匹配的地图点
- 融合的对象为与当前关键帧产生一阶相连和二阶相连的关键帧
- 反向融合,对当前帧中的匹配信息进行修正
- 融合的地图点为一阶相连和二阶相连的关键帧匹配的地图点
- 融合的对象为当前关键帧
- 融合策略
- 将融合的地图点投影到融合对象的相机和像素坐标系中,能产生下一步融合的地图点要求:
- 在相机坐标系下产生了正深度
- 在去畸变的像素坐标范围内
- 深度必须在地图点的最大和最小深度范围内
- 视角必须小于60°
- 使用地图点的金字塔层级预测和半径确定能匹配的候选特征点的索引
- 根据阈值策略获取最优的匹配
- 如果存在匹配,就进行替换,若不存在建立地图点和关键帧之间的连接
- 将融合的地图点投影到融合对象的相机和像素坐标系中,能产生下一步融合的地图点要求:
- 值得注意的是,在融合策略中,可能发生改变的地图点都放在了当前关键帧的匹配地图点中,但是关键帧之间的共视信息不仅仅发生在了当前关键帧上,还发生在了与其一阶相连和二阶相连关键帧上,但是值得注意的是ORB源码只对当前关键帧进行了共视信息更新
- 最后将当前关键帧的匹配地图点进行属性更新
5 局部BA
- 构建局部关键帧和局部地图点
- 局部关键帧是与当前帧一级相连的关键帧
- 局部地图点是由局部关键帧中可用地图点组成
- 采取优化部分关键帧的策略执行局部BA
- 取出局部地图点中的所有观测
- 不是局部关键帧中的局部地图点可见关键帧信息提供约束,其位姿为固定,不进行优化
- 提供强制停止的标识信息,当跟踪线程发现很长时间局部建图线程没有接收关键帧时,会给局部建图线程发送局部BA停止指令,从而快速处理局部建图线程中的待处理关键帧
6 局部关键帧删除
- 该过程是针对与当前关键帧产生共视的关键帧,这里把他们记为局部关键帧,如果满足如下条件,则进行删除
- 如果局部关键帧中的匹配地图点90%都可以在其他关键帧中观测到
- 并且观测到该地图点对应的特征点所在的金字塔层级要低于该局部关键帧(源码中写的是低于局部关键帧金字塔层级+1)
- 并且满足2中的条件的关键帧超过一定个数
- 那么,ORB-SLAM认为该局部关键帧是冗余的,可被删除的关键帧
- 值得注意的是,局部关键帧的删除并不是任意的,这里会与回环闭合线程产生数据交互
- 当所删除的关键帧,正在参与回环闭合时,该关键帧会被赋予不被删除的权限,但是也会进行标记
- 在回环闭合后,同样会将该关键帧进行删除