SLAM论文详解(5) — Bundle_Adjustment_LM(BALM)论文详解

目录

1 摘要

2 相关工作

3 BA公式和导数

A. 直接BA公式

B. 导数

C. 二阶近似

4 自适应体素化

5. 将BALM结合进LOAM

6. 实验

7. 算法应用场景解析


1 摘要

Bundle Adjustment是一种用于同时估计三维结构和传感器运动运动的优化算法。在视觉SLAM,三维重建等应用中,它被广泛用于优化相机位姿和地图的精度。在视觉slam中,BA通过最小化特征之间的重投影误差,有效得优化相机位姿和地图的一致性,从而提高SLAM系统的精度和鲁棒性。

然而来到激光雷达这边情况就很不一样:激光雷达点云虽然拥有深度信息,但是比起图像比较稀疏,单帧的出点量和图像中的像素数量根本不在一个量级,导致特征点稀疏,特征匹配对应难做。那么有没有办法解决激光SLAM中的BA优化问题,让它可以在后端优化、雷达外参优化等应用上发挥作用呢?MARS实验室2021年6月发表在RAL的论文《Bundle Adjustment for LiDAR Mapping》给出了一个切实可行的方案。

在本文中,我们将激光BA建模为将特征点与其匹配的边缘或平面之间的距离最小化。与视觉SLAM(以及激光SLAM中先前的平面调整方法)不同的是,特征点可以通过解析方法求解并从BA中移除,得到的BA只依赖于扫描位姿。这大大减少了优化的规模,并允许使用大规模稠密的平面和边缘特征。为了加速优化过程,我们以闭合形式导出了代价函数的解析导数,包括二阶导数。此外,我们提出了一种新颖的自适应体素化方法,以高效地搜索特征对应关系。所提出的建模方法已应用于LOAM后端进行地图优化。结果表明,尽管作为后端,局部BA可以非常高效地求解,甚至在实时优化20个点云扫描时也能达到10Hz的速度。局部BA还显著降低了LOAM的漂移。

2 相关工作

3 BA公式和导数

A. 直接BA公式

为了高效解决激光点云的特征稀疏以及难以匹配的问题,BALM中借助八叉树的数据结构实现了自适应体素化的特征提取操作:首先对这个局部地图进行体素化操作:将构建的地图分割成一个个预设体积的体素,其中记录了这个点云来自第几帧,也就能找到它对应的雷达位姿,然后对每个体素分别计算这个体素内所有点的协方差矩阵。其中代表一个体素内的点数量。记为协方差矩阵中第大的特征值,那么就可以提取线面特征:

  • 面特征:如果与的比值超越某一阈值,那么就标记为一个面特征体素。面特征的法向量为对应的特征向量
  • 线特征:如果与的比值小于某一阈值,那么就标记为一个线特征体素。线特征的方向向量为对应的特征向量

如果满足上述任一条件,那么这个体素就会被标记为一个线或者面特征体素。如果不满足平面体素的条件,那么就将这个体素分成八个小体素,然后对这八个小体素分别判断是不是满足上述条件,不断递归直到八叉树的层数达到预先设定的最大值。这样就可以实现对局部地图快速且通用的特征提取,不需要使用检测、分割的方法,也不关心雷达型号(机械式还是固态),具有非常强的通用性。在开源代码中,堆叠了局部地图之后,使用cut_voxel()的函数对局部地图进行体素化并建八叉树,然后通过OCTO_TREE::recut()实现对局部地图的自适应体素化特征提取,然后对不同体素中的点云给不同的着色进行相应的可视化操作。

在对地图进行了自适应体素分割之后,特征的对应关系就很好做了:对于任一被标记为平面特征的体素,可以认为同一个体素内的所有点构成对应关系。从而可以构建点面误差或者点线误差:

  • 点面:对于每一个平面体素,点面误差计算表达式如下:其中是平面体素中的任意一个点。理论上随便选特征体素中的某个点作为参照不影响损失函数的计算的结果,毕竟它们都应该在同一个面上。
  • 点线:对于每一个线特体素,点线误差计算表达式如下:同理是线特征体素中的任意一个点。理论上随便选特征体素中的某个点作为参照不影响损失函数的计算的结果,毕竟它们都应该在同一个面上。

给定一组稀疏特征点,这些特征点来自于个扫描,但都对应于同一个特征(平面或边缘)(见图3)。假设第 i 个特征点来自于第个扫描,其中,将个扫描的姿态表示为,其中。然后,全局坐标系中的特征点为:

如前所述,激光雷达BA问题是指联合确定个扫描的姿态和全局三维点云地图。现在,三维地图是一个单一的特征(边缘或平面),那么BA问题就简化为联合确定单一特征的姿态和位置,该特征由特征上的点和单位向量是平面的法向量或边缘的方向)表示。对于平面特征,直接BA公式是最小化每个平面特征点到平面上的距离的平方和:

 其中表示矩阵的第k个最大特征值,是对应的特征向量,分别表示:

与平面特征类似,边缘特征的直接BA公式是最小化每个边缘特征点到边缘的平方距离的总和:

其中 表示的迹。

注意,在公式(2)和(4)中,最优点 并不唯一,因为该点可以在平面内(或沿边缘)自由移动。然而,这对最终的优化代价函数没有影响。此外,公式(2)和(4)暗示了在BA之前可以解析地获得最优的特征(平面或边缘)参数,而最终的BA问题只依赖于姿态T。这与我们的直觉相符,即一旦扫描姿态确定,3D点云地图(因此平面或边缘特征)也就确定了。此外,对姿态T的优化转化为最小化公式(3)中矩阵A的特征值。即,BA导致最小化

在T上,其中 是与相同特征对应的所有特征点的向量。 为了使成本函数(5)的优化更加高效,我们对位姿T进行了解析地计算了一阶和二阶的闭合导数。由于链式法则,我们首先对点向量p进行了导数的计算。

对于上述的线面特征,取整个体素内点云的质心和方差,那么点面误差和点线误差就可以有如下的简化:

  • 点面误差:将特征平面上的参考点取成质心,法向量取成最大的特征值对应的特征向量时,最优化的位姿对应于最小化方差矩阵的最大特征值的问题
  • 点线误差:将线特征上的参考点取成质心,法向量取成最小的特征值对应的特征向量时,最优化的位姿对应于最小化方差矩阵的特征值的问题

也就是因为这个特性,无论是线特征还是面特征,我们可以将优化问题简化为一个关于雷达位姿的“最小化体素中方差矩阵的特征值”问题

其中是同一个体素中来自不同帧的点云坐标。区别于视觉SLAM中BA优化问题中每一轮的特征会随着位姿的变化而变化,在激光SLAM的一轮BA优化中,一旦位姿被确定,地图被构建,线面特征提取的结果也都是一样的,损失函数的只和待优化的位姿有关,特征点都已经被解析得计算出来,不再显式得参与计算。

B. 导数

定理1:对于一组点和在(3)中定义的协方差矩阵。假设 具有对应于特征向量的特征值,则

其中是N个点的平均值,如(3)中所示。

定理2:对于一组点 和在(3)中定义的协方差矩阵。假设具有对应于特征向量的特征值。此外,当,则

C. 二阶近似

利用前面章节中的一阶和二阶导数,我们可以通过其二阶近似来近似成本函数(5),如下所示:

其中J(p)是Jacobian矩阵,其i元素在(6)中,H(p)是Hessian矩阵,其i行,j列元素在(7)中。

请注意,点向量p还依赖于扫描姿势T,如(1)所示。使用在[38]中定义的操作将姿势扰动到其切平面,我们有:

将(12)代入(8)得到

最后,我们使用Levenberg-Marquardt(LM)[39]方法通过反复将其近似为二阶近似(13)来最小化成本。在每次迭代中,解决方案从中解决

其中 是根据LM方法确定的步长。

4 自适应体素化

在第三节中,BA公式需要找到所有与同一特征(边缘或平面)对应的特征点。为此,我们提出了一种新颖的自适应体素化方法:假设存在不同扫描的粗略初始姿态(例如来自LOAM里程计),我们重复从默认尺寸(例如1米)开始对3D空间进行体素化:如果当前体素中的所有特征点(来自所有扫描)都位于平面或边缘上(例如通过检查点协方差矩阵的特征值(3)),则将当前体素与其中的特征点保存在内存中;否则,当前体素分解为八个八分体,并继续检查每个八分体,直到达到最小尺寸(例如0.125米)。所提出的自适应体素化生成一个体素地图,其中不同的体素可以根据环境进行不同的尺寸调整。对于每个体素,它对应于一个特征,因此对应于(13)中的一个成本项。图4(a)展示了一个示例体素地图。

