当前位置: 首页 > 编程日记 > 正文

ORBSLAM-Altas:多地图SLAM

ORBSLAM-Atlas:多地图SLAM

  • 这篇博客
  • ORBSLAM-Altas
    • 这个系统
    • 系统方法
      • 两类子地图
      • 新地图的构建
        • 相机位姿的可观测性
      • 子地图融合
    • 系统线程
  • 结尾

这篇博客

最近ORB-SLAM3横空出世,马上跑去GitHub膜拜。然后在项目的相关工作中看到了ORB-SLAM3使用了一个多地图方法。这个方法对应的论文介绍的就是ORBSLAM-Atlas系统的。为了之后更好地理解ORB-SLAM3和代码,抓紧跑去把这个多地图的论文给看一遍,再默默地记下笔记。
【转载声明】本篇文字均为原创,如转载请注明出处

ORBSLAM-Altas

这个系统

系统摘要:
 ORBSLAM-Atlas系统是ORB-SLAM向多地图领域的一个扩展研究,它在机器跟踪丢失时不会直接停止地图更新(ORB-SLAM会停止更新地图,然后等着机器回来以后进行重定位),而是马上重新构建一个新的子地图,之前的地图先保存起来。
 如果当前在使用的地图与之前的保存的地图存在闭环,则将两个地图进行融合。之后使用融合后的地图继续进行跟踪操作。

系统方法

图1是ORBSLAM-Atlas系统的结构框图。

可以看出,系统框图和ORB-SLAM的框图十分相似。区别明显的地方有有:
1、系统中有两类子地图:Active map和Non-active map;
2、跟踪线程要判断是否需要构建新的地图以供跟踪;
3、检测的闭环可以是在同一个子地图中,也可以在不同子地图中。
 下面就针对上述内容进行介绍。

两类子地图

ORBSLAM-Atlas系统会保留两类子地图:Active map和Non-active map。其中Active map是当前跟踪线程所使用的地图(Active Map >=Local Map),Non-active则是之前跟踪丢失后保留下来的所有地图。如果Active map与Non-active map存在闭环,那么就会将两个存在闭环的地图融合起来,然后系统使用融合后的地图作为新的Active map使用。
 每个子地图都是独立的,它们的第一参考帧也都是独立的。系统使用一个能够适应于所有子地图的DBoW2词袋来描述每一个子地图,以便完成地图融合操作。

 这种做法的好处有:
1、在跟踪丢失后系统通过创建新的地图来继续工作;
2、构建多个子地图可以降低误差的累积;
3、所有子地图融合后获得完整地图。这个融合后的地图相比于ORB-SLAM构建的一整个地图,在精度方面会有所提高(有部分原因是剔除了一些精度较低或是跟踪丢失的轨迹)。

新地图的构建

ORBSLAM-Atlas系统的跟踪线程需要判断是否跟踪丢失,再决定是否构建新的地图。新地图构建和初始化的过程相同,最重要的是何时构建新地图。论文阐述了两个条件来判断跟踪是否丢失:

1、当前帧跟踪到的地图点数目:设NNN为当前帧跟踪到的局部地图中的地图点数量。如果NNN大于给定阈值,则认为跟踪良好,否则跟踪丢失。
2、相机位姿的可观测性:如果NNN中的地图点的几何条件较差,则认为当前帧的位姿估计值精度较低,认为跟踪丢失。

 第一条很好理解,第二条则是论文提出的一种新的判断丢失的标准(更加严格)。第二条可以通过下图来理解:
在这里插入图片描述
 从图中可以看到,当前帧跟踪到的地图点数量NNN很多,肯定能满足第一条标准。但是跟踪到的点大多距离相机很远(远在天边~)。太远的地图点会降低在平移运动上的估计值的精度(如:走一两步几乎不会影响远点在当前图像上的成像)。所以最后的估计的位姿精度较差,如果保留这些较差的估计值,那么就会直接影响到之后图优化的精度。
 所以系统将这些较差的位姿剔除,从这时开始构建一个新的子地图。这样就将那些误差较大的轨迹排除在外了。下图就是这种作法的一个例子。

 图中的P1是一部分精度较差的位姿估计值,P2、P3则是一个闭环。图b因为保留了P1,以至于影响到了最后闭环优化的精度。而下面的图则直接剔除了P1部分,保证了最终轨迹的一个估计精度。论文也给了“相机位姿可观测性”的具体判断公式:

