orbslam2学习笔记 -- loopclosing 流程梳理

ORB_SLAM2代码阅读(4)——LoopClosing线程 ORB_SLAM2代码阅读(4)——LoopClosing线程1.说明2.简介3.检测回环 1.说明 在前几篇博客介绍完tracking和localmaping线程后,本文接着介绍闭环检测(LoopClosing)线程中的内容。该部分内容中有很多细节部分还没有弄清楚,暂时先将整体思路捋顺,更多细节内容以后再补充。 2.简介 LoopClosing线程整体思路比较简介清晰,主要分为三大部分:检测回环... 阅读详情

读之前提醒:首先,该文章是按照时间顺序讲述,并且不提前讲各种类关系和数据结构关系,而是在讲述系统时间执行流成的时候及时的补充相关的东西。意思就是先知道这个东西在流程中是干嘛的,然后告诉你这个东西是啥。如果你还没有读过tracking的部分,请先读tracking,因为很多概念会在tracking里先讲出来,后面再遇到,就不会细讲了。

tracking : https://blog.youkuaiyun.com/michaelhan3/article/details/89742663

 

loopclosing是一个单独的线程,通过函数LoopClosing::Run()里的一个死循环执行。首先通过函数CheckNewKeyFrames()检测mlpLoopKeyFrameQueue里的关键帧是否为空,如果不空则进行闭环检测的处理。Loopclosing中的关键帧是LocalMapping发送过来的,LocalMapping是Tracking中发过来的,在LocalMapping中通过InsertKeyFrame将关键帧插入闭环检测队列mlpLoopKeyFrameQueue。其实在整个loopclosing线程里,只是做了以下几个函数的事情。就是三个函数,分别是检测闭环DetectLoop(),计算闭环帧的Sim3(Sim3就是相似变换),然后根据计算的闭环帧的变换矫正位姿图。下面将一一说明。

    while(1) {
        if(CheckNewKeyFrames()) {
            if(DetectLoop()) {
               // Compute similarity transformation [sR|t]
               // In the stereo/RGBD case s=1
               if(ComputeSim3()) {
                   // Perform loop fusion and pose graph optimization
                   CorrectLoop();
               }
            }
        }
    }

检测闭环DetectLoop()

       进入函数,首先从队列里取出一个关键帧,然后如果当前关键帧距离上次闭环关键帧在10帧以内,则不进行闭环的检测。因为如果发生闭环,很可能在闭环帧附近的一些关键帧也都会形成闭环。然后取出当前关键帧,也就是刚才从队列取出来的关键帧,将该关键帧的所有共视关键帧取出来,然后计算当前关键帧与其所有共视关键帧的最低相似分数,就是bow向量距离分数。

        然后通过函数vector<KeyFrame*> vpCandidateKFs = mpKeyFrameDB->DetectLoopCandidates(mpCurrentKF, minScore),在所有关键帧中找出闭环备选帧。这里需要简单说一下这个函数。进入该函数。首先一个 关键帧的闭环帧应该避开自己相连接的帧,因为相连接的帧肯定与当前关键帧有很多相似的场景点,而闭环想要找的就是曾经的某帧,但不能是当前帧有连接的帧,有连接意思就是有共视的地图点。现在我们来想,怎么才能找到当前帧可能存在闭环的候选帧呢?一个很简单的办法,就是用当前帧和地图里的所有帧都进行相似性检测,给出相似性比较高的前面的一些帧作为候选帧。实际上也是这样做的。只不过利用了一些技巧。还记得在将tracking部分的时候我们简单的提到过一个图片的Bow向量,这个向量的每一个元素都可以看成一个单词和一个响应值。而在KeyFrameDatabase里,我们记录了包含每个单词的所有关键帧,这个数据结构是std::vector<list<KeyFrame*> > mvInvertedFile; ///< 倒排索引,mvInvertedFile[i]表示包含了第i个word id的所有关键帧。那么我们就可以遍历当前关键帧包含的所有单词,然后通过每个关键帧的变量mnLoopWords(int类型)记录与当前关键帧的共同单词数量。删除与当前帧共同单词数量小于所有候选帧与当前帧共同单词数量最大值的0.8倍的那些关键帧。然后进入下一步筛选。然后将剩下的候选帧,找出每一帧共视最佳的前10帧,然后加上该候选帧组成一组,计算该组与当前帧的相似性分数之和,这里共视的10帧只有在当前的候选帧中时,才能累加它与当前关键帧的相似性分数,并且记录下本组与当前帧相似性匹配分数最高的那个帧,后面会用到。找到所有组中的累计分的最高分数,用这个最高分数的0.75倍作为阈值,将所有组中累计分数大于这个阈值的该组里与当前帧匹配最高的那个关键帧加入到最终的候选帧里。至此一个关键帧的所有候选闭环帧寻找完毕。

       下面来讲述怎么从剩下的闭环候选帧里进一步筛选。