自适应体素化具有许多优点:1)它与现有的数据结构(如八叉树)自然兼容,因此可以大大简化其实现和效率;2)与构建特征点的完整Kd树[10]相比,它通常更高效,因为当包含的特征点位于同一平面或边缘上时,可以提前终止。当环境具有大型平面或长边缘时,这种优势将更加明显;3)具有自适应体素的地图将减少在激光雷达里程计中搜索特征对应关系的时间。只需要搜索特征点所在或附近的体素,而不是需要更详尽搜索的最近点[10]。

在我们的实现中,我们构建了两个体素地图,一个用于边缘特征,一个用于平面特征。由于其构造方式,体素地图自然适合八叉树结构。为了减少八叉树的深度,我们使用一组由哈希表索引的八叉树(见图4(c))。每个八叉树对应空间中默认体素尺寸(例如1米)的一个非空立方体。不同的八叉树可能具有不同的深度,取决于空间中该立方体的几何形状。每个叶节点(即体素)保存与同一特征(例如平面或边缘)对应的所有特征点。

备注1:如果一个体素包含太多的点,(8)中的Hessian矩阵将具有非常高的维度,在这种情况下,我们可以对同一扫描的点进行平均。平均后的点数量较少,并且位于由原始特征点确定的同一平面上。这样可以节省大量计算而不会降低地图的一致性。

备注2:定理2中计算的Hessian矩阵要求当i≠k时,λi≠λk。对于具有超过一个代数重数的λk的体素,我们简单地跳过它。

备注3:尽管我们一直在提到边缘特征和平面特征,但该方法自然地可以扩展到非平面特征(例如曲面),方法是在更细的层次上构建体素地图,并允许在检查包含点是否位

自适应体素化具有许多优点:

  • 它与现有的数据结构(如八叉树)自然兼容,因此可以极大地简化其实现和效率;
  • 与构建完整的特征点Kd树相比,它通常更高效,因为当包含的特征点位于同一平面或边缘上时,可以提前终止。当环境具有大平面或长边缘时,这种优势将更加明显;
  • 具有自适应体素的地图将减少在激光雷达里程计中搜索特征对应关系所需的时间。只需要搜索特征点所在或附近的体素,而不是需要更多穷举搜索的最近点。

5 将BALM结合进LOAM

由于激光SLAM中的运动估计通常是基于IMU和里程计,因此会存在累计误差。因此,应用BA优化可以有效地纠正这些累计误差,提高SLAM系统的精度和鲁棒性。原文中把LOAM的后端换成了BALM,对odometry进行后端优化。同时通过共享内存的方式将自适应体素化特征提取的结果用于前端的registration来进行加速。

我们将提出的BA公式和其优化方法纳入到LOAM框架中。系统概述如图5所示。它由三个并行线程组成:特征提取、里程计和地图优化。

一旦接收到新扫描的特征点,里程计通过将新的特征点与现有地图进行配准来估计激光雷达的姿态。与现有方法不同的是,我们利用自适应体素地图来加速匹配过程。具体而言,在构建体素地图时,我们计算体素中平面(或边缘)的中心点和法向量(或方向向量)。然后对于新扫描的特征点,我们通过计算该点与体素中的平面或边缘特征之间的距离来搜索最近的体素(由其中心点表示)。

使用里程计,可以将新的扫描点大致注册到全局坐标系,并将其推送到体素地图中:对于新扫描中的每个点,搜索其所在的体素,并将该点添加到相应八叉树的叶节点中。如果在现有地图中找不到与新扫描中的点对应的体素,则创建一个新的八叉树,将其根索引到哈希表中,并将该点添加到根节点中。在将新扫描的所有特征点分布到现有八叉树的叶节点或新创建八叉树的根节点后,我们按照构造方式更新体素地图:如果节点(叶节点或节点)中的点不能构成一个单一的特征(平面或边缘),则将该节点分割为八个并检查每个节点。

在将一定数量的新扫描推送到体素地图后,会触发地图优化。地图优化在激光雷达姿态的滑动窗口上执行局部BA。滑动窗口内包含的任何包含点的体素(即Psw)将用于构建成本项,如(2)或(4)。然后,地图优化反复最小化由所有相关体素组成的总成本的二阶近似(13)。这将优化滑动窗口内的所有激光雷达姿态。更新后的姿态然后用于更新所有相关体素的中心点和法向量。