相机位姿的可观测性

通过相机位姿的误差协方差来估计其位姿的观测性。首先假设 Active map 中的地图点都是精确的,然后用Ωi,j\Omega _{i,j}Ωi,j表示地图点观测xi,jx_{i,j}xi,j的不确定性,其中xi,jx_{i,j}xi,j表示的是地图点 jjj 在第 iii 个相机上的观测值。
 定义T^i,wϵSE(3)\hat{T}_{i,w} \epsilon SE(3)T^i,wϵSE(3)是当前相机的位姿估计值,用εi\varepsilon _{i}εi表示估计值的不确定性(εi\varepsilon _{i}εi是六维向量且服从均值为0的高斯分布)。然后有以下式子:
在这里插入图片描述
其中CiC_{i}Ci表示估计位姿的精度,Ji,jJ_{i,j}Ji,j是第 i 个相机的位姿估计值关于第 j 个地图点的雅可比矩阵。然后通过 公式 (1) 就能判断相机的可观测性了:
在这里插入图片描述

子地图融合

如果在两个地图之间检测到了闭环,那么就要进行地图融合。然后用融合后的地图替换掉那两个地图。下面介绍具体的融合方法,以及融合后的优化操作。以下用 a,s,ma , s , masm 下标分别标记:Active map,Non-active map和融合后地图(用 a地图a地图a表示Active map,s地图s地图s表示Non-active map,m地图m地图m表示融合后的地图)。

 1、检测到Active 和Non-active 两地图间的闭环,产生两个匹配的KFs:Ka,KsKFs:Ka,KsKFsKaKs,以及两个地图间匹配的地图点集合Ma,MsMa,MsMaMs
 2、估计两个地图之间的对齐变换矩阵。对齐变换矩阵(在双目情况下属于SE3SE3SE3,单目则是Sim3Sim3Sim3)用来完成 s地图s地图s中地图和关键帧到 a地图a地图a坐标系的转换。具体分为两步:
  1)通过MaMaMaMsMsMs这些匹配的地图点来进行初始估计,并用 RANSAC 算法提高估计值精度。
  2)再根据 MaMaMaKsKsKs 上的匹配点,构建重投影误差。最后由非线性优化来优化重投影误
  差,以获得最终的位姿估计值。
 3、融合子地图:完成地图对齐后,将两个地图中重叠的地图点进行融合、更新,获得精度更高的地图点。两个子地图的可视图也保留在融合后的m地图m地图m中。
 4、在子地图的闭环部分进行局部 BA 优化。在融合后的m地图m地图m中,找到KaKaKaKsKsKs。根据a地图a地图a原有的可视图,确定a地图a地图a中哪些KFsKFsKFs是固定的(不再 Local Map 中)。这些固定的KFsKFsKFsm地图m地图m中仍然固定。然后对m地图m地图m中剩余的KFsKFsKFs进行 BA 优化。
 5、对 m地图m地图m 进行完整的位姿图优化。

如果是在Active map中检测到闭环,那么就和ORB-SLAM中的操作一样,只对Active map进行闭环操作。

系统线程

论文还提到了各线程之间的一些关系。地图融合会在一个单独的线程中进行。在融合开始前,会将Local Mapping线程暂停,以防止新的KFKFKF产生。在地图融合的过程中,跟踪线程会继续使用 Active map 来达到实时工作的目的。当融合结束后,跟踪线程会将融合后的地图作为新的 Active map 来使用。

结尾

至此,这篇博客的主要内容就结束了。ORBSLAM-Atlas系统主要提供一种多地图SLAM的思路。它能够提高系统的鲁棒性和精度。但看完论文后我产生了一下几个疑问:
1、这个系统会剔除掉那些由第二条丢失判断标准找出的KFsKFsKFs。这会使最后的地图出现一个缺口,降低地图的完整性。
2、如果有些子地图没有机会进行融合,那最后该怎么处理?是否会被直接抛弃?
 先把这些问题记在小本本上,等学的更加深入后,也许就会有解决疑问的灵感了。

相关文章:

Android驱动学习-内部机制_回顾binder框架关键点

