09 闭环线程 LoopClosing

文章目录

    • 09 闭环线程 LoopClosing
      • 9.1 主函数:Run()
        • 9.1.1 闭环检测
        • 9.1.2 计算Sim3变换(相似变换): ComputeSim3()
        • 9.1.4 闭环矫正: CorrectLoop()

09 闭环线程 LoopClosing

9.1 主函数:Run()

成员函数/变量访问控制意义
CheckNewKeyFrames()protected查看队列中是否有未处理的关键帧
DetectLoop()protected检测是否有回环
ComputeSim3()protected计算当前关键帧和闭环关键帧之间的相似变换矩阵
CorrectLoop()protected回环矫正

主要流程

YES
NO
发生回环
未发生回环
计算失败或重投影误差过大
计算成功
检测队列中是否存在未处理的关键帧CheckNewKeyFrames
检测是否回环DetectLoop
当前线程暂停5ms
计算Sim3变换ComputeSim3
回环矫正CorrectLoop
9.1.1 闭环检测

LoopClosing 类中定义了 ConsistentGroup 类型,表示关键帧组,

typedef pair<set<KeyFrame *>, int> ConsistentGroup
  • 第一个元素表示一组共视关键帧;
  • 第二个元素表示该关键帧组的连续长度。
成员函数/变量访问控制意义
KeyFrame *mpCurrentKFprotected当前关键帧
KeyFrame *mpMatchedKFprotected当前关键帧的闭环匹配关键帧
std::vector<ConsistentGroup> mvConsistentGroupsprotected前一关键帧的闭环候选关键帧组
vCurrentConsistentGroupsprotected当前关键帧的闭环候选关键帧组
std::vector<KeyFrame *> mvpEnoughConsistentCandidatesprotected所有达到足够连续数的关键帧

闭环检测原理: 若连续 4 个关键帧都能在数据库中找到对应的闭环匹配关键帧组,且这些闭环匹配关键帧组间是连续的,则认为实现闭环。

在这里插入图片描述

具体步骤如下:

① 找到当前关键帧 mpCurrentKF 的闭环候选关键帧 vpCandidateKFs,闭环候选关键帧取自于 与当前关键帧有相同 BOW 向量,但不存在直接连接的关键帧。
在这里插入图片描述

② 将闭环候选关键帧和其共视关键帧组合成为关键帧组 vCurrentConsistentGroups

在这里插入图片描述

③ 在当前关键组和前一帧的连续关键组间寻找连续关系,关键帧组的连续关系是指两个关键帧组间是否有关键帧同时存在于两关键帧组中。

  • 若当前关键帧组在之前的连续关键帧组中找到连续关系,则当前的连续关键帧组的连续长度加1;

  • 若当前关键帧组在之前的连续关键帧组中没能找到连续关系,则当前关键帧组的连续长度为0。

在这里插入图片描述

若某关键帧组的连续长度达到3,则认为该关键帧实现闭环。

9.1.2 计算Sim3变换(相似变换): ComputeSim3()

Sim3 变换即相似变换,包含旋转、平移和尺度因子。当机器人绕了一圈后,累积误差会很大,可能产生漂移。对于单目相机来说,深度信息是需要考虑的,也就是尺度因子;对于双目相机和 RGBD 相机,通常认为没有尺度漂移。

由于累计误差的存在,检测到回环后,当前关键帧和闭环关键帧的位姿并不是相等的,这时就需要计算二者之间的相似变换矩阵,用于后续优化。

成员函数/变量访问控制意义
std::vector<KeyFrame *> mvpEnoughConsistentCandidatesprotected在函数LoopClosing::DetectLoop()中找到的有足够连续性的闭环关键帧
g2o::Sim3 mg2oScw
cv::Mat mScwprotected世界坐标系w到相机坐标系c的Sim3变换
std::vector<MapPoint *> mvpLoopMapPointsprotected闭环关键帧组中的地图点
std::vector<MapPoint *> mvpCurrentMatchedPointsprotected当前帧到 mvpLoopMapPoints 的匹配关系 mvpCurrentMatchedPoints[i] 表示当前帧第 i 个特征点对应的地图点
匹配成功
匹配失败
求解失败
求解成功
优化失败
优化成功
匹配失败
匹配成功
根据词袋向量粗匹配
进行Sim3求解
计算失败
Sim3优化:只优化Sim3
根据之前计算的Sim3进行投影匹配
计算成功
9.1.4 闭环矫正: CorrectLoop()

函数 LoopClosing::CorrectLoop() 的主要流程:

① Sim3 位姿传播:

  • 将Sim3位姿传播到局部关键帧组上
  • 将Sim3位姿传播到局部地图点上

② 地图点融合:

  • 将闭环关键帧组地图点投影到当前关键帧上
  • 将闭环关键帧组地图点投影到局部关键帧组上

