论文阅读记录SuMa SuMa++

news2024/9/25 15:27:56

首先是关于SuMa的阅读,SuMa是一个完整的激光SLAM框架,核心在于“基于面元(surfel)”的过程,利用3d点云转换出来的深度图和法向量图来作为输入进行SLAM的过程,此外还改进了后端回环检测的过程,利用提出的面元的概念和使用到的虚拟帧来优化回环检测的过程。
SuMa的核心分为以下几个步骤:

1. SuMa预处理

预处理的部分将3d点云转换为两张图,原文用的词是vertex map和normal map,这里直接翻译为顶点图和法向量图
预处理的过程本质上就是建立一个3d到2d的转换,原始的点云是3d的,顶点图和法向量图都是2d的,所以需要一个转换关系,论文首先使用的是点云到顶点图的转换,对于点云中的每个点,有:
在这里插入图片描述
其中出现的两个参数分别是
在这里插入图片描述
其中r是深度,f是竖直方向的视野范围
此外w和h分别表示顶点图的大小。对于顶点图中的每个点,论文都使用 V D V_D VD来表示。得到了顶点图后,利用其相邻的关系,就可以得到法向量图,就像其名字一样,法向量图存储的是每个位置上的法向量(normal),在计算时可以直接使用顶点图中的相邻元素进行计算:
在这里插入图片描述
为了保证计算的有效性,对于边界的元素,如果位置超过了图像的范围,也就是说位置不合法了,这种情况直接不参与计算,只保留合法位置的法向量信息。
在这里插入图片描述
在经过预处理之后,原本的3D点云地图就被转换成两张二维的图像,后续的里程计和回环检测都是在这两张图的基础上

2. SuMa地图表示

前面看过的论文里,地图的表示方法有很多种,最普通的基于特征点、特征线,稍微进阶一些的比如基于物体的就是用的物体地图,而LOAM也可以看作是基于边和面的地图,在SuMa中作者提出了一种基于面元的地图

面元即论文中的surfel这个单词,面元地图指的就是面元作为地图中的基本元素,一个面元就相当于一个小平面,可以抽象为一个小的圆形,每个面元用一个位置向量、一个法向量和一个半径表示,此外还保留两个时间戳,分别是创建面元的时间和最后一次更新面元的时间

除此之外,为了体现面元的置信度,方便后续筛选掉错误的面元,论文对每个面元设置了一个优势比(odds ratio),用来体现一个面元的可靠程度,其计算方法为:
在这里插入图片描述
其中的odds为一个函数,具体表示为:
在这里插入图片描述
p s t a b l e p_{stable} pstable p p r i o r p_{prior} pprior表示面元是一个稳定面元的概率和先验概率,这其实是一个不断更新的过程,如果确定两帧的两个面元对应的是地图上的同一个面元,那么更新时必然是一个迭代的更新,原面元法向量与待整合面元的法向量夹角越小、距离越近,对应到公式中的 e x p exp exp项也就越接近1,整体也就向着 p s t a b l e p_{stable} pstable的方向移动,从而让面元的可靠程度越高。

此外,关于时间戳信息,引入这个量主要是为了将地图中的面元区分为两部分:动态图和静态图。动态图记为 M a c t i v e M_{active} Mactive而静态图记为 M i n a c t i v e M_{inactive} Minactive,里程计进行位姿估计的过程主要是用动态图,而回环检测的部分则使用静态图。最近更新时间超过一定阈值就将其记为静态图,否则放在动态图。

3. SuMa里程估计

前面提到里程计估计这部分只用动态图,也就是距离当前不太远的内容。这部分就是利用这些内容,通过最小化一个偏差,来得到一个帧间位姿变换。论文使用的是类似于重投影误差的方法或者说类似ICP的方法,对于当前帧的顶点图的每个点,根据位姿变换T投影到上一帧,找到上一帧的顶点图中距离其最近的一点,从而得到该点所在的面元,计算投影点到面元的距离并求和,最小化这个距离,就是我们优化过程的目标函数:

