1.ORB-SLAM3系统概述

news2024/12/20 7:40:47

1.内容简介

本系列文章主要基于ORB-SLAM3代码、论文以及相关博客,对算法原理进行总结和梳理。

ORB-SLAM系列整体架构是不变的,都包含Tracking、LocalMapping和LoopClosing三个核心线程,中间伴随着优化过程。在ORB-SLAM3算法中比较突出的改进有两个:

  1. 引入IMU传感器,系统支持单目+IMU,双目+IMU和RGBD+IMU等三种模式
  2. 引入地图集Atlas这个概念,支持多个子地图并存,以及地图的保存和加载
    在这里插入图片描述

2. 跟踪线程Tracking

跟踪线程是算法的核心模块,输入一帧数据(双目指左右目图像,IMU模式下还包括时间戳上想对应的一组IMU数据),然后返回该帧对应的相机位姿,同时根据跟踪情况创建关键帧并传递给局部建图线程。跟踪线程主要包括以下几个模块:

  1. 纯视觉初始化:初始化第一帧图像位姿,将特征点三角化为3D地图点并初始化地图,主要包括单目初始化和双目初始化;IMU模式下还需要在局部建图线程进一步完成视觉与IMU的联合初始化
  2. 帧间跟踪:帧间跟踪包括跟踪运动模型和跟踪参考关键帧两部分,当环境比较友好系统跟踪比较顺利时仅通过跟踪运动模型即可获得较好的匹配关系,只有当跟踪运动模型得到的内点数量较少时才会跟踪参考关键帧
  3. 跟踪局部地图:局部地图的信息来自局部建图线程,主要将局部地图中的3D地图点投影到当前帧,进一步对当前帧位姿进行优化
  4. 重定位模块(当跟踪到的匹配点比较少时判定系统跟踪失败,此时调用重定位)
  5. 创建关键帧(围绕两个核心原则,当间隔时间比较长以及跟踪到的匹配点数量较少时创建关键帧)

在跟踪线程代码还设置了纯定位模式,但是经过实测即使在有先验地图的情况下,当运行时间比较长、经过光线比较差、剧烈运动时会导致相机位姿发生漂移,而且极为容易跟踪失败。

3. 局部建图线程

局部建图线程主要维护以下几个部分:当前关键帧的共视图Covisibility Graph、本质图Essential Graph和生成树Spanning Tree,局部地图主要由关键帧、关键帧特征点对应的3D地图点(世界坐标系)以及关键帧之间的连接关系组成。

当跟踪线程有新的关键帧传来时,会对局部地图中的关键帧进行更新,同时对当前局部地图中关键帧的位姿和地图点进行BA优化,最后对冗余的关键帧及其对应的地图点进行删除。

此外,在IMU模式下局部建图线程需要完成IMU的初始化(主要对偏置信息进行优化)和视觉惯导联合初始化。当IMU未完成初始化时局部建图线程只进行纯视觉BA,当IMU完成初始化后进行视觉-惯导联合BA优化

4. 回环检测线程

当局部建图线程处理完一帧关键帧后,会将该关键帧送入回环检测线程。回环检测线程主要包括检测共视区域、检测是否存在回环、计算相似变换、回环矫正

  1. 共视区域检测主要是看关键帧和之前已经创建的关键帧之间是否存在公共单词,如果存在再进一步分析检测到的共视关键帧是其他子弟图的还是当前子地图的
  2. 如果检测到的共视关键帧是其他子地图的,则将两个子地图进行融合;如果检测到的共视关键帧是当前子地图的,则有可能存在回环关系
  3. 如果存在回环关系则计算回环关键帧之间的相似变换,获取漂移的程度
  4. 如果相似变化计算成功,则根据漂移程度纠正回环处的累计误差

5. Atlas地图创建

5.1 Atlas地图简介

在ORB-SLAM3中使用了Atlas地图集的概念,在系统运行过程中支持保留多个子地图,其中已经跟踪失败的被暂时搁置的地图被称为non-active Map即不活跃地图,当前跟踪程序正在使用的被成为active map即活跃地图。

当因为跟踪失败重新初始化程序时,如果此刻已经跟踪了比较多(>15)的关键帧了,系统会将这部分地图保存下来,然后重新创建一个新的子地图。当回环检测模块检测到当前活跃子地图和之前的non-active Map存在共视区域和回环关系时,会将non-active Map融合到当前active map中。

在代码中Atlas地图集本质上就是一个ORB_SLAM3::Map*类型的集合,每新建一个子地图就是在这个集合中新增一个元素。

5.2 Atlas地图的保存与加载