如图所示,从k0 - k3为从队列里依次取出来的4个关键帧。同一列的绿点属于该关键帧的候选关键帧,与绿点相连接的蓝点为该绿点代表关键帧的共视关键帧,所以按照图片所示四个蓝点和一个绿点代表了一个子候选关键帧组,所以没一列的三个星状图标表示该列最下方关键帧的候选关键帧组。列与列之间的虚线表示连线的两个帧是同一个帧,这也表示了这两个子候选关键帧组有联系。红色椭圆是将会传递到下一次检测的连续组。

接下来开始讲下筛选过程。整体利用的思路就是,如果真的在某个地方发生了闭环,那么在该闭环帧的后面几帧里,每前后两帧的候选关键帧组都会有或多或少的联系。假设k0为取出的当前关键帧,该列上的三个绿点为上一步筛选过后剩下的候选闭环关键帧,然后找到每个关键帧的前几个共视关键帧(代码中取了10个,图里中只画了四个)。如果当前的变量mvConsistentGroups,也就是上一次的连续组为空,那么就把现在的包含四个关键帧组的连续组赋值给mvConsistentGroups,并且标记该组的三个成员连续的计数为0。进入下一次循环,这次取出关键帧k1作为当前关键帧,同样构建k1的候选关键帧的候选关键帧组,然后在上一次的候选关键帧连续组中找是否和当前的候选关键帧连续组有联系,这里的联系在代码里指的就是至少包含一个相同的关键帧,如果有,将当前某个组元素和之前的某个组元素相连接,并且连续计数加1。然后继续从队列里取下一个关键帧,按照上面的办法寻找连续,并更新计数。直到当前取出当前关键帧为k3,此时k3的红点所在的候选组的连续计数已经为3,那么该组所代表的候选关键帧,也就是红点所代表的候选关键帧将入选,成为真正的闭环关键帧。

       