在这里插入图片描述
其中, T C t − 1 C t ( k ) u T^{(k)}_{C_{t-1}C_{t}}u TCt1Ct(k)u是将当前帧的点转换到上一帧, v u v_u vu是上一帧与之对应的点, n u T n^T_u nuT是对应点的面元的法向量,因为是计算到面元距离,所以要乘以一个法向量
在这里插入图片描述
通过迭代优化图中的T,从而得到一个更加准确的位姿变换T,这个过程称为帧到模型的ICP。可以看到目标函数中是对当前帧顶点图的所有点进行距离的统计,所以必然需要一定的筛选措施,这里除了去除投影后位置不合法的点,还将角度偏差过大和距离偏差过大的点也去除了,这里的角度偏差过大指的是法向量图中对应位置的角度的偏差。
在优化的过程中,先用上一帧和上上帧之间的帧间变换作为初始值,之后利用高斯牛顿法进行后端的非线性优化,最终计算出帧间变换T。

4. SuMa地图更新

面元计算这部分,首先对当前帧的每个点,计算其所在面元的半径,公式如下:
在这里插入图片描述
其中p和clamp都是函数,具体表示为:
在这里插入图片描述
在这里插入图片描述
这个半径表示的是当前这个点所在的面元的可能的半径,但是不是保留这个点还需要判断。判断的过程首先利用前面得到的帧间变换矩阵,将当前帧的信息投影到世界坐标系下,在这一步我们需要用到前面保留的2d-3d之间的转换关系,这个关系可以给我们指明点之间是怎样的一个观察方法,按照这个方法,我们沿着当前点的视线延长,看看延长线能否与一个地图上的面元相交,如果没有相交,那么根据当前点的信息新建一个面元添加到地图中;如果存在一个面元,那么就检测距离与角度的偏差值:
在这里插入图片描述

  • 如果符合条件,则认为当前的点所在的面元和地图上的面元是一个面元,如果新的测量更加准确,比如说半径更小,就进行整合操作:
    在这里插入图片描述
    这时前面计算的半径就能用到了,而且与位置和法向量的整合方法不同,半径的整合是完全替代,直接用新的、更小的半径代替前面的半径。之后更新面元的可信度
  • 如果不符合条件,就调低面元的可信度,除此之外不做其它操作。在一次更新之后,去除过旧的面元和可信度过低的面元。

5. SuMa回环检测

回环检测的部分首先是要获得一个候选回环帧,论文中使用的方法是遍历静态图,从中找出距离当前帧最近的一帧,公式如下:
在这里插入图片描述
这里所谓的最近是只考虑了平移没有考虑旋转,这是因为旋转在寻找距离最近的时候并不会产生影响。得到最近的帧之后,利用存储的位姿变换关系,可以得到这两帧之间的旋转和平移关系:
在这里插入图片描述
对于这两个关系,旋转可以直接拿来使用,但是平移上论文又引入了一个参数量:
在这里插入图片描述
这里是考虑到单纯使用重叠程度作为是否出现回环的判断标准容易出现误判,所以这里在平移上增加了一个系数,从而产生了三个初值,从这三个初值中选一个最优值作为回环的匹配程度。
除此之外,论文还提出了一个虚拟帧,虚拟帧本质上就是投影后的候选回环帧和当前帧的整合,具体做法是先利用位姿变换关系,将候选回环帧投影到当前位置,之后采用与前面一样的视角检测方法,如果视线上存在更近的点,就用这个点去替代投影帧上的点,以此构成虚拟帧。
得到虚拟帧之后,采用相同的方法计算帧间残差,因为增加了参数,所以是三个位姿去计算残差,从中选择最小的作为评判回环是否出现的标准。如果出现了回环,还要持续检测后面一个时间段内的位姿变换,必须保证一个时间段内位姿的变换与候选回环帧之间保持一致性才可以认为真正出现了回环。如果真的出现了回环,就利用位姿图进行优化,对回环进行优化。

总的来说在回环检测这部分,首先要遍历静态图,选择距离最近的一帧作为候选回环帧,根据候选回环帧和当前帧制作虚拟帧,利用虚拟帧和三个位姿变换计算相似度,如果相似度满足阈值且后续一个时间段内都符合条件,就认为真正出现回环,通过图优化进行回环校正。

6. SuMa++

SuMa++则是在SuMa的基础上引入了语义相关的内容,因为大部分的框架都是相似的,这里就简单记录一下。

首先SuMa++使用RangerNet++来获得点的语义标签,产生一个语义mask用来标记点的语义信息。其次考虑到错误分类会对后序的内容产生影响,SuMa++引入了一种洪泛算法来消除错误标签。洪泛算法以语义mask和顶点图为输入,输出修正之后的语义mask,伪代码如下:

