论文阅读记录SuMa SuMa++

首先是关于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.mzph.cn/news/605302.shtml

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

相关文章

qt-C++笔记之QProcess

qt-C笔记之QProcess code review! 文章目录 qt-C笔记之QProcess一.示例:QProcess来执行系统命令ls -l命令并打印出结果说明 二.示例:QProcess来执行系统命令ls -l命令并打印出结果,代码进一步丰富三.示例:使用 QProcess 在 Qt 中…

深入浅出理解Dilated Convolution(空洞卷积,膨胀卷积)

温故而知新,可以为师矣! 一、参考资料 github仓库:Multi-Scale Context Aggregation by Dilated Convolutions 图片素材来源:Convolution arithmetic 理解Dilation convolution Dilated Convolution —— 空洞卷积(膨…

汪林望教授将于每周三以互动问答直播形式教您如何用龙讯旷腾计算软件PWmat计算不同材料性质

打开VX→搜索“汪林望计算讲座”,关注汪老师的频道,每周三下午16:00我们准时直播! 大家提前准备好问题,可直接提问讨论,当面请教 汪林望教授 中科院半导体所首席科学家 北京龙讯旷腾科技有限公司创始人 美国劳伦斯…

竹云董事长董宁受邀出席2023粤港澳大湾区创新战略学术研讨暨数字科技发展报告会议

科技与创新共舞,数字与产业交融。12月28日,2023 年粤港澳大湾区创新战略学术研讨暨数字科技发展报告会议在深商报告厅举行,深圳市科学技术协会党组成员、驻会副主席石兴中,深圳市商业联合会副会长、深商总会秘书长石庆&#xff0c…

React Native集成到现有原生应用

本篇文章以MacOS环境开发iOS平台为例,记录一下在原生APP基础上集成React Native React Native中文网 详细介绍了搭建环境和集成RN的步骤。 环境搭建 必须安装的依赖有:Node、Watchman、Xcode 和 CocoaPods。 安装Homebrew Homebrew是一款Mac OS平台下…

电商API接口|电商平台使用的物流API的安全风险

电子商务平台的物流 API 如果出现安全漏洞,则消费者的个人信息会被大量暴露。 物流 API 整合了企业和第三方供应商之间的数据和服务,以解决各种市场需求。如果 电商API 接口集成不当,可能会出现泄露个人身份信息 (PII) 的风险。许多使用 API…

京东商品详情API接口(item_get-获得JD商品详情)电商领域的重要角色

电商API接口在电商领域中扮演着重要的角色,它们为电商平台提供了许多功能和便利。以下是电商API接口的一些主要用途: 商品信息查询:通过API接口,第三方开发者或商家可以查询电商平台上的商品信息,包括商品详情、价格、…

Spark六:Spark 底层执行原理SparkContext、DAG、TaskScheduler

Spark底层执行原理 学习Spark运行流程 学习链接:https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、Spark运行流程 流程: SparkContext想西苑管理器注册并向资源管理器申请运行Executor资源管理器分配Executor,然后资源管理器启动Ex…

系列十四、理解MySQL varchar(50)

一、理解MySQL varchar(50) 1.1、概述 日常开发中,数据库建表是必不可少的一个环节,建表的时候通常会看到设定某个字段的长度为varchar(50),例如如下建表语句: 那么怎么理解varchar(50)?这个分情况的,MySQ…

静态路由、代理ARP

目录 静态路由静态路由指明下一跳和指明端口的区别代理ARP 我们知道,跨网络通信需要路由 路由有三种类型: 1.直连路由。 自动产生的路由,当网络设备连接到同一网络时,他们可以自动学习到对方的存在。自动学习相邻网络设备的直连信…

用通俗易懂的方式讲解:使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人

在本文中,使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序,可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few…

盛元广通实验室业务流审批管理系统2.0

系统通过对取样、分析、数据处理、检验报告等分析全过程中多种影响因素的有效管理,强化检验质量,获得准确可靠的分析成果。业务流审批管理系统主要包括了检测管理、业务受理、样品管理、资源质量管理、分包管理、报告生成、统计分析等,系统能…

7N65-ASEMI高压NPN型MOS管7N65

编辑:ll 7N65-ASEMI高压NPN型MOS管7N65 型号:7N65 品牌:ASEMI 连续漏极电流(Id):4A 漏源电压(Vdss):650V 栅极阈值电压:30V 单脉冲雪崩能量:150mJ 集电极电流(脉冲&#xff…

网络安全B模块(笔记详解)- 网络爬虫渗透测试

LAND网络渗透测试 1.进入虚拟机操作系统:BT5中的/root目录,完善该目录下的land.py文件,填写该文件当中空缺的Flag1字符串,将该字符串作为Flag值(形式:Flag1字符串)提交;(land.py脚本功能见该任务第6题) 输入flag sendp(packet) Flag:sendp(packet) 2.进入虚拟机操作…

关键字、标志符、变量、基本数据类型

1、关键字 1.1、定义 定义:被JAVA语言赋予了特殊含义,用作专门用途的字符串(或单词) 特点:全部关键字都是小写字母 上源码: 代码中定义类的关键字class,定义一个订单控制器类 ​​​​​​​…

用Java爬取新房二手房数据看总体大环境

都说现在房市惨淡,导致很多人在观望,那么今天我写一段爬虫,主要是抓取各地新房以及二手房成交状况,然后了解总体楼市是否回暖上升。 以下是Java爬虫程序的代码示例,用于抓取贝壳网新房和二手房数据: impor…

污水处理成套设备如何选择

污水处理是现代社会中不可或缺的一个重要环节,它涉及到环保领域,与人们的生活和健康息息相关。而污水处理成套设备的选择则显得尤为重要,因为合适的设备能够有效地解决水污染问题,提高环境质量。 在选择污水处理成套设备时&#x…

Python绘制茎叶图:plt.stem

文章目录 简介参数演示 简介 茎叶图从外观来看,更像是火柴,由基线、茎线、茎头三部分构成。最简单的示例如下 import numpy as np import matplotlib.pyplot as plt plt.stem(np.sin(np.arange(10))) plt.show()参数 stem的完整参数如下 stem([locs,…

【C++】- 类和对象(构造函数!析构函数!拷贝构造函数!详解)

类和对象② 类的6个默认成员函数构造函数析构函数拷贝构造函数 类的6个默认成员函数 上一篇详细介绍了类。如果一个类中什么成员都没有,简称为空类。 那么空类中真的什么都没有吗? 并不是,当类在什么都不写时,编译器会自动生成…

SQLServer设置端口,并设置SQLServer和SQLServer Browser服务

SQLServer默认使用动态端口,即每次启动sqlserver.exe时,端口port都会动态变化。若要使用静态端口,比如port1433,则需要在SQL Server Configuration Manager(简称SSMS)里配置。这里以SQL Server 2005 Configuration Man…