接下来是计算当前帧与闭环帧的Sim3变换ComputeSim3()。

        进入函数,ComputeSim3(),遍历上一步留下的闭环候选帧,依次与当前关键帧进行BOW方式的匹配(Bow方式的匹配在tracking里讲过了),存储匹配的特征点信息。如果匹配数小于20个,则删除该闭环帧,否则为其构造Sim3求解器。对于剩下的每个候选关键帧,使用RANSAC求解候选关键帧到当前关键帧的sim3变换。RANSAC最多迭代5次,只有内点的数目大于一定的阈值才会返回变换矩阵,如果5次迭代还没有求出sim3,则删除该候选帧。对于RANSAC求出sim3的那个帧,保留求出来的内点的匹配关系,然后利用sim3投影匹配,补充当前的匹配。然后利用重投影误差优化sim3,不优化地图点坐标(这里的优化需要在这里先提前简单提一下,一般的优化位姿和地图的不同。这里的优化顶点只有一个,这个顶点就是候选关键帧,也就是候选的闭环帧到当前关键帧的sim3变换。误差边是两方面的,一方面是闭环帧的地图点变换到相机坐标系后,经过sim3变换,投影到当前关键帧下的坐标,和匹配点的坐标的差。另一方面是,当前关键帧的地图点变换到相机坐标系后,投影sim3逆变换,投影到闭环关键帧下的坐标和匹配点的坐标差。)。优化后,剔除误差大的边,返回内点的数量。如果内点的数量大于20个,则说明正确找到了闭环帧,直接跳过其余的候选帧的计算。然后以闭环帧的位姿为基准,用优化计算出来的闭环帧到当前帧的sim3变换,乘以闭环帧的位姿,把这个结果记下来,将来会作为用来更新当前帧的位姿(因为我们假设,闭环帧是发生在时间上的过去,而从过去到现在出现的当前帧,虽然相机又走到了相同的场景,但是位姿并没有很理想的重合,因为误差累计的原因。所以我们假设相信闭环帧的位姿,相信当前帧的位姿误差会多点,所以我们会固定闭环帧的位姿,而用闭环帧和当前帧的相对位姿变换乘以闭环帧的位姿作为当前帧的位姿)。这里插入两个变量的概念,一个是闭环相连接关键帧vpLoopConnectedKFs,这个vector向量有当前计算出来的闭环帧,和该闭环帧的所有共视关键帧组成。另一个概念是闭环关键点集mvpLoopMapPoints,这个vector向量内的点是所有闭环连接关键帧所能够观测到的所有地图点。然后将闭环匹配上关键帧以及相连关键帧的MapPoints,利用刚才求出来的基于固定闭环帧的位姿而得到的当前帧的位姿,投影到当前关键帧进行投影匹配根据投影查找更多的匹配,这里对于原来已经存在的匹配关系则不去改变,只是增加原来不存在的匹配。如果所有匹配点的数目超过了40个,则说明计算闭环帧到当前帧的sim3成功了。

 

接下来讲矫正闭环CorrectLoop()

       进入函数,首先更新当前帧与其他关键帧的连接关系,也就是根据当前帧的地图点,利用能够观测到这些地图点的关键帧,求出与当前帧共同看到的地图点的个数作为当前帧与另一个关键帧的连接权重。接下来需要根据利用闭环优化过的当前帧的位姿,矫正与当前帧连接的帧的位姿,这也就是所谓的位姿传播矫正。意思就是,利用当前帧原来未经过和闭环帧优化过的位姿,和与其相连接的关键帧的位姿,求出他们的相对位姿,然后利用相对位姿乘以当前帧优化后的位姿得到连接帧的矫正过的位姿,当然同时也会记录下来这些连接帧未经过矫正的原来的位姿。接下来开始根据矫正的位姿,来更新相应的地图点。具体的做法也还是很简单,首先利用获得地图点的世界坐标,利用原来矫正之前的位姿求出地图点在相机坐标系下的位姿,然后利用矫正后的位姿,求出矫正后相机坐标系到世界坐标系的变换,然后利用这个矫正后的变换乘以地图点的相机坐标系下的位姿得到地图点的矫正后的世界坐标系的位姿。并且这次,更新每个帧的矫正后的位姿。检查当前帧的地图点,与闭环匹配的地图点是否存在冲突,如果存在冲突就用匹配的替换,如果当前还没有匹配地图点,就添加上闭环匹配的地图点。

         SearchAndFuse(const KeyFrameAndPose& CorrectedPosesMap)该函数的作用是对于每个经过位姿传播矫正过的当前帧的相连关键帧,将闭环地图点按照矫正后的位姿投影到这些帧中,若该地图点已经可以被该帧观测到则跳过,否则利用区域块内的描述子匹配找到该地图点所匹配的最佳特征点,如果该特征点还没有被匹配,则添加该特征点和地图点的匹配关系,如果该特征点已经有匹配的地图点,则用闭环特征点替换掉原来的地图点作为新的匹配。这个新的匹配的地图点暂时放在MapPoint的mpReplaced变量里。而同时也需要更新所有能观测到该地图点(需要更新的原来地图点)为新的闭环地图点。

        接下来更新当前矫正过位姿和更新过地图点的关键帧之间的共视相连关系,得到因闭环时MapPoints融合而新得到的连接关系,然后在这些连接关系中除去原来的连接关系,只剩下由于闭环而新生成的连接关系。

       进行EssentialGraph优化,也就是pose graph优化,LoopConnections是形成闭环后新生成的连接关系,这些连接关系中大部分是当前帧连接组与闭环匹配帧连接组之间的连接关系,当然也可能会包括一些当前帧连接组内之间的新增加的联系。这个函数也就是所谓的根据闭环的关系,将累积的误差分配到各处。

