ORB-SLAM3 代码解读

ORB-SLAM2代码阅读笔记(一):从mono_kitti单目运行开始

运行实例:

系统框架:

  • 在只对SLAM的正常框架有所了解的前提下,我们可以看到
    • TRACKING线程中做了提取ORB特征、初始位姿估计等操作,那么这个线程应该属于SLAM中的“前端VO”;
    • LOCAL MAPPING线程里有Local BA,我们可以知道这个线程属于后端,主要做后端优化和建图工作;
    • LOOP CLOSING线程从字面意思就能判断出是做回环检测的,分为回环检测和回环矫正。
  •  再需要知道的就是TRACKING线程接收了一帧一帧的图片后开始工作的,而LOCAL MAPPING线程接收的KeyFrame来自TRACKING线程“加工提炼”之后,LOOP CLOSING线程也是接收LOCAL MAPPING线程“进一步加工提炼”后的KeyFrame来进行工作。
  • 可以看出,Frame为整个系统运行起来的“原料”。这样三个核心的线程就串起来了。

ORB-SLAM(四)追踪

作者的程序分为两种模式:SLAM模式Localization模式。SLAM模式中,三个线程全部都在工作,即在定位也在建图。而Localization模式中,只有Tracking线程在工作,即只定位,输出追踪结果(姿态),不会更新地图和关键帧。Localization模式主要用于已经有场景地图的情况下(在SLAM模式下完成建图后可以无缝切换到Localization模式)。Localization模式下追踪方法涉及到的关键函数是一样的,只是策略有所不同。

Covisibility Graph,Spanning Graph,以及Essential Graph

  • 在Orb-Slam中有三个地图分别是Covisibility Graph,Spanning Graph,以及Essential Graph,它们三个分别是什么意思呢?
  • 首先,图优化是目前视觉SLAM里主流的优化方式。其思想是把一个优化问题表达成图(Graph),以便我们理解、观察。如果题主想更清楚地认识图优化与SLAM的关系.
  • 一个图中有很多顶点,以及连接各顶点的边。当它们表示一个优化问题时,顶点是待优化的变量,而是指误差项。我们把各个边的误差加到一起,就得到了整个优化问题的误差函数。
  • 顶点的参数化形式可以有很多不同的样子。例如某些顶点可以表示相机的Pose,另一些顶点可以表示三维空间点。同理,边也有不同的形式。除了个别的顶点和边,我们也关心整个图的结构,例如连通性等。
  • Covisilibilty Graph 的顶点是相机的Pose,而边是Pose-Pose的变换关系——所以也算是Pose Graph 一种吧。当两个相机看到相似的空间点时,它们对应的Pose就会产生联系(我们就可以根据这些空间点在照片上的投影计算两个相机间的运动)。根据观测到的空间点的数量,给这个边加上一个权值,度量这个边的可信程度。
  • Essential Graph 比Covisibility Graph更为简单,ORB-SLAM主要用它来进行全局优化。为了限制优化的规模,ORB-SLAM试图尽量减少优化边的数量。而尽量减少边,又保持连通性的方法,就是做一个最小生成树。
  • Covisibility 是一直在用的概念,而Essential Graph是orbslam自己提出的概念,为了减小全局回环的计算量。当你自己实现SLAM时,也会碰到这些困难,并设计一些应对的策略,这些就是你的创新性。事实上,随着SLAM时间的增长,如何控制图的结构和优化的规模,仍是现在SLAM有待解决的一个问题。

Covisibility graph

顶点:相机的 pose
边:pose 和 pose 间的位置关系
权值:边的可信度(每条边都有自己的权值)

具体到orb_slam2上,其表示了,每个关键帧处的相机位置之间的关系“图”

Essential graph

顶点:相机的 pose
边:pose 和 pose 间的位置关系
权值:边的可信度(每条边都有自己的权值)
目的: 进行全局优化

Spanning graph

理解成生成树更好一些。

KeyFrame部分的学习总结

类内维护的变量有:

  • 下一帧的帧号、当前的ID、当前帧的帧号、时间戳信息、栅格的长宽、栅格部分高和宽的倒数(这四个变量都是用在加速特征点匹配部分)、
  • 跟踪参考帧、关键帧中使用目标点(这两个变量是用在跟踪部分)、关键帧的局部BA、关键帧的固定点的BA(这两个变量用在局部地图部分)、
  • 回环队列、回环字符标志、回环得分、重定位的队列、重定位的字符标志、重定位的得分(这几个变量都用在关键帧数据集部分)、
  • 全局BA的变换矩阵、之前全局BA的变换矩阵、关键帧用于全局BA(这几个变量用于闭环检测部分)、
  • 一系列标定参数、关键点的数量、存放关键点的容器、存放去畸变的关键帧的容器、存放右图上每一个值的容器、存放图上深度值的容器、
  • 描述子、词袋向量、特征向量、相对父节点的变换矩阵、尺度层数、尺度因子、取完对数的尺度因子、放尺度因子的容器、存放尺度因子平方的容器、存放平方倒数的容器、
  • 图像的边界值(最小X和Y,最大X和Y)、内参矩阵

###################下面是protected的变量###################

  • 从传感器到世界的变换矩阵
  • 从世界到传感器的变换矩阵
  • 传感器的中心坐标
  • 双目中心点的坐标
  • 存放关联关键点的地图点的容器
  • 关键帧数据集类型的指针
  • ORB词汇类型的指针
  • 二维容器的栅格,存放int类型的值
  • map映射,被连接的关键帧的权重
  • 按顺序连接的关键帧,这些关键帧存放在关键帧指针的容器中
  • 顺序权重
  • 第一个是否连接的标志位
  • 关键帧类型的父节点指针
  • set容器内存放关键帧指针类型的子节点
  • set容器内存放关键帧指针类型的闭环边
  • 判断不要移除的标志位
  • 判断将被移除的标志位
  • 判断坏点的标志位
  • 基线距离的一半
  • Map类型的指针
  • 姿态锁、关键帧连接锁、特征锁

参考链接

相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页