一起学ORBSLAM2(11)ORBSLAM的localmapping

2023-10-31

转载请注明原创地址:https://blog.csdn.net/qq_30356613/article/category/6897125

ORBSLAM的局部建图线程实际做的工作是来维护全局map以及管理关键帧的,对tracking得到的关键帧进行筛选融合,以及对关键帧中的地图点进行融合,剔除冗余的关键帧和地图点,维护一个稳定的全局map,并将筛选后的关键帧提供给回环检测使用。

局部建图线程主函数流程:

设置当前不能接受新的关键帧到系统中,即在局部建图(处理关键帧)过程中不允许新关键帧集有变动

对新关键帧进行处理。建立新的关键帧及其属性(计算关键帧BOW向量,将关键帧的地图点加入该关键帧,并更新地图点的属性(观测到该地图点的关键帧,该地图点的平均观测方向,最优描述子))并加入全局map

检测当前关键帧对应的地图点是否是好的(筛选条件:地图点是否是好的,地图点的查找率大于0.25, 该地图点第一关键帧(第一次观察到该地图点的帧id)与当前帧id相隔距离该关键点的被观察到的次数)

4对极约束检测特征点,并建立地图点加入全局map利用对极约束对当前帧和共视关键帧(当前帧的)进行三角测量(匹配当前帧和关键帧,然后对每对匹配通过三角化生成3D点,之后进行检验(检验地图点在两帧中的深度,在两帧中的重投影误差,尺度连续性)),如果满足对极约束则建立当前帧的地图点及其属性(a.观测到该MapPoint的关键帧  b.MapPoint的描述子  c.MapPoint的平均观测方向和深度范围),将地图点加入关键帧,加入全局map

进行数据融合在每组关键帧(当前情况下没有新的关键帧加入为一组关键帧)处理完成之后,对当前关键帧(每组的最后一关键帧)进行关键帧的融合(融合的是当前关键帧及其共视关键帧),对地图点进行融合(融合的是当前关键帧的地图点和两级相邻关键帧(关键帧的共视关键帧和所有共视关键帧的共视关键帧)的地图点)。

将关键帧交给回环检测

7设置当前可以接受新的关键帧到系统中,即在局部建图(处理关键帧)过程中允许新关键帧集有变动

局部建图线程实际做的就是维护一个好的map,处理tracking线程下来的关键帧。

既然是维护一个好的map,那么一个map中包含了哪些元素,我们需要维护哪些元素呢?

维护全局map主要做的工作是插入关键帧和地图点,删除(去除)冗余关键帧和地图点。

1. 关于数据(插入关键帧和地图点)插入全局map的说明:

插入地图点和关键帧操作:建立地图点并设置地图点属性(a设置观察到该地图点的关键帧,b计算地图点的最优描述子,c计算地图点的平均观测方向和深度范围),建立关键帧并设置地图点关键帧属性(a设置该关键帧中的地图点 b.计算关键帧的BOW向量)。其中将关键帧加入地图map是在Tracking::CreateInitialMapMonocular()(单目初始化帧),Tracking::StereoInitialization()(双目及rgbd相机初始化帧),LocalMapping::ProcessNewKeyFrame()(其他关键帧插入);地图点插入全局地图map是在Tracking::CreateInitialMapMonocular()(单目初始化帧),Tracking::StereoInitialization()(双目及rgbd相机初始化帧),Tracking::CreateNewKeyFrame()和LocalMapping::CreateNewMapPoints() (非单目其他关键帧地图点插入),LocalMapping::CreateNewMapPoints()(单目其他关键帧地图点)。非单目地图点的插入可以直接在tracking中进行,因为他们可以直接得到深度信息,从而直接得到地图点的三维点坐标,而单目地图点求其深度信息,需要对极约束和三角化,而对于地图点的三角化和对极约束我们在localmapping线程LocalMapping::CreateNewMapPoints()函数中进行的。

2. 关于数据(去除冗余关键帧和冗余地图点)融合的说明:

冗余关键帧的删除是在localmapping线程中,当一组关键帧运行完成之后(当前新关键帧集中没有新的关键帧)进行关键帧的融合,融合的是当前关键帧(当前组关键帧的最后一帧)及其共视关键帧(有相同地图点的关键帧)。融合的判定条件是:当前关键帧中有90%以上的地图点在其他关键帧中能够找到,则认为该关键帧是冗余的。去除冗余关键帧的方法时将该帧设为bad帧,KeyFrame::SetBadFlag()函数,做如下操作:(1)验证该帧是否可以被擦除(2)擦除所有本关键帧与关联关键帧之间的联系(3)擦除所有地图点与本关键帧之间的关联,标志本关键帧已经不能看到这些地图点,这些地图点也不会存在这些关键帧 (4)清空存储与本关键帧关联的其他关键帧变量,清空排序之后的关联关键帧序列(5)清空子关键帧 并找每个子关键帧的新的父关键帧(6)在地图点和关键帧数据集中剔除本关键帧