Optimizer::OptimizeEssentialGraph(mpMap, mpMatchedKF, mpCurrentKF,NonCorrectedSim3, CorrectedSim3, LoopConnections, mbFixScale);

本来这个函数需要在优化部分将,但是闭环的优化,这里又是关键,所以在这里需要比较详细的讲一下这个函数。

{

1. 设置g2o优化器

2. 将目前为止地图中的所有关键帧的位姿,添加为图优化的顶点。如果当前帧是闭环帧,则该帧的位姿固定,不优化。并且,如果该帧的位姿经过闭环传播调整过,那么使用经过调整后的位姿。

3. 添加由于闭环时地图点的更新而新出现的关键帧之间的联系作为图优化的边。当然这部分边主要是当前帧连接组和闭环帧连接组之间新建立的边。

4. 对所有关键帧添加跟踪时得到的边,也就是添加该关键帧和其父关键的联系作为边,并且使用未经过闭环位姿传播调整的原始位姿求相对位姿作为边的观测值;

对所有关键帧添加该关键帧的所有闭环帧连接得到的边,并且使用未经过位姿传播调整的原始位姿求相对位姿作为边的观测值;对所有关键帧中的每个关键帧,添加与该关键帧共视地图点个数大于100的关键帧组成的边,且使用未经过位姿传播调整的原始位姿求解相对位姿作为边的观测值。

5. 开始执行优化,迭代20次

6. 根据优化,更新所有关键帧的位姿。

7. 根据优化,更新所有地图点的三维位置。这里有个细节就是需要找到该地图点的参考关键帧,然后利用该参考关键帧的位姿,求解地图点的在相机坐标系下的坐标。然后利用优化后的位姿,再将相机位姿再映射到世界坐标系下。一般情况下,地图点的参考关键帧就是创建该地图点的关键帧。但是有一种情况比较特殊,还记得当我们找到了当前关键帧的闭环关键帧的时候,我们会固定闭环帧位姿,然后利用优化的相对位姿求解矫正的当前关键帧的位姿,然后利用当前关键帧的优化后的位姿传播矫正所有与其相连接的关键帧的位姿和地图点,这里被矫正更新的地图点的参考关键帧就是当前关键帧了,代码里使用了矫正后的参考关键帧变量mnCorrectedReference。但是如果该地图点经过闭环位姿传播矫正更新,那么该地图点的参考关键帧就是当前帧。

}

       接下来,创建一个新的线程,用于对地图里的所有关键帧和所有地图点做全局优化。

 

       好了,至此,闭环检测部分讲完了。

 

 

K-GAS解读(08) 大众kgas标准,大众及其供应商kgas 阅读详情

相关推荐

量化策略分享之ST股弱转强,回测年化123%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强,弱转强的认定标准是前日涨停但昨日不涨停,昨日收盘价大于前一日最低价,昨日收盘价大于10日线,昨日成交量大于前一日的成交量但小于前一日成交量的10倍,股价大于1;这类股票强势,有资金介入,能获得超额收益。

qq_29301281的博客 1268

ORB-SLAM2源码阅读(四)—LoopClosing线程&SIM3变换