Atlas地图的保存与加载是System类的私有成员函数,只有在配置文件中设置地图储存路径和加载路径时系统才会完成相应的功能,因为是私有成员函数,所以只能在程序结束时自动保存地图文件。可以将地图保存功能进行简单修改,通过ROS服务在终端实现地图的保存。

地图需要保存的信息:

  1. 关键帧(包含了关键帧的每个属性)
  2. 3D地图点(包含了3D地图点的每个属性)
  3. 子地图、关键帧、普通帧、地图点等一系列信息的ID,因为加载完先验地图后,新创建的地图、关键帧等对象的id要和之前的接上

地图保存和加载的方法:
通过boost库的序列化和反序列化功能可以之间将对象以字节的形式储存为二进制文件,在加载先验地图时也可以直接将整个对象读取进来取代当前系统中的Atlas对象

6.其他

6.1 ROS节点程序

作者自带的ROS节点程序较为简略,没有位姿发布的功能,推荐使用https://github.com/thien94/orb_slam3_ros版本

ROS节点程序实时接收图像和IMU数据,并进行时间戳对其,最终将时间对其后的一帧数据传递给SLAM系统,另外上述ORBSLAM的ROS版本还提供了相机位姿和轨迹发布功能,同时对位姿的坐标系转换成机器人坐标系(前-x轴,左-y轴,上-z轴)

6.2 ORBSLAM位姿

在VSLAM中位姿(Pose)指的是相机在世界坐标系下的位置坐标(x,y,z),以及朝向(qw,qx,qy,qz),ORBSLAM中使用Tcw作为相机的位姿表示,下面进行对该表示的解释

假设坐标远点位于Pw = (0,0,0,1,0,0,0)

  • t0时刻相机位于坐标系原点,t0时刻的位姿为:P_0 = T0w * Pw = Pw
  • t1时刻相机移动到了世界坐标系下的P_1 = (1,0,0,1,0,0,0)位置即t1时刻位姿, 其中P_1 = T10 * P_0 = T10 * T0w * Pw = T1w * Pw,因为P_w为坐标原点,t1时刻的位姿P_1在数值上为T1w中对应的平移和旋转;
  • t2时刻相机移动到了世界坐标系下的P_2 = (2,0,0,1,0,0,0)位置即t2时刻位姿, 其中P_2 = T21 * P_1 = T21 * T1w * Pw = T2w * Pw,因为P_w为坐标原点,t2时刻的位姿P_2在数值上为T2w中对应的平移和旋转;
  • 可以知道,第k时刻的相机位姿P_k = Tk(k-1) * Tk-1(k-2) * ... * T21 * T10 * Pw = Tkw * Pw,k时刻相机的位姿在数值上等于Tkw中的平移和旋转

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

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

相关文章

腾讯安全董志强:四大关键步骤促进数据安全治理闭环,提升企业免疫力

高速发展的数字时代,数据已成为推动产业发展的最重要生产要素之一,真正成为了创造经济财富的数字能源,守护数据资产的安全成为企业高质量发展不可回避的重要命题。 6月13日,腾讯安全联合IDC发布“数字安全免疫力”模型框架&#…

我被一家无货源电商培训公司骗了怎么办?

我是卢松松,点点上面的头像,欢迎关注我哦! 最近,一位被无货源电商培训骗的人找到了卢松松,她说: 老师,你好,我是被无货源电商课程骗了的受害人,走投无路了,想…

5个超好用的开源工具库分享~

在实际项目开发中,从稳定性和效率的角度考虑,重复造轮子是不被提倡的。但是,自己在学习过程中造轮子绝对是对自己百利而无一害的,造轮子是一种特别能够提高自己系统编程能力的手段。 今天分享几个我常用的开源工具库:…

大佬们都是如何编写测试方案的?

目录 1、背景 2、编写的方式 2.1 第一阶段:在需求评审开始前 2.2 第二阶段:在需求评审开始后,技术方案设计中 2.3 第三阶段:技术方案设计后 2.4 第四阶段:测试方案评审前 2.5 第五阶段:测试方案评审…

Opencv-C++笔记 (7) : opencv-文件操作XML和YMAL文件

文章目录 一、概述二、文件操作三、打开文件四、写入五、读写个人源码 一、概述 除了图像数据之外,有时程序中的尺寸较小的Mat类矩阵、字符串、数组等 数据也需要进行保存,这些数据通常保存成XML文件或者YAML文件。本小节中将介绍如何利用OpenCV 4中的函…

前端实现消息推送、即时通信、http简介

信息推送 服务端主动向客户端推送消息,使客户端能够即时接收到信息。 场景 页面接收到点赞,消息提醒聊天功能弹幕功能实时更新数据功能 实现即时通讯方式 短轮询 浏览器(客户端)每隔一段时间向服务器发送http请求,…

Google为TensorFlow设计的专用集成电路TPU3.0图片

