orbSLAM2之 局部建图(LocalMapping)线程

ORB-SLAM2局部建图线程 ORB SLAM2 Localmapping线程 阅读详情

概述

该线程的入口是LocalMapping::Run()函数,执行其无限while循环。
下面介绍while循环体一次循环执行的操作。
1,设置LocalMaping类的成员mbAcceptKeyFrames为false,表示不接受Tracking线程创建新关键帧
2,检查成员mlNewKeyFrames中是否有新关键帧。mlNewKeyFrames保存所有Tracking线程创建新关键帧。
3,如果mlNewKeyFrames为空,则检查是否有外部操作要求终止该线程,有的话终止,没有的话休眠3毫秒后进行下一次循环。
4,如果mlNewKeyFrames不为空,则在本次循环中处理一帧新关键帧并进行一系列相关操作,再执行3,退出或进入下一次循环。
如何处理mlNewKeyFrames中的一帧新关键帧是关键,下面详细介绍。

新关键帧处理及相关操作

1,处理新关键帧ProcessNewKeyFrame();

1,将mlNewKeyFrames中的首元素赋值给mpCurrentKeyFrame。mpCurrentKeyFrame即是我们接下来要处理的新关键帧。

2,计算mpCurrentKeyFrame的BoWVector和FeatureVector

3,在生成mpCurrentKeyFrame的普通帧mpCurrentFrame追踪的那些地图点中添加对mpCurrentKeyFrame的记录。在tracking线程中,我们只在mpCurrentFrame中添加了其匹配到的地图点的记录,没有在这些地图点中添加对mpCurrentFrame的记录,因为地图点只保存对关键帧的记录。现在我们要在这些地图点中添加对mpCurrentKeyFrame的记录

4,将mpCurrentKeyFrame新创建的地图点添加到mlpRecentAddedMapPoints。在Tracking线程生成关键帧时,我们会将该关键帧【未匹配的特征点】或【已匹配了地图点,但是匹配的地图点的nObs<1的特征点】生成新的地图点(若为单目相机或为双目/RGBD的单目特征点此时生成的地图点的3d坐标为空)。这些新地图点在生成时添加了对mpCurrentKeyFrame的记录。mlpRecentAddedMapPoints是LocalMapping保存新生成的地图点的数据成员,通过对此成员的操作,确定哪些地图点能够最终保留下来

5,根据mpCurrentKeyFrame->mvpMapPoints更新mpCurrentKeyFrame的mConnectedKeyFrameWeights、mvpOrderedConnectedKeyFrames、mvOrderedWeights、mpParent等参数

6,将关键帧添加到地图(Map)中

2,地图点剪裁MapPointCulling();

1,测试mlpRecentAddedMapPoints中的地图点
2,对于不能通过测试的地图点,从mlpRecentAddedMapPoints删除,设置本地图点mbBad=true,并在所有特征帧以及地图中删除对本地图点的记录,但不删除本地图点。
3,遍历mlpRecentAddedMapPoints中的地图点,若某个地图点满足下面三个条件之一,则未能通过测试。

1,地图点mbBad=true 
2,地图点的 mnFound/mnVisible < 0.25,(即追踪局部地图的 优化内点次数/投影成功次数    <0.25)    
 3,在地图点创建后的第2、3个关键帧要被处理时,地图点的nObs<=设定值cnThObs

若某个地图点在不满足上面三个条件,且 满足:

地图点创建后的第3个关键帧要被处理时,地图点还在mlpRecentAddedMapPoints中

则将该地图点从mlpRecentAddedMapPoints删除,地图点通过测试

3,创建新地图点CreateNewMapPoints();

将mpCurrentKeyFrame中未匹配的地图点与其前nn(单目nn=20,双目RGBDnn=10)共视关键帧中还未匹配地图点进行匹配(BoW加速)、三角化,进而创建新地图点.
1,将mpCurrentKeyFrame的前nn个共视权重最大的共视关键帧保存到vpNeighKFs

2,如果mlNewKeyFrames中还有待处理关键帧,那么只用与mpCurrentKeyFrame共视最多的关键帧pKF2生成新地图点。反之,用所有vpNeighKFs中的共视关键帧pKF2生成新地图点,依次来提高处理速度。

