SLAM代码(ORB-SLAM阅读2)

本文详细解析ORB-SLAM的main procedure,包括processNewKeyFrame、CreateNewMapPoints、SearchInNeighbors和KeyFrameCulling等步骤。重点讨论了关键帧创建、点云三角化、匹配优化及冗余关键帧剔除,旨在提高SLAM系统的精度和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

main procedure

  1. processNewKeyFrame
  2. mappoint culling
  3. create new key frame
  4. check new key frame
  5. SearchInNeighbors
  6. Optimization BA
  7. key frame culling
  8. insert new key frame

这里写图片描述

  1. 为什么是这样的步骤,为什么只要这几个步骤,为什么是这样的顺序?
  2. 这样做的目的是什么?

主要目的是BA,BA的对象就是key frame,那么BA之前有一些key frame的准备工作。由于BA进行的师爹待优化工作,所以在这之前应该准备尽量多的点(关键帧)进行优化,网络关系可以比较复杂。这样有利于最终的结果的精确度。经过BA之后,那没有会找到那些Outliers,可以把他们删掉。
另外要给目的是得到比较精确的路标点,经过几个回合的优化之后路标点的就比较固定了。那时候把位姿轨迹拿出来专门做优化那样叫做Essential Graph。因为在局部BA中位姿的数量其实比较少,大部分数据是点,那么这时候使用系数特别重要,因为这样可以大大计算量。

processNewKeyFrame

  1. 从缓冲队列中取出一帧关键帧 Tracking线程向LocalMapping中插入关键帧存在该队列中
  2. 计算该关键帧特征点的Bow映射关系 Compute Bags of Words structures
  3. 跟踪局部地图过程中新匹配上的MapPoints和当前关键帧绑定 在TrackLocalMap函数中将局部地图中的MapPoints与当前帧进行了匹配,但没有对这些匹配上的MapPoints与当前帧进行关联 Associate MapPoints to the new keyframe and update normal and descriptor)
  4. 更新关键帧间的连接关系,Covisibility图和Essential图(tree) Update links in the Covisibility Graph
  5. 将该关键帧插入到地图中 Insert Keyframe in Map

CreateNewMapPoints

相机运动过程中和共视程度比较高的关键帧通过三角化恢复出一些MapPoints

  1. 在当前关键帧的共视关键帧中找到共视程度最高的nn帧相邻帧vpNeighKFs
    Search matches with epipolar restriction and triangulate
  2. 遍历相邻关键帧vpNeighKFs
  3. 判断相机运动的基线是不是足够长 Compute Fundamental Matrix
  4. 根据两个关键帧的位姿计算它们之间的基本矩阵Search matches that fullfil epipolar constraint
  5. 通过极线约束限制匹配时的搜索范围,进行特征点匹配Triangulate each match
  6. 对每对匹配通过三角化生成3D点,he Triangulate函数差不多
    6.1. 取出匹配特征点Check parallax between rays
    6.2. 利用匹配点反投影得到视差角
    特征点反投影
    6.3. 对于双目,利用双目得到视差角
    6.4. 三角化恢复3D点
    heck triangulation in front of cameras
    6.5. 检测生成的3D点是否在相机前方
    heck reprojection error in first keyframe
    6.6. 计算3D点在当前关键帧下的重投影误差heck scale consistency
    6.7. 检查尺度连续性Triangulation is succesfull
    6.8. 三角化生成3D点成功,构造成MapPoint
    6.9. 为该MapPoint添加属性.
    a.观测到该MapPoint的关键帧
    b.该MapPoint的描述子
    c.该MapPoint的平均观测方向和深度范围步骤6.8. 将新产生的点放入检测队列
    这些MapPoints都会经过MapPointCulling函数的检验

该步骤中找到当前关键帧的相邻帧,计算相邻帧之间的基础矩阵。通过极线匹配限制搜索范围。通过匹配所得的的对应点三角测量。那么也就没有对应点,没有运动信息,那么只能靠极线约束缩小搜索范围。

SearchInNeighbors

检查并融合当前关键帧与相邻帧(两级相邻)重复的MapPoints
1. 获得当前关键帧在covisibility图中权重排名前n的邻接关键帧找到当前帧一级相邻与二级相邻关键帧
2. 将当前帧的MapPoints分别与一级二级相邻帧(的MapPoints)进行融合
3. 将一级二级相邻帧的MapPoints分别与当前帧(的MapPoints)进行融合遍历每一个一级邻接和二级邻接关键帧
4. 更新当前帧MapPoints的描述子,深度,观测主方向等属性
根据map points寻找更多的具备共视关系的关键帧。

KeyFrameCulling

  1. 根据Covisibility Graph提取当前帧的共视关键帧
  2. 提取每个共视关键帧的MapPoints
  3. 遍历该局部关键帧的MapPoints,判断是否90%以上的MapPoints能被其它关键帧(至少3个)观测到
  4. 该局部关键帧90%以上的MapPoints能被其它关键帧(至少3个)观测到,则认为是冗余关键帧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值