SLAM笔记-ORB-SLAM2中几种追踪方式的概述

本文详细介绍了ORB-SLAM系统中的四种跟踪方法:TrackWithMotionModel、TrackReferenceKeyFrame、Relocalization和TrackLocalMap,以及它们在不同场景下的应用和匹配策略。在跟踪过程中,系统会进行位姿初始估计、重定位和精细位姿优化。当跟踪失败时,系统会执行一系列善后工作,包括清除不可见地图点、插入关键帧、删除外点等。此外,还讨论了何时选择关键帧,并给出了插入关键帧的条件。

在Tracking线程中,有几种追踪的方法

跟踪模式应用场景使用频率匹配方法
TrackWithMotionModel()可以利用上一帧求出速度估计出初始位姿时经常使用SearchByProjection()候选点来自GetFeatureInArea(),实现前后帧特征点的匹配。BA优化仅优化位姿
TrackReferenceKeyFrame()没有速度信息/刚完成重定位/恒速模型跟踪失败后较少用到SearchByBow()匹配当前帧和关键帧在同一节点下的特征点,不需要投影,速度快,BA优化仅优化位姿
Relocalization()跟踪丢失时使用很少使用使用了BoW找到与该帧相似的候选关键帧;遍历候选关键帧用SearchByBoW进行快速匹配;匹配点足够时用EPnP计算位姿并取出内点做BA优化来优化位姿;如果优化完内点较少则通过关键帧投影生成新的匹配SearchByProjection(),对匹配结果再做BA优化位姿。
TrackLocalMap()前面三选一之后再用此进行后处理每一次跟踪都使用先找到局部关键帧,取出这些帧中的所有地图点作为局部地图点;使用SearchByProjection()将局部地图点和当前帧特征点进行匹配,对匹配结果做BA优化,仅优化位姿

在完成了上述这些追踪过程之后,还要做一些善后工作:

  • 清除观测不到的地图点;
  • 清除恒速模型跟踪中,UpdateLastFrame()为当前帧添加的临时地图点(双目和RGBD情况)
  • 检测并插入关键帧,对于双目和RGBD还会产生新的地图点
  • 删除在BA中被检测为外点的地图点
  • 如果初始化后不久就跟踪失败(即状态为LOST且前面关键帧个数<=5个),重定位也不起作用,就Reset整个系统
  • 记录位姿结果

粗估计:相机位姿初始值

1.根据上一帧和运动模型估计:

运动模型是匀速运动模型,也就是说,当前帧与上一帧之间的相对位姿变化量 = 上一帧和上上帧之间的相对位姿变化量。通过这个可以估计出当前帧的位姿初始值,根据这个值,把上一帧的MApPoints和当前帧的FeaturePoints匹配,之后根据匹配进行优化(?)。如果匹配的点对太少,就要使用关键帧进行估计了。

2.重定位:

如果上一帧跟踪失败了,也就是说根本就没有上一帧的位姿(此时,匀速运动假设也回天无力),所以就要进行重定位。也就是说,要从关键帧数据库中寻找有没有哪个关键帧和当前帧很相似,有的话可能当前帧就在这个关键帧附近,从而可以定位当前帧。
那么怎么去找到这个关键帧呢?步骤如下:

  • 首先,根据当前帧的特征点计算出对应的词袋模型,
  • 然后把当前帧的词袋模型和数据库中各个关键帧的词袋模型进行匹配,从而筛选出一批候选的关键帧KeyFrameDatabase::DetectRelocalization()
  • 把当前帧的特征点和候选关键帧的MapPoints匹配。
  • 只有在重定位时,才使用了EPnP为了对这些候选关键帧们进一步进行筛选,就要每一个关键帧都用RANSAC迭代计算出一个当前帧的位姿(PnP算法),直到找到一个关键帧和对应位姿,让他和当前帧之间有足够多的inliers。然后再对其进行进一步优化,进行更多的特征点和MapPoints的匹配。如果优化之后的位姿还是很棒(inliers数量多),那么就可以确定当前的位姿了。

精求解当前帧位姿

局部地图跟踪:

Tracking::TrackLocalMap()
已知:前面可以获得的当前帧的位姿初值,当前帧的地图点。 (不那么准确也ok)特征点和MapPoints有了初步的匹配后
思路:利用两级共视关键帧
就会进入这个更精细的求解当前帧位姿的步骤。
步骤如下:

  1. 根据前面的到的当前帧的地图点来找到能观测到当前帧的一级共视关键帧, 并将这些一级共视关键帧的二级共视关键帧,子关键帧,父关键帧一起作为局部关键帧
  2. 取出上述局部关键帧中所有的地图点作为局部地图点(这里更新了局部关键帧和局部地图点)
  3. 在函数Tracking::SearchLocalPoints(),将局部地图点投影到当前帧,去掉不再视野内的无效地图点,用剩下的局部地图点和当前帧的特征点进行匹配,匹配见SearchByProjection()。这里相当于是补充了更多的匹配关系,用之前的地图点和新增的地图点对位姿再次优化。在更新当前帧地图点的被观测程度时,注意:这里被单目观测到一次+1,被双目或者RGBD观测到1次加2。
  4. 对匹配结果进行BA优化,只优化位姿。

局部地图中有:

  • 和当前帧有共视的MapPoints的关键帧
  • 一些特殊的MapPoints,这些地图点可以投影到当前的画幅内,他们的平均可视方向与当前帧的方向夹角不大于60度,他们和当前帧光心的距离在一定范围之内(如果距离太远,ORB特征的尺度不变性在有金字塔的情况下也很难保证,匹配出错的概率大)

在计算得到局部地图的同时,还要尽可能进一步将局部地图的地图点和当前帧未匹配的特征点相匹配,最终对这个局部地图进行BA优化

什么时候把一个帧选为关键帧KF

如果当前帧比较重要,则会将其作为 KF 插入 Map 并送入 LocalMapping 线程。ORB-SLAM 的一个特点就是,其插入 KF 的条件很宽松,所以就可以插入很多 KF,而 ORB-SLAM 会在 LocalMapping 线程中再对冗余的KF进行剔除。目的是:不放过可能有用的帧,增强系统的鲁棒性,以应对纯旋转等很难处理的相机运动。

具体的条件是:

  • 距离上一次重定位已过去了超过20帧
  • LocalMapping 线程正闲置,但如果已经有连续20帧内没有插入过 KF 了,那么 LocalMapping 线程不管忙不忙,都要插入 KF 了
  • 当前帧至少追踪了 50 个点(当前帧质量不能太差)
  • 当前帧追踪的点中不能有90%以上和其 Reference KF 相同(当前帧不能太冗余)