3,通过光心距离判断pKF2是否可用来与mpCurrentKeyFrame三角化。
计算pKF2和mpCurrentKeyFrame的光心距离
如果是双目/RGBD,只有当光心间距大于双目/RGBD基线时,pKF2可用
如果是单目,只有当 光心间距/[共视帧帧观测到的地图点的深度值中位数] >= 0.01时,pKF2可用

4,计算mpCurrentKeyFrame和pKF2之间的基础矩阵F12

5,通过 matcher.SearchForTriangulation(mpCurrentKeyFrame,pKF2,F12,vMatchedIndices,false)匹配mpCurrentKeyFrame和*pKF2中还未匹配地图点的特征点,保存到vMatchedIndices。
关于函数SearchForTriangulation:

//匹配pKF1和*pKF2中还未匹配地图点的特征点,保存到vMatchedPairs(<在pKF1的特征点的索引,匹配的pKF2中的点的索引>),返回匹配数
//如果bOnlyStereo=true(缺省为false),则只对Stereo特征点尝试匹配
//通过BoW加速匹配:只对有相同NodeId的特征点尝试匹配
//匹配过程:对pKF1中的每一个特征idx1,与pKF2的同一NodeId的每一个特征计算描述子距离,选择其中最距离最小的特征bestIdx2,然后进行一下检查:
//          1,如果idx1和bestIdx2都是单目特征点,要检查角:光心1-地图点-光心2是否满足,以控制三角化误差 
//          2,通过基础矩阵判断两个特征点是否满足对极约束
//          3,如果mbCheckOrientation=true还要近性方向一致性检查(mbCheckOrientation在此类构造时初始化)
int ORBmatcher::SearchForTriangulation(KeyFrame *pKF1, KeyFrame *pKF2, cv::Mat F12,
                                       vector<pair<size_t, size_t> > &vMatchedPairs, const bool bOnlyStereo)
~~~s

6,根据不同情况分别采用以下3种方法之一进行计算vMatchedIndices中匹配特征对对应的3d坐标。
~~~s
1,用三角化计算新地图点的3d坐标
2,用mpCurrentKeyFrame中的3d坐标作为新地图点的3d坐标
3,用pKF2中的3d坐标作为新地图点的3d坐标

7,通过以下条件检查上一步中计算的3d坐标是否满足精度

1,检查在两帧中深度是否为正
2,检查在两帧中的重投影误差是否
		<=5.991*sigmaSquare2(对于单目特征点)
		<=7.8*sigmaSquare2(对于双目特征点)
		sigmaSquare2是特征点在该帧所在的金字塔尺度的平方
3,检查尺度(比)的一致性
		即地图点到两光心的距离之比和特征点在两帧上的所在的金字塔尺度之比是否接近

8,为通过第7步检查的3d坐标,生成地图点。
在mpCurrentKeyFrame和pKF2中添加对新地图点的观测
在新地图点中添加对mpCurrentKeyFrame和pKF2的记录
计算新地图点的描述子,更新其mfMaxDistance, mfMinDistance, mNormalVector等参数
将地图点添加到Map和LocalMap的mlpRecentAddedMapPoints中

4,地图点融合SearchInNeighbors();

若mlNewKeyFrames为空才进行地图点融合,以此减少计算量。

SearchInNeighbors()函数:匹配 mpCurrentKeyFrame和[共视帧以及共视帧的共视帧]之间的地图点和特征,融合有关地图点(不生成新地图点),更新mpCurrentKeyFrame的共视信息

5,LocalBA

LocalBA不是必然会进行的。只有当mlNewKeyFrames为空且没有外部操作终止本线程,并且地图中的关键帧数>2时才进行。
Optimizer::LocalBundleAdjustment(mpCurrentKeyFrame,&mbAbortBA, mpMap);

