09 闭环线程 LoopClosing

news2024/11/6 7:25:21

文章目录

    • 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.coloradmin.cn/o/1484862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础二分学习笔记

模板 : 个人倾向第一种 ; 整数二分 : 最大化查找 : 可行区域在左侧 : 查找最后一个<q的数的下标 : int find(int q){// 查找最后一个 < q 的下标 int l 0 , r n 1 ;while(l 1 < r){int mid l r >> 1 ;if(a[mid]<q) l mid ;else r mid ;}return…

微信小程序云开发教程——墨刀原型工具入门(编辑页面)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

CTFHUB 命令执行

命令执行 原理&#xff1a; 在编写程序的时候&#xff0c;当碰到要执行系统命令来获取一些信息时&#xff0c;就要调用外部命令的函数&#xff0c;比如php中的exec()、system()等&#xff0c;如果这些函数的参数是由用户所提供的&#xff0c;那么恶意用户就可能通过构造命令拼…

python统计分析——泊松回归

参考资料&#xff1a;用python动手学统计学 概率分布为泊松分布、联系函数为对数函数的广义线性模型叫作泊松回归。解释变量可以有多个&#xff0c;连续型和分类型的解释变量也可以同时存在。 1、案例说明 分析不同气温与啤酒销量的关系。构造不同气温下的销量的数学模型&…

LeetCode 热题 HOT 100(P1~P10)

&#x1f525; LeetCode 热题 HOT 100 这里记录下刷题过程中的心得&#xff0c;其实算法题基本就是个套路问题&#xff0c;很多时候你不知道套路或者模板&#xff0c;第一次尝试去做的时候就会非常懵逼、沮丧和无助。而且就算你一时理解并掌握了&#xff0c;过一段时间往往会绝…

Unity--自动版面(Horizontal Layout Croup)||Unity--自动版面(Vertical Layout Group)

Unity--自动版面&#xff08;Horizontal Layout Croup&#xff09; Horizontal Layout Croup&#xff1a; “水平布局组”组件将其子布局元素并排放置。它们的宽度由各自的最小&#xff0c;首选和灵活的宽度决定&#xff0c;具体取决于以下模型&#xff1a; 所有子布局元素的…

【数据结构】知识点一:线性表之顺序表

内容导航 一、什么是线性表&#xff1f;二、什么是顺序表&#xff1f;1、顺序表的概念2、顺序表的结构a. 静态顺序表&#xff1a;使用定长数组存储元素。b. 动态顺序表&#xff1a;使用动态开辟的数组存储。 三、顺序表的接口实现精讲1.接口一&#xff1a;打印数据2.接口二&…

Vue组件置底方法,ElementPlus布局

问题描述 在开发网页时使用了elementplus的el-container组件 组件里分成了main和footer两块&#xff0c;但是想要将两个按钮置底在容器底部遇到了困难 如下图所示&#xff0c;在网页开发者工具可见两个按钮与左侧的图片没有底部对齐 此时我的代码是这样 <el-footer>&…

探讨倒排索引Elasticsearch面试与实战:从理论到实践

在当前大数据时代&#xff0c;Elasticsearch&#xff08;以下简称为ES&#xff09;作为一种强大的搜索和分析引擎&#xff0c;受到了越来越多企业的青睐。因此&#xff0c;对于工程师来说&#xff0c;掌握ES的面试准备和实战经验成为了必备技能之一。本文将从ES的面试准备和实际…

Redis高级特性和应用(发布、订阅、Stream、慢查询、Pipeline、事务、Lua)

Redis高级特性和应用 发布和订阅 Redis提供了基于“发布/订阅”模式的消息机制&#xff0c;此种模式下&#xff0c;消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道( channel)发布消息&#xff0c;订阅该频道的每个客户端都可以收到该消息。 操作命令 Redis主要…

专为大模型训练优化,百度集合通信库 BCCL 万卡集群快速定位故障

1 集合通信对分布式训练至关重要 在分布式训练中&#xff0c;每一块 GPU 只负责处理部分模型或者数据。集群中不同 GPU 之间通过集合通信的方式&#xff0c;完成梯度同步和参数更新等操作&#xff0c;使得所有 GPU 能够作为一个整体加速模型训练。 如果有一块 GPU 在集合通…

基于BP-Adaboost的预测与分类,附MATLAB代码免费获取

今天为大家带来一期基于BP-Adaboost的预测与分类。代码中的BP可以替换为任意的机器学习算法。 原理详解 BP-AdaBoos模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。关于更多的原…

Ps:历史记录面板

Ps菜单&#xff1a;窗口/历史记录 Window/History 历史记录 History面板提供了对图像编辑过程中所进行更改的深入控制&#xff0c;可以让用户回溯并查看每一步操作&#xff0c;从而允许用户轻松撤销错误或比较不同的编辑效果。 ◆ ◆ ◆ 常用操作方法与技巧 “历史记录”面板…

解决 MySQL 未运行但锁文件存在的问题

查看mysql状态时&#xff0c;显示错误信息"ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists"。 解决步骤 1、检查 MySQL 进程是否正在运行 在继续之前&#xff0c;我们首先需要确定 MySQL 进程是否正在运行。我们可以使用以下命令检查…

【Mybatis】多表映射 第二期

文章目录 一、多表映射概念二、对一映射三、对多映射四、多表映射总结4.1 多表映射优化4.2 多表映射总结 一、多表映射概念 多表关系&#xff1a; 一对一一对多 | 多对一多对多 一个 客户 对应 多个订单一个订单 对应 一个客户 举例&#xff1a; 对一 实体类设计&#xff1a…

2024最新算法:鹦鹉优化算法(Parrot optimizer,PO)求解23个基准函数(提供MATLAB代码)

一、鹦鹉优化算法 鹦鹉优化算法&#xff08;Parrot optimizer&#xff0c;PO&#xff09;由Junbo Lian等人于2024年提出的一种高效的元启发式算法&#xff0c;该算法从驯养的鹦鹉中观察到的觅食、停留、交流和对陌生人行为的恐惧中汲取灵感。这些行为被封装在四个不同的公式中…

vs code更新后json文件无法识别通配符 ,编译多文件失败的解决办法

问题描述 在Mac或者LInux上&#xff0c;进行C/C相同路径下进行多文件编译时&#xff0c;之前设置好的json文件突然不能解释通配符&#xff0c;并且将带有单引号的地址传给clang&#xff0c;由于*.c被扩在单引号中&#xff0c;clang找不到文件导致失败。 如果将命令端中的指令复…

Mysql标量子查询

目录 子查询标量子查询数据准备 子查询 SQL语句中嵌套select语句&#xff0c;称为嵌套查询&#xff0c;又称子查询。 SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... );子查询外部的语句可以是insert / update / delete / select 的任何一个&…

如何将一个远程git的所有分支推到另一个远程分支上

如何将一个远程git的所有分支推到另一个远程分支上 最初有 12 个分支 执行 git remote add 远程名 远程git地址 git push 远程名 --tags "refs/remotes/origin/*:refs/heads/*"之后就变成 26个分支

Visual Studio C++项目远程断点调试客户现场程序方法

前言 程序开发一个很常见的场景&#xff0c;就是程序在自己本地部署调试明明一点问题都没有&#xff0c;但是部署到客户现场就问题百出&#xff0c;要调试起来还很困难&#xff0c;在自己本地也没有条件复现&#xff0c;很多时候只能靠日志一点点排查和猜测&#xff0c;耗费大…