内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie client使用服务前要先getService:会在驱动程序里对该服务构造一个binder_ref, binder_ref含有desc, node成员…

数据库--事务

我们知道数据库中的SQL语句分为DDL(数据定义语言)、DQL(数据查询语言)、DML(数据操纵语言)、DCL(数据控制语言),详情请看SQL语句 当数据库的表中数据执行完添加、删除、和修改等数据操纵语言(DML)后,需要执行commit(提交)数据控制…

2021年中国工业互联网安全大赛核能行业赛道writeup之传统流量取证

附件题:传统流量取证 题目描述: 在某次攻防演练中,小王发现流量探针平台突然告警,小王第一时间下载了告警流量包,并进行分析:发现攻击队攻击在攻入内网后,利用了一个内网OA的一个漏洞&#xff…

ORB-SLAM3 论文笔记

ORB-SLAM3 论文笔记这篇博客ORB-SLAM3系统相机模型的抽象(Camera Model)重定位的问题图片矫正的问题视觉惯性SLAM的工作原理相关公式IMU初始化跟踪和建图系统对跟踪丢失的应对多地图的闭环检测和地图融合位置识别视觉地图融合方法视觉惯性地图的融合方法单个地图中的闭环融合结…

为什么需要 外键 呢?

生活现象: 不知你们是否遇到过这样的现象,就是你辛辛苦苦花了几十块钱注册一个会员,结果家里的七大姑,八大姨都要拿去用,而且完全可以用。还有就是一个淘宝账号里却可以添加好多个收获地址(里面包括收货人的姓名&#…

JavaScript闭包函数箭头函数调用与执行

一、标准的闭包函数 //一、标准的闭包函数 function A() {var i0;i;console.log(i : i);return function b() {return function c() {return i}} }var a A(); // 初始化A,执行A内的非function语句 ‘ i0; i‘,输出 I : 1 console.log(a()); // 执行fu…

jlink api sdk c# 离线数获取 标定

jlink 如何 离开 keil、IAR 监控变量呢? 目前 jlink的 api 可以做到,自己可以用C# 做一个 上位机,监控RAM里面的变量。而不用打开keil 调试。还可以 刷写 flash,可以用在产品量产的刷写上。SEGGER 的 jlink sdk并不是免费的&…

2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析

目录 一、USB协议 二、键盘流量 三、鼠标流量 四、writeup 附件题:usb流量分析 题目描述: 具体描述忘记了o(╯□╰)o 大概意思是有个U盘插到电脑上,然后经过一些操作导致该电脑重启了。找到这个过程中的flag。 附件下载: 20…

BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)

BOS项目 第2天 今天内容安排: 1、根据提供的pdm文件生成sql 2、持久层和表现层设计---BaseDao、BaseAction 3、实现用户登录功能 4、jQuery EasyUI 消息提示控件 5、jQuery EasyUI menubutton菜单按钮 6、自定义struts2拦截器,实现用户未登录自动跳转到…

服务器 主动 推送 客户端浏览器 消息***

前言 通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端向服务器端发出请求,然后服务器端返回数据给客户端,客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客户端请…

数据库表(字段类型、约束、截断表、修改表字段、重命名表)