看了这么多的代码注释感觉头都晕了,抽空捋一下这个线程的大纲,帮助理解一下。LoopClosing线程的主要工作内容可以分为两步:第一步就是对当前新到来的关键帧进行闭环检测(Loop Detection),不断地在关键帧数据库中查找是否有相似的与当前关键帧形成闭环;另一个是纠正闭环(Loop Correction),就是若存在回环进行位姿矫正。

chuangkeiss的博客 1061

SiamFC++笔记

SiamFC++: Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines 文章根据这些思路:引入分类和目标状态估计分支(G1),无歧义的分类得分(G2),无先验知识的跟踪(G3)和评估质量得分(G4)来设计SiamFC ++。 SiamRPN ++和SiamFC ++的比较(红色部分代表得分高的区域): guide: G1 : 分类和状态估计任务的分离:分类任务将目标从干扰物和背景中分类出来,目标状态

木木JL的博客 9434

【回环检测】如何理解loopClosing中的连续性检测

在连续性检测中会用到几个变量如下,可以先理解一下这几个变量之间的关系如图: 总结:回环部分对候选帧的检测其实可以理解为静态检测和动态检测;静态检测也就是对于图片相似度的检测,通过候选帧及其共视帧的commonwords 和score进行选择,保存下来的帧都具有静态一致性;空间上的连续性检测主要是动态检测,用于筛选那些落单的相似帧,通俗来讲就是这一候选、帧与当前帧相似,但是走两步之后就不一定相似了(传说中的没病走两步),怎么实现走两步的效果检测呢?那就是看簇与簇之间有没有共同帧了; PS:簇 = 候.

958

微信Dat文件转图片(文末含工具下载)

PC端微信dat图片转换为jpg格式

weixin_40704848的博客 8087

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1158

09 闭环线程 LoopClosing

由于累计误差的存在,检测到回环后,当前关键帧和闭环关键帧的位姿并不是相等的,这时就需要计算二者之间的相似变换矩阵,用于后续优化。若当前关键帧组在之前的连续关键帧组中找到连续关系,则当前的连续关键帧组的连续长度加1;若当前关键帧组在之前的连续关键帧组中没能找到连续关系,则当前关键帧组的连续长度为0。若某关键帧组的连续长度达到3,则认为该关键帧实现闭环。② 将闭环候选关键帧和其共视关键帧组合成为关键帧组。③ 在当前关键组和前一帧的连续关键组间寻找连续关系,,闭环候选关键帧取自于。类型,表示关键帧组,

qq_44175983的博客 1118

OceanBase备租户创建(二):通过BACKUP DATABASE PLUS ARCHIVELOG

OceanBase数据库备租户创建方法二:通过BACKUP DATABASE PLUS ARCHIVELOG功能实现,特别适用于社区版和单机版部署模式。

Sebastien23的博客 542

ORBSLAM2学习之LoopClosing线程

LoopClosing线程的逻辑关系也比较简单,基本上看对应的类即可,这次只是放下该线程的流程图 其中闭环检测候选帧的流程如下:

Fearless的博客 1234

OsgEarth —— 笔记1 - 创建地球的earth文件

效果         正文      1、准备一张全球的渲染图(tif格式)、一张全球的高程图(tif格式)        2、创建并编写.earth文件           在步骤1目录下创建china-simple.earth,并将如下内容写入。 <map name="Globe" type="geocentric" version="2"> <!-- 全球影像图 --> <image name="GlobeImage" driver="gdal"> &l

7681

图神经网络实战(21)——图神经网络的可解释性

在本节中,我们探讨了应用于图神经网络 (Graph Neural Networks, GNN) 的可解释性人工智能 (Explainable Artificial Intelligence, XAI) 技术。可解释性是许多领域的关键要素,可以帮助我们建立更好的模型。我们介绍了不同的局部解释技术,并重点讨论了 GNNExplainer (基于扰动的方法),在图分类任务中应用 GNNExplainer。

盼小辉丶的博客 9559

图解ORBSLAM2流程