//参与优化的帧(非Fixed):pKF及其权重>15的关键帧
//参与优化的地图点:非Fixed帧匹配的所有地图点
//参与优化的帧(Fixed):参与优化的地图点的所有观测帧(除了非Fixed的帧)
//初步优化,然后根据pbStopFlag判断是否进行二次优化
//二次优化,设置初步优化后残差过大或地图点深度为负的边不再优化,取消所有边的核函数的边不再优化,进行二次优化
//将二次优化后残差过大或地图点深度为负的边涉及的关键帧和地图点,取消对彼此的记录
//保存优化结果,对优化涉及的所有关键帧和地图点都更新为优化结果
void Optimizer::LocalBundleAdjustment(KeyFrame *pKF, bool* pbStopFlag, Map* pMap)

6,关键帧剪裁 KeyFrameCulling();

//冗余的关键帧的删除
//待检查关键帧:mpCurrentKeyFrame的共视关键帧(权重>15)
//对待检查关键帧中的每一帧pKF检查是否满足:nRedundantObservations>0.9*nMPs,若满足则该帧冗余。
//      nRedundantObservations —— 冗余观测数:对于双目/RGBD相机,是[在pKF中为近stereo地图点]且[在任意其他3个关键帧中有尺度满足(质量好)的观测]的地图点数
//                                              对于单目相机,是在任意其他3个关键帧中有尺度满足(质量好)的观测]的地图点数
//      nMPs                   —— 观测数:     对于双目/RGBD相机,是[在pKF中为近stereo地图点]
//                                               对于单目相机,是观测地图点数
/对于冗余的关键帧,设置其为坏帧(mbBad = true),删除其他帧、地图点、地图对于该帧的记录,但不删除该帧

KeyFrameCulling();

7,向闭环检测线程添加一个新的关键帧

mpLoopCloser->InsertKeyFrame(mpCurrentKeyFrame);
ORBSLAM2系列-LocalMapping局部建图线程 到此整个LocalMapping线程就结束了,其中主要就是对局部地图进行了优化,并添加了新的地图点,这个线程中处理的都是关键帧。每个关键帧经过处理后,最后会放入链表中,用于LoopClosing闭环检测线程使用。 阅读详情

相关推荐

orbslam2的LocalMapping线程(1)

LocalMapping()

batmanShu的博客 439

ORB-SLAM3 LocalMapping类源码分析(一)

2021SC@SDUSC

qq_53377744的博客 700

ORBSLAM2总结之-LocalMapping.cpp