字段类型: 在这里只列举一些常用的字段类型: 整数类型:int(Integer):普通大小的整数 小数类型: float(m,d):单精度浮点数,m表示数字长度,d表示小数位数,例如float(5,2)最大值999.99double(m,d…

(转载)动态SLAM系统:VDO-SLAM!

动态SLAM系统:VDO-SLAM!这篇博客是转载 计算机视觉life 公众号中的文章。这篇文章是对VDO-SLAM论文的全文翻译,是 !!真人工翻译!!不是机器翻译,我看了之后觉得挺好,所以分…

2021年中国工业互联网安全大赛核能行业赛道writeup之入门的黑客

附件题:入门的黑客 题目描述: 在某次工控攻防演练中,防守方使用蜜罐捕捉到了某黑客在入侵时留下的恶意程序样本,现在要对该黑客进行画像,需要从该恶意程序中分析出反连时的IP和端口信息,看看聪明的你能否能…

一种视觉惯性+激光传感器的SLAM系统

一种视觉惯性激光传感器的SLAM系统这篇博客论文摘要一些假设和标注系统总览VI 里程计扫描匹配(scan matching)优化提高系统鲁棒性的措施闭环检测和临近检测全局位姿图优化总结这篇博客 这篇论文“Robust High Accuracy Visual-Inertial-Laser SLAM Syste…

抽象类和接口的联系与区别

抽象类和接口联系与区别 关键字: 抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具…

P1132 数字生成游戏

题目描述 小明完成了这样一个数字生成游戏,对于一个不包含00的数字ss来说,有以下33种生成新的数的规则: 将ss的任意两位对换生成新的数字,例如143143可以生成314,413,134314,413,134;将ss的任意一位删除生成新的数字&a…

MySQL02-升级

MySQL 版本号由三个数字和可选后缀组成,形式 mysql-x.y.z-suffix。比如 mysql-5.7.21 或者 mysql-5.7.34。 x(5)这位是大版本y(7)这位是小版本,大版本小版本组合成 5.7 就是一个发行版最后一位是bugfix release版本,从1逐渐增加,…

Kinect V1读取图像数据(For Windows)

Kinect V1读取图像数据(For Windows)这篇博客Kinect V1介绍数据读取的基本流程运行代码和注释结尾这篇博客 刚好有一台现成的Kinect V1相机,所以就拿过来学习一下它的数据读取方式和编程方法,毕竟它还能用于跑RGBD-SLAM。Kinect V…

1.IocDI和Spring

1.面向对象回顾和案例 面向对象程序设计:1 2 3 4 案例分析: 需求分析: 报表功能: 报表服务类,检索数据,并生成图标 报表生成器类,生成不同格式的报表文件,例如PDF格式、Html…

MySQL之模糊查询

先在MySQL数据库里创建一个表,并添加几条数据: create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa…

rsync工具

rsync工具一、介绍1、可以实现 本地数据 《----------》 远程数据/本地数据 的传输2、两种通信方式(man rsync)(1)remote shell(一个冒号:),通过sshd协议传输(2&#xf…

2021年中国工业互联网安全大赛核能行业赛道writeup之日志分析

附件题:日志分析 题目描述: 核电站新来的运维小王粗心把一个办公网地址映射到外网,遭到大量攻击,你能从日志当中找到有效信息吗。 附件下载: 2021-10-12T15_37_51.61064600_00rizhifenxi.rar-网络攻防文档类资源-CSD…

【POJ1509】Glass Beads 【后缀自动机】

题意 给出一个字符串,求它的最小表示法。 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的时候就停…

order by总结

先在MySQL数据库里建一个表,并添加几条数据: create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa23…

Gazebo构建小车模型并通过ROS控制

Gazebo构建小车模型并通过ROS控制介绍编写车子的URDF文件编写控制小车移动的插件(与ROS交互)结尾介绍 突然想试试Gazebo这款仿真软件,因为它可以让你在任何时候都有机器人玩。但Gazebo的机制也比较复杂,所以还是先学习一下如何搭一个简单的小车&#xff…

【杂项】SVN服务器的本地搭建和使用

转载于:https://www.cnblogs.com/haizhibin1989/p/6939025.html

编译vim-8.2并配置jedi-vim插件

目录 一、背景 二、编译vim-8.2 三、配置jedi-vim插件 3.1、安装插件vundle 3.2、用vundle安装jedi-vim插件 一、背景 CentOS 7.9上已经安装了anaconda,python3.7的虚拟环境webenv。现在编译安装vim-8.2,使之支持python3(yum装包是不支…

group by总结(还有having)

先在MySQL数据库里创建一个表,并添加几条数据用于测试: create table fruit(name varchar(4),address varchar(12),type_name varchar(6) )insert into fruit values (香蕉,广西,大香蕉); insert into fruit values (苹果,山东,红富士); insert into fr…

PHP数组基本的操作方法

1、数组操作的基本函数 数组的键和值:  array_values($arr);获得数组的值  array_keys($arr);获得数组的键名  array_flip($arr);数组中的值与键名互换(如果有重复前面的会被后面的覆盖)  in_array("apple",$arr);在数组中…

linux kafka进程挂了 自动重启

使用crontab,定时监控 kafka进程,发现挂了后重启。 shell脚本如下: #!/bin/sh source /etc/profile proc_dir"/data/kafka" # 程序目录 proc_name"kafka.Kafka" …