冗余地图点的删除是在localmapping线程中SearchInNeighbors()函数下进行的,对当前关键帧中的所有地图点与所有一级二级相邻关键帧(一级关键帧是指当前关键帧的共视关键帧,二级关键帧是指当前关键帧共视关键帧的共视关键帧)中的地图点进行检测融合,通过函数ORBmatcher::Fuse(KeyFrame *pKF, const vector<MapPoint *> &vpMapPoints, const float th)将地图点投影到关键帧的方式进行特征匹配选取最优的匹配点,如果匹配点与当前点的描述子距离小于阈值的情况下进行融合。融合的方式是用被观察次数大的地图点代替被观察次数少的地图点,用函数MapPoint::Replace(MapPoint* pMP)融合,融合地图点作如下操作:(1)将被替换地图点的被观察次数,被查找次数,以及观察到该地图点的关键帧都清空,坏地图点标志置位(2)将被替换地图点的被观察次数,被查找次数都加到替换地图点pMP中,并将当前地图点在关键帧中的位置用代替地图点代替(3)最后将本地图点从全局地图map中删除。

该线程中涉及到的算法有:在建立新关键点时涉及到的对极约束的知识;局部BA优化的知识。下面分别介绍

对极约束与三角测量

为了得到地图中的地图点深度信息,我们在单目情形下需要对匹配点进行对极约束和三角测量。

对于初始化帧的对极约束在Initializer::Triangulate(const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D)函数中实现,对于其他单目帧的对极约束和三角测量是在LocalMapping::CreateNewMapPoints()中实现

理论如下:

对极几何:

 

如图所示为对极几何示意图,假设有空间点,在帧图像上的投影为,在第二帧图像上的投影为,第一帧相机中心为C,第二帧相机中心为C’,如何通过第一帧的像素坐标来计算第二帧的像素坐标呢?通过图我们可以看出,根据两相机中心坐标和x点可以确定一个平面。这个平面与第二帧像素平面的交线为,可以确定的是,肯定在这一直线上,直线我们称为极线,平面称为极平面,如(b)中所示ee称为极点

在ORBSLAM中我们为了判断两匹配点是否满足对极约束,我们将第一幅图像的中的像素点根据对极几何的方式映射到第二幅图像中,然后计算第二幅图像中的匹配点到映射极线的距离作为判断当前匹配点的效果好坏。通常情况下我们用基础矩阵来描述两匹配像素点的转换关系,所以有,计算的距离就可以评测匹配点的好坏了。这一部分实现代码ORBmatcher::CheckDistEpipolarLine(const cv::KeyPoint &kp1,const cv::KeyPoint &kp2,const cv::Mat &F12,const KeyFrame* pKF2)

三角测量:

三角测量的用途是用来确定深度信息的,从而确定地图点的三维点坐标。

已知匹配特征点对{}和各自相机矩阵{},估计三维点X

则存在:,他们都属于,


采用DLT的方法,x叉乘PX=0,得到:

以上是针对x,对于x来讲同样存在上述关系,因此存在:

     ->AX=0

将上式写成A=,通过SVD分解的方式得到X的解,从而确定匹配点的三维点坐标。

SVD的分解求解方法参考另一篇文章(ORBSLAM中的单目初始化处理方式)

局部BA优化

(这一部分我们在另一篇文章(ORBSLAM中的优化问题)中讲解)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一起学ORBSLAM2(11)ORBSLAM的localmapping 的相关文章

  • chrome 小技巧 ,保持元素的hover状态

    1 审查元素 选中a标签 或者需要hover的标签 2 点击右键 3 选择 force element state 4 选择相应的 hover active focus visited 等伪类
  • 【MD5】js逆向

    今天学习MD5网页的破解 进行js逆向 MD5 是单向加密的一种方法 为32位 在进行该种加密方式的破解时 并不能直接破解 只能通过网页模拟MD5的加密 破解网页的登陆或者数据的加载 红人点集的md5登陆界面 1 按f12 进入调式窗口 点
  • Pytorch学习1-GRU使用和参数说明

    import torch nn as nn import torch gru nn GRU input size 50 hidden size 50 batch first True embed nn Embedding 3 50 x to