这篇博文主要是梳理ORBSLAM2的流程,对于细节暂时不会很详细的描述(之后的博文会深究细节),且本博文暂时只描述ORBSLAM2中的Monocular(单目)情况。 在ORBSLAM2中,主要的三个线程是Tracking、LocalMapping、LoopClosing。三个线程的创建都是在System.cpp中,也就是在System类中的构造函数中创建了这三个线程。 以mono_tum.c...

zzpzm的博客 4881

2023华为OD机试真题B卷 Python 实现【最长的元音子串长度】

定义当一个字符串只有元音字母(a,e,i,o,u,A,E,I,O,U)组成,称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,并返回其长度,如果找不到请返回0, 字符串中任意一个连续字符组成的子序列称为该字符串的子串

MISAYAONE的博客 902

ORB-SLAM2中LoopClosing线程主要流程梳理

LoopClosing线程主要工作是两个:一个是对当前新到来的关键帧进行闭环检测,看看之前的关键帧中哪个和当前关键帧形成闭环;另一个是纠正闭环,就是在检测到闭环的时候要将当前关键帧和闭环关键帧的位姿拉到一起,形象点说就是进行融合(既然都存在闭环了,那肯定得合并啊)。 一、闭环检测DetectLoop 1.从关键帧列表中获取列表头的关键帧,也就是获取最新插入到LoopClosing线程的关键帧,并判断当前关键帧是否距离上次关键帧闭环检测的帧之间大于10帧,大于10...

ryankaros的博客 575

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ORB-SLAM2流程

https://blog.youkuaiyun.com/u010128736/article/details/53157605 梳理了一下ORB-SLAM2 的流程: 一、数据结构 enum eSensor{ MONOCULAR=0, STEREO=1, RGBD=2 }; 从...

qq_29230261的博客 1362

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ORB-SLAM2 理论知识梳理

1. 综述 ORB系统总共有3个线程分别为 Tracking,LocalMapping,LoopClosing。 其中Tracking运行在主线程,由 Tracking::GrabImageMonocular() 进入。LocalMapping 线程由 LocalMapping::Run() 进入;LoopClosing 线程由 LoopClosing::Run() 进入; 我将由这个3个线程讲述ORBslam2的单目模式是如何运作的。 2.Tracking跟踪 系统将图片交给 Tr...

努力努力努力 1455

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

试图学会ORB-SLAM2(1)——主函数梳理

ORB-SLAM2学习笔记1

weixin_45432823的博客 470

ORB-SLAM2:LoopClosing线程学习随笔【李哈哈:看看总有收获篇】

前言 闭环检测线程处理的是从局部建图线程传过来的关键帧,然后我们从历史关键帧里找能够匹配的,形成闭环,优化地图 闭环检测:DetectLoop() 关于共视图和闭环候选帧的选择原则小问题 共视图的建立是在局部建图线程,基本方法是寻找观测到当前帧地图点的先前的关键帧,建立的线索在于共同的地图点(值得一提的是,共视关键帧是共同看到了大于等于15个地图点的关键帧) 而闭环候选帧的选择使用的是BoW向量,先通过BoW向量的相似关系,找匹配的地图点,还是有一定区别的 那么问题来了,希望的候选关键帧会不会已经是共视关键

qq_41883714的博客 877

ORB SLAM2学习

开始学习ORB SLAM2 看到一篇博客将整个过程的图梳理的很清楚 以下三张图即ORB SLAM的三个线程来自吃水的鱼 感谢 Tracking线程 Local Mapping线程 Loop Closing线程 后面会时不时加上自己的学习过程 将泡泡机器人注释版代码里面一些进程画了下来,需要经常看 TrackWithMotionModel()函数 ...

Doraemon_Zzn的博客 376

ORB SLAM2源码解读

ORB SLAM2源码解读(一):系统流程 ORB SLAM2源码解读(二):MapPoint类 ORB SLAM2源码解读(三):Frame类 ORB SLAM2源码解读(四):KeyFrame类 ORB SLAM2源码解读(五):KeyFrame DataBase类 ORB SLAM2源码解读(六):Map类 ORB SLAM2源码解读(七):Optimizer类 ORB SLAM2源码解读(八):Initializer类 ORB SLAM2源码解读(九):Tracking类 ORB SLAM2源码解读