一旦滑动窗口装满,来自较早扫描的点将合并到地图点中。点协方差矩阵(3)的一个良好特性是存在递归形式[40],允许将滑动窗口外的所有点汇总为几个紧凑的矩阵和向量,而无需保存原始点(参见图5的下部)。合并后的点将保留在体素地图中,用于里程计和地图优化。

6 实验

在整个论文的Experiment中体现出了这个算法如下几个特性:

  • 精度高:手持场景下使用Livox Horizon绕HKU校园一圈回到终点,发现用BA作为后端的LOAM平移量飘了31cm,而纯LOAM平移量飘了6.23m。同时跑了一组室内数据,可以发现偏移量非常小,可见用它来做后端优化还是有比较高的精度的。

  • 不挑lidar:原论文在Livox Horizon, Livox Mid40和VLP-16上都跑了实验,无论雷达多少FOV,扫出来点云什么样,都可以跑,而且漂移量都远小于LOAM。使用VLP16采一圈回到原点之后LOAM平移量飘了56.8cm(0.27%),而BALM飘了28cm(0.13%)
  • 运行速度:在结合了BALM的LOAM框架中,主要得益于不需要建KD树去搜索五个最近邻,结合了BALM的LOAM表现出了较好的实时性。当然我理解这个运行速度只是使用了自适应体素特征,以及前后端线程共享内存的操作取代了原本建KD树搜索最近邻带来的增益,实际上基于非线性优化的后端难免还是要比基于滤波器的后端实时性要差一些的。

7 算法应用场景解析

由实际应用看下来这个算法存在以下特性:

  • 适应多种雷达:不管你是机械式还是固态,不管是16线还是128线,得益于自适应体素化的特征提取方法,全都可以在一个框架下完成特征提取与对应
  • 场景要求更高:如果连线面特征都提取不出来,场景给的约束可能会不够充分
  • 实时性略差:相对基于滤波的后端要差一些。比如一不当心某个特征体素内点云太多了,Hessian矩阵就会有很高的维数,求解非线性优化步的耗时就会很长

因此除了作为SLAM的后端,这个算法一个很适合的应用是搞激光雷达外参标定:不管是雷达到车体(opencalib[5]的雷达到车体自标定[9]有借鉴这个思想),还是多激光联合标定[3],都已经有行之有效的论文和开源代码。吃场景和缺乏实时性对于传感器标定的业务来说,是不值得一提的弱点:一般标定不会跟智驾同时运行,可以有充分的算力,而且可以对场景提出要求。此外这个算法还有新的一代BALM2 [2][7],其最大的亮点是引入了PointCluster的概念,加快了计算速度,并且能计算当前位姿的uncertainty,还围绕这个概念设计了一套完备的理论。但是其实BALM1对于离线SLAM应用来说已经效果非常不错了。

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

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

相关文章

爬虫逆向实战(30)-某查查股东关联公司(HmacSHA512)

一、数据接口分析 主页地址:某查查 1、抓包 通过抓包可以发现数据接口是api/people/getRelatCompany 2、判断是否有加密参数 请求参数是否加密? 无 请求头是否加密? 通过查看“标头”可以发现,请求头中有一个key和value都是…

基于Sentinel的微服务保护

前言 Sentinel是Alibaba开源的一款微服务流控组件,用于解决分布式应用场景下服务的稳定性问题。Sentinel具有丰富的应用场景,它基于流量提供一系列的服务保护措施,例如多线程秒杀情况下的系统承载,并发访问下的流量控制&#xff…

9.8day59

503. 下一个更大元素 II - 力扣(LeetCode) 知识点:单调栈 42. 接雨水 - 力扣(LeetCode)

Qt的窗口系统

代码仓库以及参考文件见文章底部 坐标体系 要想学好GUI,界面的坐标系首先要搞清楚 在Qt编程中,以左上角为原点,X向右增加,Y向下增加。 对于所有嵌套的窗口,其坐标是相对于父窗口来说的。 QWidget 所有窗口以及窗口控件都是从QWidget直接或者间接派生出来的。 对象模…

基于Fomantic UI Web构建 个人导航站点网站源码 网站技术导航源码

BYR-Navi-master好看有个性的网站技术导航源码 该网站基于Fomantic UI Web框架构建,整个项目的设计和构建具有高度的配置和定制灵活性。 整体风格比较适合个人导航站点使用 搜索框输入关键词后,点击上方搜索引擎图标可跳转打开对应搜索引擎搜索结果&am…

std : : vector