随机推荐

  • Redis GEO 的java实现(通过Jedis)(GIS相关)

    1 Redis的安装参考 https blog csdn net zhu tianwei article details 44890579 2 Jedis使用2 90版本 maven配置
  • Python Selenium库的使用【从安装到实战】

    Selenium Selenium简介 Selenium 的安装 Selenium基础操作 定位UI元素 鼠标动作链 键盘常用 下拉列表 填充表单 非select元素 鼠标悬浮 以后展现 select元素 其他一些常用功能 弹窗处理 页面切
  • pyqt5的QWebEngineView无法播放网络视频

    这个问题是2021年中旬遇到的 最近系统重装又出现这个问题所以解决并记录一下 具体就是可以实现打开网页 但是如果是视频链接就无法播放 例如 做类似抖音 快手网页版的视频播放器 或者其他类型的视频播放器等等如封面图 都会遇到只有黑窗口但无法播
  • 全网最火Java面试题

    第一部分 JAVA 基础 第一节 IO NIO 第二节 反射 第三节 多线程 第四节 集合 第五节 Web 第六节 其他 第七节 关键字 第八节 操作符 第九节 基础类型 第十节 异常 第十一节 JDBC 第十二节 OOP 第二部分 JVM
  • 深入理解Qt4/Qt5信号和槽机制

    对于事件处理 MFC中使用的是消息映射机制 Qt使用的是信号和槽机制 在我看来 Qt的信号和槽比MFC功能更强大 也更灵活 1 信号和槽的简单介绍 一般格式 connect Sender SIGNAL signal Receiver SLO
  • C++派生类的不同继承方式对基类的访问权限

    经过我细心的整理 形成了这张表 一张表说明派生类的不同继承方式 对基类的访问权限 总的来说 对类的访问权限范围public
  • 2022 CISCN初赛 Satool

    一个2022年国赛初赛的LLVM PASS类pwn题 当时还完全没有接触过 所以直接放弃掉了 初赛结束之后决定入门一下这方面知识 看这篇题解之前最好先看看之前写的这篇入门文章 LLVM PASS类pwn题入门 然后我们正式开始这道题 首先从
  • 07-js 逆向-返回数据加密(aes)

    目标 返回的结果有加密 把结果解密 可以看到返回来的data是加密的 但是加密的数据并没有进行混淆 这时候我们可以采用直接搜解密 decrypt 直接发先我们的数据书通过aes加密的 我们开始些python代码 from Crypto Ci
  • vndk: (native:vendor) should not link to libcamera_client (native:platform)

    1 0 相似例子 2 21 17 47 30 305 4365 4365 E CamX ERROR UTILS camxosutilslinux cpp 874 LibMap dlopen dlopen failed library lib
  • 利用mimikatz查看rdp连接密码【渗透测试】

    0x00 概述 在使用 rdp 时会发现系统有保存连接密码的功能 一定在本地以一种加密方式保存 在连接的时候解密进行rdp尝试 那么我们能不能那到加密的密码解密以获取这台机器rdp连接过的机器呢 0x01 流程 AppData Local
  • PUMA:DOA估计模式的改进实现(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 文献来源 下载链接 PUMA An Imp
  • ue4添加第三方库

    查了一些资料 发现最后都是用loadlibrary的方式 这样很不方便 如果有10000个函数 要写10000次么 仔细想想 调用第三方库无非就是把头文件和lib库设置下 把相应的 h lib和 dll放到相应的位置 再在调用的地方包含头文
  • cadence原理图封装pin名称重复_Cadence原理图库文件引脚名重复处理方法介绍

    立题简介 内容 Cadence原理图库文件引脚名重复处理方法 来源 实际使用得出 作用 介绍2种处理Cadence原理图库文件引脚名的方法 PCB环境 Cadence 16 6 orCAD环境 日期 2019 03 09 分割线 立题详解
  • spring打印http接口请求和响应

    在程序日志中打印出接口请求和响应的内容是一个基本的技术需求 如果在每个接口中实现请求响应的日志打印 程序编写会很繁琐 我们可以利用spring提供的机制 集中处理接口请求响应的日志打印 具体的代码参照 示例项目 https github c
  • 使用ipmitool命令检测电源模块状态

    1 通过ipmitool检查电源模块状态 https mp weixin qq com s Z1g79Q1aMhOT9Xm9fvIkjg 2 通过ipmitool获取服务器各元件温度信息 https mp weixin qq com s E
  • 大数据分布式计算开源框架Hadoop的介绍和运用

    Hadoop是Apache开源组织的一个分布式计算开源框架 在很多大型网站上都已经得到了应用 如亚马逊 Facebook和Yahoo等等 对于我来说 最近的一个使用点就是服务集成平台的日志分析 服务集成平台的日志量将会很大 而这也正好符合了
  • vue 快速自定义分页el-pagination

    vue 快速自定义分页el pagination template div style text align center div
  • main函数中的参数代表的意义

    int main int argc char argv 或者是 int main int argc char argv 里面的参数是什么意义呢 argc 是 argument count的缩写 表示传入main函数的参数个数 argv 是
  • 分享一个完整的Mybatis分页解决方案

    原文地址 http duanhengbin iteye com blog 1998017 参考地址 http blog csdn net isea533 article details 23831273 Mybatis 的物理分页是应用中的
  • 一起学ORBSLAM2(11)ORBSLAM的localmapping

    转载请注明原创地址 https blog csdn net qq 30356613 article category 6897125 ORBSLAM的局部建图线程实际做的工作是来维护全局map以及管理关键帧的 对tracking得到的关键帧