在这里插入图片描述
整个过程主要是对边缘信息的处理,首先对于语义mask中的一个点,如果在其邻域范围内,有其它语义信息的点,那么就认为这个点是边缘点,将这个点去除,全部处理一遍之后,相当于将两个物体边缘的部分去除掉了。之后再对这些去掉的空白位置,采用就近分配的原则,重新为其分配标签。最终效果为:
在这里插入图片描述
很直观的可以发现,从( a )图到( c )图,物体与物体之间的边界区分更加明显,可以更好的为后续的动态物体的去除作铺垫。

除此之外,考虑到对于SLAM过程而言,制图起着关键作用的,主要是静态的物体,而非动态物体,因此SuMa++将动态物体去除掉,主要方法是在更新地图时,检测地图与当前帧对应点的语义一致性,简单来说就是如果是同一个位置但是标签变了,那么就认为这个位置上的面元是动态物体上的一个面元,通过在可信度函数是增加语义一致性项来加速置信度的降低

在这里插入图片描述
但是作者也提到了,在场景特征不那么丰富的情况下,这种过滤方法会让特征不足,从而影响SLAM的效果。
在这里插入图片描述
最后SuMa++还使用了语义ICP,在里程计的目标函数部分,增加一个语义权重项,通过比较地图点与扫描点之间的语义一致性来调整权重,也就是说不仅空间上要存在一致性,语义上也要满足一致性

在这里插入图片描述
在这里插入图片描述
SuMa++在SuMa的基础上增加了语义信息,将语义信息与面元相结合,语义获取部分使用Rangenet++来获取语义mask,并通过洪泛算法对mask中的物体边界部分进行修正。语义的应用方面,SuMa++利用语义的一致性,通过比较地图点和当前帧的同一位置上的语义信息,将对制图过程意义不那么明显的动态物体筛除,此外还将语义信息应用在里程计的目标函数中,为目标函数增加语义权重,从而体现出语义一致性。

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

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

相关文章

软件测试|Windows系统安装Cypress教程

前言 每当提起web自动化测试,大家首先想到的就是selenium,最近这两年时间,出现了playwright和cypress这两款新的工具,不过现在应用范围还是不如selenium,之前我们介绍了playwright的使用,现在开始&#xf…

【c++】list的特性及使用

目录 一、list的介绍 二、list的深度剖析与模拟实现 1、list图解 2、list增删查改模拟实现 三、list与vector的对比 一、list的介绍 STL中的list指的是带头双向循环链表。list是可以在常数范围内任意位置进行插入和删除的序列式容器,并且可以前后双向迭代。lis…

【AI视野·今日CV 计算机视觉论文速览 第283期】Thu, 4 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Thu, 4 Jan 2024 Totally 85 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers LEAP-VO: Long-term Effective Any Point Tracking for Visual Odometry Authors Weirong Chen, Le Chen, Rui Wang, Marc P…

大数据可视化Web框架——飞致云Dataease在Windows端的安装指南(多图说明版)V2.2最新版

DataEase开源代码在Windows系统开发环境搭建与调试指南_怎么部署dataease 2.0-CSDN博客https://blog.csdn.net/tllhc01/article/details/135220598?spm1001.2014.3001.5502参考这一篇,基于dataease2.2源码进行构建 需要先下载三个文件,且版本一一对应均…

性能分析与调优: Linux 监测工具的数据来源

目录 一、实验 1.环境 2. proc目录 3. sys目录 4.netlink 5.tracepoint 6.kprobes 7. uprobes 二、问题 1.systemd如何查看启动时间 2.CentOS与Ubuntu如何安装bpftrace 3.snap有哪些常用的命令 4.snap如何安装store 5.如何列出使用bpftracede的OpenJDK USDT探针 …

机器学习笔记:时间序列异常检测

1 异常类型 1.1 异常值outlier 给定输入时间序列,异常值是时间戳值其中观测值与该时间序列的期望值不同。 1.2 波动点(Change Point) 给定输入时间序列,波动点是指在某个时间t,其状态在这个时间序列上表现出与t前后…

基于JSP+Servlet+Mysql的学生信息管理系统