<think>嗯,用户让我介绍一下ORB-SLAM2的学习笔记。我需要先回忆一下ORB-SLAM2的基本框架和核心部分。ORB-SLAM2是一个比较经典的视觉SLAM系统,分为几个主要模块:特征提取、跟踪、局部建图、回环检测和地图管理。首先,我应该从系统架构开始介绍,说明各个模块的作用和相互关系。 接下来,用户可能需要了解ORB特征的相关内容。ORB特征结合了FAST关键点检测和BRIEF描述子,具有旋转不变性和一定的尺度不变性。这部分需要详细解释ORB特征的提取过程,包括如何构建图像金字塔,计算方向,生成描述子等步骤。 然后是跟踪线程,也就是Tracking部分。这里需要说明如何通过帧间匹配、运动模型或重定位来估计相机位姿。可能需要提到初始化的过程,比如使用单应矩阵或基础矩阵来恢复运动,以及如何三角化初始地图点。 局部建图模块负责处理新的关键帧,剔除冗余点,进行局部BA优化。这部分需要解释BA(Bundle Adjustment)的概念,以及如何优化相机位姿和地图点。同时,还要提到关键帧的选择策略,比如根据共视点数量或时间间隔来决定是否插入新的关键帧。 回环检测和地图融合部分也是重点。这里需要讲DBoW2的词袋模型,如何通过视觉词典检测回环,然后进行Sim3优化来校正漂移。此外,还要说明全局BA优化在回环校正后的作用,以及如何优化整个地图的一致性。 ORB-SLAM2支持单目、双目和RGB-D相机,需要比较不同传感器下的系统表现。比如单目初始化困难,存在尺度不确定性,而双目和RGB-D可以直接获取深度信息,初始化更简单。 在优缺点分析方面,优点包括实时性高、支持多传感器、具备回环检测和重定位能力。缺点可能有对动态环境敏感,单目模式下尺度问题,以及特征提取在纹理缺失区域效果差。可以提到后续的ORB-SLAM3在IMU融合和多地图系统上的改进。 最后,学习建议部分应该推荐一些资源,比如论文、代码库、书籍和课程。同时建议从基础开始,动手实践,并参与社区讨论。 需要注意的是,用户可能希望了解实际应用中的问题,比如如何调整参数,处理特定场景的挑战,或者如何扩展ORB-SLAM2的功能。不过根据用户的问题,主要是介绍学习笔记,所以需要结构清晰,分点说明,确保覆盖主要模块和关键点。 可能还需要检查LaTeX格式是否正确,比如公式是否用$或$$包裹,变量是否正确。例如,提到BA优化时,可以写目标函数是$$\min \sum \| \pi(X, T) - x \|^2$$,其中$T$是位姿,$X$是地图点。确保这些公式的格式正确。 总之,我需要按照系统架构、特征提取、跟踪、局部建图、回环检测、多传感器支持、优缺点、学习建议的结构来组织内容,使用清晰的中文,正确插入公式,并确保技术细节准确。</think>以下为ORB-SLAM2学习笔记的整理,按模块分阶段说明: --- ### 一、系统架构 $$ \text{ORB-SLAM2} = \text{Tracking} + \text{Local Mapping} + \text{Loop Closing} + \text{Map} $$ 三大线程并行运行: 1. **Tracking线程**:实时估计相机位姿($T_{cw} \in SE(3)$) 2. **Local Mapping线程**:局部BA优化与地图点维护 3. **Loop Closing线程**:回环检测与全局优化 --- ### 二、ORB特征提取 - **FAST关键点检测**:阈值化像素差异($|I_p - I_{center}| > \delta$) - **BRIEF描述子**:二进制编码(256-bit,汉明距离匹配) - **改进特性**: - 图像金字塔实现尺度不变性($n$层缩放,比例因子$s=1.2$) - 灰度质心法计算方向($m_{10}=\sum xI(x,y), m_{01}=\sum yI(x,y)$) --- ### 三、跟踪线程(Tracking) 1. **初始位姿估计**: - 通过上一帧运动模型预测:$T_{k} = T_{k-1} \cdot T_{k-1}^{k}$ - 或通过特征匹配与PnP求解:$\min_T \sum \| \pi(T \cdot X_i) - x_i \|^2$ 2. **关键帧判定**: - 跟踪质量下降(匹配点 < 阈值) - 距离上一关键帧超过20帧 --- ### 四、局部建图(Local Mapping) 1. **局部BA优化**: $$ \min_{T_i, X_j} \sum \| \pi(T_i \cdot X_j) - x_{ij} \|^2 + \rho(\| T_i^{-1}T_j \|) $$ - 仅优化当前关键帧及其共视关键帧 2. **地图点剔除**: - 观测次数 < 2- 重投影误差 > $\chi^2$阈值($\chi^2_{0.95}=5.991$) --- ### 五、回环检测(Loop Closing) 1. **词袋模型(DBoW2)**: - 离线训练视觉词典(k-means树结构) - 计算相似性得分:$s = \frac{\langle v_q, v_t \rangle}{\|v_q\| \|v_t\|}$ 2. **Sim3优化**: $$ \min_{S} \sum \| \pi(S \cdot X_i) - x_i \|^2 + \| \pi(S^{-1} \cdot X_j') - x_j' \|^2 $$ - 解决尺度漂移问题($S \in Sim(3)$) --- ### 六、多传感器支持 | 传感器类型 | 初始化方式 | 深度获取方法 | |------------|---------------------|-----------------------| | 单目 | 分解H/F矩阵 | 三角化(需运动) | | 双目/RGB-D | 直接构造深度图 | 视差/深度传感器 | --- ### 七、优缺点分析 - **优点**: - 实时性(30fps,GTX 1070) - 支持重定位与动态场景处理 - **缺点**: - 依赖特征匹配(纹理缺失易失效) - 单目模式需10秒以上初始化 --- ### 八、学习建议 1. **必读文献**: - 原论文《ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras》 - 《Multiple View Geometry in Computer Vision》 2. **代码实践**: ```bash git clone https://github.com/raulmur/ORB_SLAM2 cd ORB_SLAM2 && chmod +x build.sh && ./build.sh ``` 3. **调试工具**: - 使用g2o_viewer可视化优化结果 - 分析`KeyFrame::EraseMapPointMatch()`等关键函数 --- 以上内容需结合代码阅读(推荐使用CLion或VSCode调试),重点关注`Tracking.cc`和`Optimizer.cc`模块。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值