/** * @file LocalMapping.cc * @author guoqing (1337841346@qq.com) * @brief 局部建图线程 * @version 0.1 * @date 2019-04-29 * * @copyright Copyright (c) 2019 * */ /** * This file is part of ORB-SLAM2. * * Copyright (C) 2014-2016 Raúl Mur-Artal <raul

joun772的博客 396

ORB-SLAM2局部建图LcalMapping函数说明

() 函数用于检查新增的地图点,根据地图点的观测情况剔除质量不好的新增地图点,确保地图的质量和一致性。() 函数检查并剔除不合格的新增地图点。通过遍历最近添加的地图点列表,根据观测比例和相机数量等因素进行筛选和标记,确保地图中的地图点质量和一致性。CreateNewMapPoints() 函数用于根据当前关键帧与相邻关键帧之间的特征点匹配,通过三角化产生新的地图点,以提高地图的稳定性和密度。在局部建图线程中,会在共识关键帧之间重新进行特征匹配、三角化,生成新的地图点。这对于稳定的跟踪非常重要。

MSysの优快云 1520

octomap_mapping:用于OctoMap映射的ROS堆栈,包含octomap_server程序包

octomap_mapping 用于与OctoMap映射的ROS堆栈包含octomap_server软件包。 ROS Kinetic和更新版本的主要分支是kinetic-devel 。

CXL Virtual Hierarchy (VH) Enumeration理解

在 CXL 3.0 协议中,CXL Virtual Hierarchy (VH) Enumeration 是一种针对 CXL 虚拟层级(Virtual Hierarchy) 设计的设备枚举机制,它允许软件将物理连接的 CXL 设备抽象为多个逻辑层级(虚拟层级),从而实现更灵活的资源管理和拓扑扩展。与传统的 PCIe 枚举相比,CXL VH 枚举在协议特性、拓扑抽象和资源分配机制上有显著差异。本质:VH 是一个逻辑上的设备层级结构,可能与物理连接拓扑不同。

Summer的博客 1001

ORBSLAM2总结之-LocalMapping线程

前言 本文结合其余的ORBSLAM2的资料,对ORBLSAM2源码进行注释,感谢知识星球、泡泡机器人感谢吴博! 源码是知识星球小六等人的带注释版本。 LocalMapping线程主要用来处理从Tracking线程传过来的关键帧。 个人理解是: Tracking线程只要是完成对当前帧的追踪,以及这个帧的地图点相关信息之类的。 在LocalMapping中只要就是处理这个新的关键帧。 注意:处理新的关键帧是在缓冲队列中处理,处理完了后,要从缓存队列中删掉。 LocalMapping主要流程如下图所示: 上面的

joun772的博客 453

手把手教你用AFL挖掘C程序漏洞:从安装到实战(附常见错误排查)

本文详细介绍了如何使用American Fuzzy Lop (AFL)对C/C++程序进行模糊测试,从环境准备、目标程序插桩编译、初始语料库构建到实战运行与结果分析。重点讲解了AFL的安装、常见错误排查(如核心转储配置、执行速度优化)以及提升测试效率的高级策略(如持久模式、并行化),帮助开发者和安全工程师高效挖掘程序漏洞。

weixin_29014237的博客 407

【视觉惯性SLAM:十二、ORB-SLAM2:局部建图线程】

任务作用实现方法处理新的关键帧加入新的关键帧以扩展地图更新局部地图、共视关系删除不合格的地图点保证地图点的质量和精度检测观测次数、投影误差和视差生成新的地图点扩展局部地图,增加环境信息特征匹配、三角化、质量验证检查并融合地图点删除冗余点,提高地图的一致性检测重复点并进行融合关键帧的剔除减少冗余关键帧,控制系统开销检测覆盖率、观测次数和连接关系。

计算机领域博客,与时俱进的思想与技术。 1252

MRI多序列,多中心数据集预处理--使用FSL-Flirt 配准数据

FLIRT(FMRIB 的线性图像配准工具)是用于线性(仿射)模态内和模态间脑图像配准的全自动稳健且准确的工具。 什么是配准 在这两张图片上,很容易看出它们没有对齐,左边相对右边倾斜,虽然我们人类视觉系统还是能把对应的解剖关系连系在一起,但是我们使用计算机分析时确不能够 因此,我们希望相同的解剖结构对齐,用坐标表示的话,希望他们在相同的坐标上。如下图 对齐这些解剖结构的过程就叫做配准(register) 因此,配准的目的也是使相同的解剖结构在同一个位置,便于分析。可以将CT和MRI配准,看同一结构在两个

Tina姐的博客 1万+

别再手动上传了!用宝塔面板的‘Let‘s Encrypt’免费SSL证书,3分钟自动续期

本文详细介绍了如何利用宝塔面板的‘Let‘s Encrypt’功能实现SSL证书的自动申请和续期,3分钟完成配置即可永久免费使用。通过对比不同SSL证书方案,突出Let's Encrypt的免费、自动续期和高安全性优势,特别适合个人博客和中小企业官网。

weixin_30415113的博客 148

orbslam2代码解读(3):localmapping局部建图线程

这个localmapping局部建图线程还是比较简单的,就是处理关键帧,处理完毕就执行一个局部BA的优化。最后给回环线程留了一个队列,用于检测是否有回环。

Son_of_the_Bronx的博客 1205

ISP模块之色彩增强算法--HSV空间Saturation通道调整

色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度。而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和、丰富起来。对应于Photoshop里面的“色相/饱和度”调节选项里面对饱和度的操作。色彩增强的过程,并不改变原有彩色图像的颜色以及亮度信息。     在我的色彩增强算法模块里面,始终只针对色彩饱和度(Saturation)信息做研究,

松间明月 1万+

读懂ORBSLAM2——LocalMapping线程

流程图 LocalMapping线程负责对新加入的KeyFrames和MapPoints筛选融合,剔除冗余的KeyFrames和MapPoints,维护稳定的KeyFrame集合,传给后续的LoopClosing线程。 主要的功能点在: 处理新的关键帧ProcessNewKeyFrame() 剔除不合格地图点MapPointCulling() 三角化恢复新地图点CreateNewMapPoint...

xiaohu的博客 2031

【photoshop CEP插件】 OCR文字识别

一个photoshop CEP插件OCR文字识别 APP_ID = 17594920 API_KEY = puMFv72xqCYV2jdcSlXgtFvm SECRET_KEY = v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m /*********************************************/ 百度OCR 密钥由Greless@qq.com 提供, 用户可自行前往https://ai.baidu.com/docs#/Auth/top 申请。 通用文字识别..