基于JSPServletMysql的学生信息管理系统 一、系统介绍二、功能展示1.目录2.数据库3.登陆4.注册5.主页 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称:基于JSPServletMysql的学生信息管理系统 项目架构:B/S架构 开发语言:Java语…

Web前端-JavaScript(BOM)

文章目录 1.1 常用的键盘事件1.1.1 键盘事件1.1.2 键盘事件对象1.1.3 案例一 1.2 BOM1.2.1 什么是BOM1.2.2 BOM的构成1.2.3 window1.2.4 window对象常见事件窗口/页面加载事件**第1种****第2种** 调整窗口大小事件 1.2.5 定时器setTimeout() 炸弹定时器停止定时器**案例&#x…

python 写自动点击爬取数据

今天来点不一样的!哥们 提示: 这里只是用于自己学习的 ,请勿用违法地方 效果图 会进行点击下一页 进行抓取 需要其他操作也可以自己写 文章目录 今天来点不一样的!哥们前言一、上代码?总结 前言 爬虫是指通过编程自动…

Spring Framework和SpringBoot的区别

目录 一、前言 二、什么是Spring 三、什么是Spring Framework 四、什么是SpringBoot 五、使用Spring Framework构建工程 六、使用SpringBoot构建工程 七、总结 一、前言 作为Java程序员,我们都听说过Spring,也都使用过Spring的相关产品&#xff0…

基因组学之碱基突变的关键概念

碱基突变 突变(muation)会引起DNA序列的变化,进一步会引起蛋白序列的改变。正常的细胞活动或细胞与环境的随机相互作用,会使得生物产生一定数目的突变,称为自发突变(spontaneous muation)。突变…

多线程第一课---

UML中规定的箭头方向是从子类指向父类。 关于这一点,按照以下方法去理解有助于大家记住这条规则。 在定义子类时需要通过extends关键字指定父类。因此, 子类一定要知道父类的定义,而反过来,父类并不知道子类的定义。 只有在知道对…

Spring事务(2):声明式事务管理案例-转账(xml、注解)

1 编写转账案例,引出事务管理问题 需求:账号转账,Tom账号取出1000元,存放到Jack账号上 1.1 建表脚本(MySQL) CREATE TABLE t_account (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL,m…

Arduino开发实例-欧姆龙E3Z-D61光电传感器

欧姆龙E3Z-D61光电传感器 文章目录 欧姆龙E3Z-D61光电传感器1、E3Z-D61光电传感器介绍2、硬件准备及接线3、代码实现1、E3Z-D61光电传感器介绍 Omran 光电传感器可用于检测 5 至 100 毫米距离内的障碍物和物体。 传感器上有一个 LED,它始终熄灭,并在检测到障碍物时亮起。 您…

Plantuml之nwdiag网络图语法介绍(二十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

IDEA[Debug]简单说明

目录 🥞1.打断点 🌭2.第一组按钮 🧂3.第二组按钮 🥓4.参数查看 1.打断点 1.在需要断点处打上断点,然后点击debug运行 2.执行debug,直接执行到断点处 2.第一组按钮 共有8按钮,从左往右依…

【普中开发板】基于51单片机的简易密码锁设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的简易密码锁设计 1.主要功能:资料下载链接: 实物图:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的简易密码锁设计 ( proteus仿真程序设计报告讲解视频) 仿真图proteus8.16(有低版本) 程…

Defi安全-Monox攻击事件Foundry复现

其它相关内容可见个人主页 Mono攻击事件的介绍见:Defi安全–Monox攻击事件分析–phalconetherscan 1. 前情提要和思路介绍 Monox使用单边池模型,创建的是代币-vCash交易对,添加流动性时,只需添加代币,即可进行任意代…

秋招复习之堆

目录 前言 堆 堆的常用操作 堆的实现(大根堆) 1. 堆的存储与表示 2. 访问堆顶元素 3. 元素入堆 4. 堆顶元素出堆 Top-k 问题 方法一:遍历选择 方法二:排序 方法三:堆 总结 前言 秋招复习之堆。 堆 「堆 heap…

分布式系统——广播Broadcasts

1 广播抽象(Broadcast Abstractions)在进程中的两种方法 在分布式系统中广播抽象的概念。广播抽象允许系统中的进程使用两种基本方法进行通信: 1.1 Broadcast(m) 当一个进程 i 使用这个方法时,它会将消息 m 发送给系统中的所有其它进程。 1.2 …