ORB-SLAM3算法代码及原理解析
文章平均质量分 89
对ORB-SLAM3算法流程进行学习和解析
超爱吃小蛋糕的66
这个作者很懒,什么都没留下…
展开
-
ORBSLAM3算法学习总目录
1.ORB-SLAM3系统概述2.1ORB-SLAM3之ORB特征提取和BRIEF描述子计算2.2ORBSLAM3之几种特征点提取方法2.4ORB-SLAM3之Frame构造简介2.5ORB-SLAM3之基于SAD滑窗的双目特征匹配3.0ORB-SLAM3跟踪线程概述3.1ORBSLAM3之IMU预积分3.2ORBSLAM3之双目初始化和单目初始化3.3ORB-SLAM3之视觉与IMU的联合初始化3.4ORBSLAM3之跟踪恒速运动模型3.5ORBSLAM3之跟踪参考关键帧3.6ORB原创 2023-06-27 09:09:42 · 573 阅读 · 0 评论 -
0.ORB-SLAM3算法知识点总结
ORB-SLAM3中的回环检测线程主要分为4个模块:检测共视区域、检测是否存在回环、计算相似变换、回环矫正共视区域检测主要是看关键帧和之前已经创建的关键帧之间是否存在公共单词,如果存在再进一步分析检测到的共视关键帧是其他子弟图的还是当前子地图的如果检测到的共视关键帧是其他子地图的,则将两个子地图进行融合如果检测到的共视关键帧是当前子地图的,则有可能存在回环关系如果存在回环关系则计算回环关键帧之间的相似变换,获取漂移的程度如果相似变化计算成功,则根据漂移程度纠正回环处的累计误差。原创 2023-03-07 18:17:05 · 1474 阅读 · 0 评论 -
1.ORB-SLAM3系统概述
本系列文章主要基于ORB-SLAM3代码、论文以及相关博客,对算法原理进行总结和梳理。ORB-SLAM系列整体架构是不变的,都包含Tracking、LocalMapping和LoopClosing三个核心线程,中间伴随着优化过程。在ORB-SLAM3算法中比较突出的改进有两个:1. 引入IMU传感器,系统支持单目+IMU,双目+IMU和RGBD+IMU等三种模式2. 引入地图集Atlas这个概念,支持多个子地图并存,以及地图的保存和加载原创 2023-06-16 17:26:45 · 982 阅读 · 0 评论 -
2.1ORB-SLAM3之ORB特征提取和BRIEF描述子计算
ORB-SLAM算法中ORB特征提取与描述子计算,输入一张图像,返回存放特征点的vector向量,存放描述子的mat,特征点数量,步骤大致分为以下4步1. 构建图像金字塔2. 提取Fast特征点并使用OctTree进行均匀化分布3. 利用灰度质心法,计算特征点角度4. 计算带有旋转不变性的rBRIEF描述子原创 2022-11-23 19:23:15 · 2197 阅读 · 0 评论 -
2.2ORBSLAM3之ORB、SIFT、SURF、Harris角点、Shi-Tomas角点特征点提取方法
本节对ORB特征、SIFT特征、SURF特征、Harris角点、Shi-Tomas角点的提取与描述子计算原理进行总结,其中Harris角点、Shi-Tomas角点是关键点,没有对应的描述子,一般用于光流跟踪(Vins系列算法)。综合所有的特征检测算法来看,所有的方法本质上都是通过计算像素灰度梯度检测关键点位置,ORB特征通过与邻域像素进行灰度值比较得到,其余SIFT,SURF,Harris角点、Shi-Tomas角点均都涉及到一个Hessian矩阵(由离散像素二阶导得到)求解问题,根据Hessian矩阵原创 2023-06-19 09:21:18 · 1839 阅读 · 0 评论 -
2.3ORBSLAM3之相机模型与畸变模型
1. 对SLAM中常见的相机模型进行介绍,包括针孔相机模型和鱼眼相机模型2. 对每种相机模型的畸变模型进行介绍3. 对VSLAM中常见的几种去畸变方法进行介绍4. 对常见的几种相机标定方法进行总结原创 2023-06-25 17:37:02 · 1659 阅读 · 0 评论 -
2.4ORB-SLAM3之Frame构造简介
Frame是ORBSLAM3的基本单元,具备图像帧的位姿、特征点、描述子、3D空间点等属性。每当新的一帧图像送到系统时,Tracking.cpp中的`GrabImage***`函数首先会构造一个图像帧再进入到跟踪线程,在跟踪和优化过程中更新Frame的各属性信息。本篇对ORBSLAM3在不同传感器模式下的Frame构造进过程进行简介,主要包括特征点提取,去畸变处理,网格化注册等几个主要模块,以及一些成员变量的初始化,对于每个模块的详细过程见该系列的其他博客原创 2022-11-23 19:33:29 · 894 阅读 · 0 评论 -
2.5ORB-SLAM3之基于SAD滑窗的双目特征匹配
简单的说,ORB-SLAM中的双目匹配只对特征点进行操作,根据左目图像中的特征点坐标搜索其在右目图像的对应匹配点,并将右目图像匹配点的x坐标储存在成员变量。例如左目图像某个特征点的纵坐标为20,那么在右侧图像上搜索时是在纵坐标为18到22这条带上搜索,搜索带宽度为正负2,搜索带的宽度和特征点所在金字塔层数有关。,这是一个二维向量,外层大小为图像的行数nRows,记录特征点在右目图像的纵坐标,内曾大小为带状区域的宽度,记录特征点的索引。首先,将上面的到的匹配对的坐标乘以一个尺度因子,变成对应金字塔层的坐标,原创 2022-11-24 20:42:55 · 1160 阅读 · 2 评论 -
3.0ORB-SLAM3跟踪线程概述
tracking线程是ORBSLAM系列的三大核心线程之一,主要做的事是接收一张图像帧和一组IMU数据,计算相机在相邻图像帧之间的运动和当前时刻位姿,并根据需要创建关键帧。根据模块的功能不同,tracking线程主要包含:纯视觉初始化,跟踪运动模型,跟踪参考关键帧,跟踪局部地图,重定位和创建关键帧纯视觉初始化主要是根据特征点得到3D空间点,并初始化一个地图。原创 2023-06-28 09:13:58 · 599 阅读 · 0 评论 -
3.1ORBSLAM3之IMU预积分
对ORB-SLAM3代码中的IMU预积分模块进行梳理原创 2022-12-12 19:21:03 · 928 阅读 · 0 评论 -
3.2ORBSLAM3之双目初始化和单目初始化
对ORB-SLAM3算法中的双目初始化和单目初始化部分代码进行解析,双目初始化介绍了基于SAD滑窗的特征点深度恢复,单目初始化介绍了初始化模型选择,基础矩阵和单应矩阵计算,3D地图点恢复等原创 2022-12-26 17:04:37 · 2060 阅读 · 0 评论 -
3.3ORB-SLAM3之视觉与IMU的联合初始化(待补充)
本文对ORB-SLAM3中的系统初始化进行了简单分析,主要包括三个阶段的初始化,纯视觉初始化获得初始位姿,IMU初始化优化偏置以及尺度信息,VI联合优化优化位姿和地图点信息并进一步优化IMU参数原创 2023-02-01 10:26:59 · 951 阅读 · 0 评论 -
3.4ORBSLAM3之跟踪恒速运动模型TrackWithMotionModel()
跟踪运动模型核心思想:假设在极短时间内,相机的运动相同。设相邻时刻的三帧图像分别为k-2帧,k-1帧,k帧,则认为k-2帧到k-1帧相机的运动T_delta1和k-1帧到k帧相机的运动T_delta2相等,如下图所示。当相机运动到当前帧图像时,可以由T_delta1和k-1帧时相机的位姿计算当前帧的位姿,为投影匹配和优化提供初值。原创 2023-01-10 14:59:13 · 796 阅读 · 0 评论 -
3.5ORBSLAM3之跟踪参考关键帧TrackReferenceKeyFrame
本文对ORB-SLAM3代码tracking线程的跟踪参考关键帧TrackReferenceKeyFrame部分进行分析原创 2023-01-12 11:10:07 · 980 阅读 · 0 评论 -
3.6ORB-SLAM3之重定位Relocalization
MLPNP的核心思想是对于每一个3D空间点,连接空间点到相机光心可以得到一个法向量v,以及在切平面对应的一组正交基[r,s],然后将2D-3D点的投影匹配转换为使用正交基之间进行计算。原创 2023-01-30 10:51:05 · 2157 阅读 · 0 评论 -
3.7ORB-SLAM3之跟踪局部地图
之前讲,在tracking线程中跟踪主要分为两个阶段,一阶段是帧间跟踪包括跟踪恒速运动模型以及跟踪参考关键帧,这两种跟踪方式都是在两帧之间进行,而跟踪局部地图则是将当前时刻能够被当前帧观测到的地图点进行投影匹配,然后对局部地图中包含的关键帧进行位姿的BA优化。在ORB-SLAM中,局部建图线程的作用之一就是为了跟踪局部地图而服务的,该线程和跟踪线程同时启动并列运行。局部建图线程时刻维护一个局部地图,这个局部地图包括和当前帧存在共视关系的关键帧,共视关键帧的共视关键帧、这些关键帧对应的地图点。原创 2023-01-30 21:37:49 · 976 阅读 · 0 评论 -
3.8ORB-SLAM3之关键帧的创建和删除条件
以上的测试使用的纯双目下的纯定位,效果有些鸡肋;对于双目+IMU尚未尝试,有了IMU的与积分在段时间的困难场景下应该会纯定位模式应该会表现稍好一些。如果情况一到情况四,均没有被触发则进入到最后的判断,只要满足情况567其中一条则统一插入关键帧。原创 2023-01-31 19:04:54 · 887 阅读 · 0 评论 -
3.9ORB-SLAM3之浅谈代码中的纯定位模式
在Tracking线程中,当系统初始化完成后就会正式进入跟踪环节。在ORB-SLAM3算法代码中提供了两种模式,一种是纯定位模式,一种是定位建图的SLAM模式。对于纯定位模式,在源码中由成员变量控制,这个变量是通过UI界面进行控制改变的。可以由上图看到,纯定位模式和SLAM模式主要是在与第一阶段的处理方式不同,由于纯定位模式不进行关键帧的创建,因此,在存在加载先验地图时使用纯定位模式比较合适,不然VO的轨迹会漂的非常厉害。原创 2023-01-05 09:51:51 · 1787 阅读 · 15 评论 -
4.0ORBSLAM3之局部建图线程概述
计算该关键帧特征点的Bow信息更新当前关键帧新增地图点的属性更新共视图中关键帧间的连接关系将该关键帧插入到地图中详细见博客《处理缓存队列中的新关键帧》原创 2023-06-30 14:57:14 · 820 阅读 · 0 评论 -
4.1ORB-SLAM3之处理缓存队列中的关键帧
对于某个3D地图点会在多个时刻下被相机观测到,因此同一3D地图点会被多个关键帧观测到,也即该3D点是多个特征点的反投影点,该3D点的描述子也由与其对应特征点的描述子决定。记录了每个特征点的索引以及该特征点对应单词在词袋树上的节点id,根据这一信息可以在寻找特征匹配时只对统一节点上的特征点寻找匹配关系,以实现加速匹配。中所有观测到本地图点的关键帧取平均得到的,通过地图点与关键帧对应相机光心的连线可以得到该地图点的观测方向。平均观测距离是根据参考关键帧得到的,观测距离指的是该3D点到参考关键帧光心的距离。原创 2023-06-30 14:57:53 · 889 阅读 · 0 评论 -
5.0ORB-SLAM3之回环检测线程概述
ORB-SLAM3中的回环检测线程主要分为4个模块:检测共视区域、检测是否存在回环、计算相似变换、回环矫正共视区域检测主要是看关键帧和之前已经创建的关键帧之间是否存在公共单词,如果存在再进一步分析检测到的共视关键帧是其他子弟图的还是当前子地图的如果检测到的共视关键帧是其他子地图的,则将两个子地图进行融合如果检测到的共视关键帧是当前子地图的,则有可能存在回环关系如果存在回环关系则计算回环关键帧之间的相似变换,获取漂移的程度如果相似变化计算成功,则根据漂移程度纠正回环处的累计误差。原创 2023-02-01 14:34:21 · 976 阅读 · 0 评论 -
5.1ORB-SLAM3之回环检测线程检测是否存在共视区域
本质上是计算当前关键帧和关键帧数据库中的关键帧是否存在公共单词,相似性分数是否满足要求。原创 2023-07-05 17:02:03 · 1512 阅读 · 2 评论 -
5.2ORB-SLAM3之回环矫正
在上一章已经介绍了检测共视区域的部分,接下来就是对共视区域进行回环矫正或者地图融合。回环矫正和之前的ORBSLAM系列一致,就是消除因为长时间运动产生的位姿累计误差和尺度漂移。在ORBSLAM3中新增了多地图系统,因此出现共视区域的地方有可能出现在不同的子地图中,需要对两个子地图进行融合。本篇主要对回环矫正部分进行介绍。原创 2023-07-06 16:28:04 · 691 阅读 · 0 评论 -
5.3ORB-SLAM之回环检测线程地图融合
在上一章已经介绍了检测共视区域的部分,接下来就是对共视区域进行回环矫正或者地图融合。回环矫正和之前的ORBSLAM系列一致,就是消除因为长时间运动产生的位姿累计误差和尺度漂移。在ORBSLAM3中新增了多地图系统,因此出现共视区域的地方有可能出现在不同的子地图中,需要对两个子地图进行融合。本篇主要对地图融合部分进行介绍。对于系统融合根据是否使用IMU又可以分为纯视觉地图融合与视觉惯导地图融合。原创 2023-07-06 17:00:25 · 420 阅读 · 0 评论 -
6.0ORBSLAM3之几种特征匹配方式总结
结合代码看,ORBSLAM3中的特征匹配从来不用整副图像的暴力匹配,一般都使用一些加速方法,综合的看大致分为以下几种:1. 基于网格注册信息的特征匹配加速 涉及到3D-2D匹配,对于将3D地图点投影到图像帧寻找匹配点时一般使用特征点网格注册信息,在3D点投影位置的附近网格区域内寻找匹配点2. 基于词袋向量的特征匹配加速 涉及到2D-2D匹配,特别的关键帧与关键帧,关键帧与普通帧之间的匹配,一般基于词袋向量加速匹配,只对属于同一节点下的特征点遍历寻找匹配3. 基于带状搜索的匹配方法原创 2023-07-07 09:30:41 · 1425 阅读 · 1 评论