Greless的后花园 6486

鸿蒙平板PC应用开发:在termux中安装ubuntu

打开AVNC点击右上角的设置图标,然后点击 输入 , 点击手势栏目中的 单指轻扫 ,选择滚动远程内容

DMZDAMS的博客 5195

图解ORBSLAM2流程

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

zzpzm的博客 4881

k230+CanMV+micropython环境下byte、int、hex、string之间的转换常用函数实测

【代码】k230+CanMV+micropython环境下byte、int、hex、string之间的转换常用函数实测。

weixin_47446386的博客 118

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

一、LocalMapping线程简述 在ORB-SLAM2当中,LocalMapping作为一个线程在系统启动后就一直在运行,只是在Tracking线程“生产出”新的关键帧并插入到LocalMapping线程中的mlNewKeyFrames列表后,LocalMapping线程检测到该列表中有关键帧后开始处理这些新插入的关键帧(CheckNewKeyFrames函数用来检测mlNewKeyFram...

1365

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ORBSLAM2之LocalMapping线程

目录LocalMapping线程概述一、 处理新关键帧ProcessNewKeyFrame()二、 剔除质量不好的MapPoint MapPointCulling()三、 三角化创建新MapPoint CreateNewMapPoints()四、 MapPoint融合五、局部BA六、删除冗余关键帧KeyFrameCulling()七、将当前关键帧插入闭环检测队列 LocalMapping线程概述   此线程主要用于处理Tracking线程发来的关键帧,更新关键帧和MapPoint之间的关系,对M

qq_37340588的博客 545

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【代码阅读】ORBSLAM2

ORBSLAM2源代码阅读记录,根据程序运行顺序整理了代码的实现细节

博客标题不能为空我也没办法 1760

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

一起学ORBSLAM2(11)ORBSLAM的localmapping

转载请注明原创地址:https://blog.youkuaiyun.com/qq_30356613/article/category/6897125ORBSLAM的局部建图线程实际做的工作是来维护全局map以及管理关键帧的,对tracking得到的关键帧进行筛选融合,以及对关键帧中的地图点进行融合,剔除冗余的关键帧和地图点,维护一个稳定的全局map,并将筛选后的关键帧提供给回环检测使用。局部建图线程主函数流程...

蚁族的坚持的博客 3804

ORB_SLAM2代码阅读(3)——LocalMapping线程

@TOC

Mr.Andy的博客 2020

ORBSlam2学习研究(Code analysis)-ORBSlam2中的视觉里程计LocalMapping

LocalMapping线程介绍ORBSlam2中的视觉里程计VO不仅仅包含Tracking线程,LocalMapping也是VO中的一部分。

Xuefeng_BUPT的博客 5980

ORBSLAM的LocalMapping模块和Tracking模块的接口讲解

摘要:ORB-SLAM中Tracking线程与LocalMapping线程通过关键帧队列实现交互。当Tracking线程检测到需要新增关键帧时,会调用InsertKeyFrame()将其推入mvpNewKeyFrames队列,并设置mbAbortBA标志中断当前优化。LocalMapping线程通过3ms间隔的忙等机制检查队列状态,处理新关键帧时执行地图点更新、剔除、创建及局部优化等操作。整个过程采用生产者-消费者模式,但没有使用条件变量,而是通过队列检测和定时休眠实现线程唤醒。

weixin_43851636的博客 391
上一篇: ubuntu18.04系统双显卡笔记本安装nvidia-driver、cuda(toolkit)、cuDNN、pytorch
下一篇: SLAM系统发展
isErik
博客等级 码龄9年 38粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值