Widrow也是在Minsky的影响下进入AI领域的,后来加入斯坦福大学任教。他在1960年提出了自适应线性单元(Adaline),一种和感知器类似的单层神经网络,用求导数方法来调整权重,所以说有“三十年神经网络经验”并不…

CI/CD 流水线 (FREE)

流水线是持续集成、交付和部署的顶级组件。 流水线包括: 工作,定义做什么。例如,编译或测试代码的作业。阶段,定义何时运行作业。例如,在编译代码的阶段之后运行测试的阶段。 作业由 runners 执行。如果有足够多的并…

Qt编写视频监控系统79-四种界面导航栏的设计

一、前言 最初视频监控系统按照二级菜单的设计思路,顶部标题栏一级菜单,左侧对应二级菜单,最初采用图片在上面,文字在下面的按钮方式展示,随着功能的增加,二级菜单越来越多,如果都是这个图文上…

openGauss数据库安装,配置连接 完整版Centos7

服务器版本:Centos7.6 || 7.9 数据库版本:openGauss-5.0.0-CentOS-64bit.tar.bz2 极简版 目录 修改系统参数安装环境安装openGauss数据库配置连接数据库使用navicat连接数据库 修改系统参数 ##修改 /etc/selinux/config 文件中的“SELINUX”值为“disa…

【网络安全】成功上岸深信服,这套面试题你肯定需要!!!

时间过得很快,回想起去年的这个时候,我也正在准备秋招,今天的我刚刚结束培训。 我的个人情况就读于某双非大学,信息与计算科学(大数据方向,校企合作,一个介于数学与计算机之间的专业&#xff0…

移动端H5使用window.open跳转,IOS不生效解决

移动端H5使用window.open跳转,IOS不生效解决 navigator navigator对象,用于提供当前浏览器及操作系统等信息,这些信息都放在navigator的各个属性中。navigator对象也是window对象的成员。 打印navigator对象 userAgent在安卓和IOS的打印结…

Opencv-C++笔记 (9) : opencv-多通道分离和合并

文章目录 一、概论二、多通道分离函数split()三、多通道合并函数merge()四、图像多通道分离与合并例程 一、概论 在图像颜色模型中不同的分量存放在不同的通道中,如果我们只需要颜色模型的某一个分量,例如只需要处理RGB图像中的红色通道,可以…

科技云报道:大模型时代,SaaS元年才真的到来了?

科技云报道原创。 ChatGPT席卷全球后,如果有人问AI大模型影响最大的会是哪个行业?SaaS领域肯定是不二之选。 目前全球各大科技公司已宣称要用大模型触及、整合所有产品。 其中,微软率先为其办公家族装配上了各类copilot,开发者…

Opencv-C++笔记 (10) : opencv-图像像素计算

文章目录 一、概率寻找图像像素的最大值和最小值计算图像的均值和标准方差 一、概率 我们可以将数字图像理解成一定尺寸的矩阵,矩阵中每个元素的大小表示了图像中每个像素的亮暗程度,因此统计矩阵中的最大值,就是寻找图像中灰度值最大的像素…

人机交互学习-7 可视化设计

可视化设计 窗口与菜单窗口窗口Window窗口界面类型 菜单注意事项 对话框模态对话框非模态对话框属性对话框功能对话框进度对话框公告对话框错误对话框消除错误信息 警告对话框确认对话框消除确认对话框 管理对话框内容标签对话框扩展对话框级联对话框 对话框设计原则 控件工具栏…

内部类~~

1:一个类中再定义一个类 2:内部类的使用场景,作用 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整结构又只为外部事物提供服务,那么整个内部的完整结构可以选择使用内部类来设…

“大龄”码农的“中年危机”:35岁之后,IT计算机的出路在哪?

前言 对于一个工作不下于4年的人来说,我觉得我有一定的思考沉淀来回答这个问题。 说说我的一些经历吧。 普通一本毕业,专业是自动化,大学由于挂科太多没拿到学位证到上海找实习,一开始做的是开发,从16年到19年都是做…

警惕冒充“数字人民币”诈骗案!

现在大家越来越习惯使用电子支付的方式,数字支付方式的需求也在不断增长。然而一些犯罪嫌疑人却看到了可乘之机,近日,山东菏泽曹县警方破获了一起利用数字人民币,实施诈骗的案件,受骗群众高达上万人。 家住山东菏泽曹…

基于浏览器渲染的组件测试

目录 为什么需要自动化测试 测试的类型 组件测试的方式 白盒测试 黑盒测试 灰盒测试 推荐的方案 Playwright 组件测试案例 Playwright 简介 playwright 架构图 BrowserContext 组件测试原理 组件引入 模型封装 组件渲染测试 组件 Props 测试 组件 Events 测试…