③ BA优化:

  • 本质图BA优化: 优化所有地图点和关键帧位姿,基于本质图
  • 全局BA优化: 优化所有地图点和关键帧位姿,基于地图点到关键帧的投影关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511746.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【单调栈】Leetcode 739.每日温度

【单调栈】Leetcode 739.每日温度 解法&#xff1a;维护单调栈栈中存的是数组的索引 解法&#xff1a;维护单调栈栈中存的是数组的索引 栈中存的是数组的索引 当新的值比当前栈顶的大&#xff0c;那么就执行出栈-更新result数组-判断当新的值比当前栈顶的大&#xff1f;的循环…

笨办法学 Python3 第五版(预览)(二)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 练习 19&#xff1a;函数和变量 现在你将把函数与你从之前练习中了解到的变量结合起来。如你所知&#xff0c;变量给数据片段一个名称&#x…

tomcat优化、nginx +tomcat 部署 (三)

在目前流行的互联网架构中&#xff0c;Tomcat在目前的网络编程中是举足轻重的&#xff0c;由于Tomcat的运行依赖于JVM&#xff0c;从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM 和 Tomcat 自身调优两部分 Tomcat 是一个流行的开源 Java 服务器&#xff0c;用于托管 Java …

亚信安慧AntDB:融合架构下的数据管理利器

AntDB的独特架构将集中式和分布式部署模式巧妙融合&#xff0c;为用户提供了全方位的数据管理解决方案。这种一站式的特性使得用户无需在不同系统间来回切换&#xff0c;极大地提高了工作效率。 AntDB同时具备集中式和分布式系统的优点&#xff0c;集中式架构拥有简单易用、管…

正则表达式-分组

1、oracle-正则表达式&#xff1a;将09/29/2008 用正则表达式转换成2008-09-29 select regexp_replace(09/29/2008, ^([0-9]{2})/([0-9]{2})/([0-9]{4})$, \3-\1-\2) replace from dual; 解析&#xff1a;regexp_replace-替换&#xff0c; 第一个参数&#xff1a;需要进行处…

(一)多层感知器(神经网络)与激活函数--九五小庞

单个神经元&#xff08;二分类&#xff09; 多个神经元&#xff08;多分类&#xff09; 多层感知器 多层感知器&#xff0c;他是一种深度学习模型&#xff0c;通过多层神经元的连接和激活来解决非线性问题。 激活函数 激活函数的种类包括relu&#xff0c;sigmoid和tanh等 …

WebGIS开发0基础必看教程:通过行列号来换算出多种瓦片的URL之在线地图(下)

1.前言 这篇文章里&#xff0c;我主要针对OGC标准中的WMS、WMTS以及ArcGIS的在线地图服务来进行解析。 写之前&#xff0c;我先来给大家提一下OGC是什么。OGC的全名是Open GIS Consortium&#xff0c;中文名是开放地理空间信息联盟&#xff0c;它是一个是非盈利、志愿的国际标…

30分钟做200多张报表的金蝶云星空BI方案来了

曾经一张报表都要做好久&#xff0c;但现在&#xff0c;200多张的BI数据分析报表只需30分钟就能完成&#xff01;BI智能数据分析的高效性在这一刻具象化了。奥威-金蝶云星空BI方案&#xff0c;一套注册、下载、执行&#xff0c;即见效果的标准化BI数据分析方案。 30分钟&#…

k8s-prometheus应用监控 23

使用prometheus监控&#xff0c;结合prometheus传递的指标&#xff0c;从而实现业务监控的自动化弹缩。 注&#xff1a;部署集群需要消耗较大的内存&#xff0c;需要提前扩容各节点的内存量至少达到4g 部署一个用于被监控的应用 上传所需镜像 修改yaml文件 部署完成 没有就绪是…

【Python】进阶学习:pandas--rename()用法详解

【Python】进阶学习&#xff1a;pandas-- rename()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的…

C语言常见关键字:一文打尽

关键字 1. 前言2. 什么是关键字3. extern-声明外部符号4. auto-自动5. typedef-类型重定义&#xff08;类型重命名&#xff09;6. register-寄存器6.1 存储器6.2 register关键字的作用 7. static-静态7.1 static修饰局部变量7.1.1 代码对比7.1.2 原理分析 7.2 static修饰全局变…

Scrapy与分布式开发(3):Scrapy核心组件与运行机制

Scrapy核心组件与运行机制 引言 这一章开始讲解Scrapy核心组件的功能与作用&#xff0c;通过流程图了解整体的运行机制&#xff0c;然后了解它的安装与项目创建&#xff0c;为后续实战做好准备。 Scrapy定义 Scrapy是一个为了爬取网站数据、提取结构性数据而编写的应用框架…