qq_29128985的博客 2598

ORB-SLAM3源码阅读笔记(9)-LoopClosing.cc

LoopClosing.cc这个文件是闭环检测与矫正的代码,其逻辑比较清晰。由于用到了多地图集,所以闭环检测不仅在当前地图中进行,还会在以前的地图中检测。如果是在当前地图中检测到了回环,则进行回环矫正;如果是在以前的地图中检测到了回环,则在回环处进行地图的融合,并矫正融合地图中所有的关键帧位姿和地图点。 1、闭环检测与矫正的流程 LoopClosing流程图 2、NewDetectCommonRegions( ) 这个函数是闭环检测线程中最重要的函数之一,用于检测闭环帧。下面是算法流程。 函数一开始先从

qq_41861406的博客 869

ORB-Mono原理梳理

ORB-Mono原理梳理 1. ORB主要特点:   1)ORB特征点;2)共视图;3)本质图的回环处理 1)ORB特征点描述子相对SIFT轻量,节省计算时间。 利用角点(Fast关键点)的尺度方向恢复角点因为相机旋转带来的方向变化,恢复角点方向,再计算描述子,才能得到更加准确的匹配关系。 2)共视图用于局部BA优化,并辅助回环检测。 共视图根据观测权重可以被删减为本质图(Essential graph),其包含单链的生成树(Spanning tree)。 3)本质图用于回环处理时进行的全局BA优化。缩小计

weixin_41469272的博客 1002

ORB-SLAM2代码阅读笔记汇总

ORB-SLAM2被许多人推荐为学习SLAM必须要学习的入手项目,甚至视觉SLAM十四讲当中的许多章节的描述方式都是和该系统吻合的。其中包含了经典的视觉SLAM的各个模块:前端视觉里程计、后端优化、闭环检测和建图,将这个系统代码完整读一遍能够加深对视觉SLAM的理解。当然,SLAM研究,学习优秀的开源系统、基础理论和相关论文只是第一步,一定要在工作中去实践,才有可能把SLAM相关技术掌握的更加深入。 ORB-SLAM2代码阅读笔记(一):从mono_kitti单目运行开始 ORB-SLAM2代码阅读笔

努力努力努力 1007

ORB-SLAM3源码阅读笔记(10)-结构梳理-待完善

1、Main 主线程 在Demo的主线程中,我们大致需要完成:1、参数的输入和判断;2、构建Slam类;3、循环获取数据发送给Slam系统;4、结束循环并释放Slam系统;5、按需决定是否保存相关信息 2、System类 System就是Slam类,主要完成:1、Slam系统的构建;2、输入数据的接收和发送给Track类;3、作为顶层接收Track发送的Reset信号,完成Atlas、Map等重启;4、提供Slam关闭接口;5、提供数据保存接口 3、Track类 Track作为Slam系统中重要的一个类负责

qq_41861406的博客 437

ORB-SLAM3代码详解(一)----代码整体框架

原理五花八门,不如花点时间搞懂代码!(建议看完《视觉SLAM十四讲》再来看我的这个)首先介绍一下整体框架:这是 ORB-SLAM3 系统的主要组件框架图。图中展示了 ORB-SLAM3 的各个关键模块及其交互关系。这张图展示了ORB-SLAM3系统如何通过这些模块实现SLAM功能,包括跟踪、局部建图、回环检测与地图合并,以及全局优化。

qq_50719698的博客 7932

ORB_SLAM代码阅读_注释整理

ORB特征点检测、匹配 1、http://www.javashuo.com/article/p-cqvdhkyp-np.html 2、特征点提取原理

LiChengwei的博客 403
上一篇: orbslam2学习笔记 -- tracking 流程梳理
下一篇: orbslam2学习笔记 -- localmapping
michaelhan3
博客等级 码龄11年 119粉丝 74原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值