一.简介 std::vector 的底层实现通常基于动态数组(dynamic array),它是一种连续分配的内存块,允许元素的快速随机访问。下面是 std::vector 的一些关键特点和底层实现细节: 连续内存块:std::vector 内部使…

MAC M1芯片安装mounty读写移动硬盘中的文件

因为移动硬盘中的文件是微软公司NTFS格式,MAC只支持自己的APFS或者HFS,与微软的NTFS不兼容,所以需要第三方的软件来支持读写硬盘中的文件,经过一上午的折腾,最终选择安装mounty这个免费的第三方软件 工具网址连接&am…

祝贺!Databend Cloud 入驻 AWS 云市场

关于 Databend Cloud Databend Cloud 是基于开源云原生数仓项目 Databend 打造的一款易用、低成本、高性能的新一代大数据分析平台,提供一站式 SaaS 服务,免运维、开箱即用。 Databend Cloud 架构如下: 存储层完全面向对象存储而设计。 计算…

第25节-PhotoShop基础课程-文本工具组

文章目录 前言1.横排文字工具1.基本操作1.字体选择2.字体大小3.字体颜色4.左对齐5.右对齐6.居中对齐 2.字符 2.段落文字3.蒙版文字 前言 1.横排文字工具 1.基本操作 1.字体选择 2.字体大小 3.字体颜色 4.左对齐 5.右对齐 6.居中对齐 2.字符 2.段落文字 3.蒙版文字

Stable Diffusion 告别猜关键词,LoRA适配关键词自动生成

有没有想想过在SD绘图的时候下载好的LoRA模型选择之后不生效是为什么?或者说关键词不知道怎么填写? 这里介绍基于 Civitai 的LoRA 使用方法。 文章目录 Civitai 插件使用方法Civitai 插件 如果没有安装的小伙伴可以参考前面的文章先对 Civitai 的模型管理进行安装和使用,确…

【iOS】MVC

文章目录 前言一、MVC各层职责1.1、controller层1.2、model层1.3、view层 二、总结三、优缺点3.1、优点3.2、缺点 四、代码示例 前言 MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此…

【python爬虫】批量识别pdf中的英文,自动翻译成中文上

不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。本文提供批量识别pdf中英文的方法,后续文章实现自…

CnosDB 签约京清能源,助力分布式光伏发电解决监测系统难题。

近日,京清能源采购CnosDB,升级其“太阳能光伏电站一体化监控平台”。该平台可以实现电站设备统一运行监控,数据集中管理,为操作人员、维护人员、管理人员提供全面、便捷、差异化的数据和服务。 京清能源集团有限公司(…

【新版】系统架构设计师 - 软件架构设计<SOA与微服务>

个人总结,仅供参考,欢迎加好友一起讨论 架构 - 软件架构设计<SOA与微服务> 考点摘要 面向服务SOA(★★★★)微服务(★★★★) 基于/面向服务的(SOA) 在SO…

企业架构LNMP学习笔记34

LVS-DR模式: 老师分析: 1、首先用户用CIP请求VIP 2、根据上图可以看到,不管是Director Server还是Real Server上都需要配置VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址…

C++ day 3

1、 自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量,成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 stack.h #ifndef STACK_H #define STACK_H#…

Paper: 利用RNN来提取恶意软件家族的API调用模式

论文 摘要 恶意软件家族分类是预测恶意软件特征的好方法,因为属于同一家族的恶意软件往往有相似的行为特征恶意软件检测或分类方法分静态分析和动态分析两种: 静态分析基于恶意软件中包含的特定签名进行分析,优点是分析的范围覆盖了整个代码…

【STM32】文件系统FATFS与Flash的初步使用

文件系统简介 简介可以不看,直接看移植步骤 文件系统是介于应用层和底层间的模糊层。底层提供API,比如说使用SDIO或者SPI等读写一个字节。文件系统把这些API组合包装起来,并且提供一些列函数,我们可以使用这些函数进行更进一步的…

《protobuf》基础语法2

文章目录 枚举类型ANY 类型oneof 类型map 类型改进通讯录实例 枚举类型 protobuf里有枚举类型,定义如下 enum PhoneType {string home_addr 0;string work_addr 1; }同message一样,可分为 嵌套定义,文件内定义,文件外定义。不…

Java基础之static关键字

目录 静态的特点第一章、静态代码块第二章、静态属性第三章、静态方法调用静态方法时静态方法中调用非静态方法时 第四章、static关键字与其他关键字 友情提醒 先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 静态的特点…