Large-Scale LiDAR Consistent Mapping usingHierarchical LiDAR Bundle Adjustment

1. 代码地址

GitHub - hku-mars/HBA: [RAL 2023] A globally consistent LiDAR map optimization module

2. 摘要

重建精确一致的大规模激光雷达点云地图对于机器人应用至关重要。现有的基于位姿图优化的解决方案,尽管它在时间方面是有效的,但不能直接优化建图的一致性。激光雷达集束调整(BA)最近被提出来解决这个问题;但是在大尺度规模建图上太费时间了。为了解决这一问题,本文提出了一种适用于大尺度地图的全局一致的高效建图方法。我们提出的工作由自底向上的分层BA和自顶向下的位姿图优化组成,结合了两种方法的优点。通过分层设计,我们用比原始BA小得多的Hessian矩阵来解决多个BA问题;通过位姿图优化,我们可以平滑高效地更新激光雷达姿态。我们提出的方法的有效性和鲁棒性已经在多个空间和时间上的大规模公共旋转激光雷达数据集上得到验证(KITTI,MulRan和Newer College),以及结构化和非结构化场景下的自行收集的固态激光雷达数据集。通过适当的设置,我们证明了我们的工作可以在只用大约12%的序列时间生成一个全局一致的地图。

3. 主要贡献

  • 我们提出了一种分层集束调整方法,以全局优化激光雷达建图一致性和里程计精度。我们提出的方法在给定良好的初始姿态轨迹(例如,来自位姿图优化)的情况下提高了建图质量,并且甚至在初始姿态轨迹存在大漂移的情况下闭合了间隙。
  • 我们提出的工作的有效性已经在结构化和非结构化场景中的多个公共机械旋转激光雷达数据集和我们自己收集的固态激光雷达数据集上得到验证。

4. 算法解析

4.1. 系统概述

图1,提出的分层集体束调整的金字塔结构,层数l = 3,步长s = 3,窗口大小w = 6。第一、第二和第三层因子连接同一层内的每两个相邻节点。红色虚线连接的节点应该是相同的,例如x_{9i}^1,从下层的局部窗口的第一个节点到从上层的这个局部窗口构建的节点,例如x_{3i}^2x_{i}^3

图2,黄色部分表示自下而上的过程,蓝色部分表示自上而下的过程。

我们提出的方法的系统工作流程如图2所示。输入是来自每次激光雷达扫描的原始点或去畸变后的点,以及它们在全局坐标系中的相应位姿的初始估计,这可以从通用激光雷达里程计或SLAM算法获得。该方法由自下而上和自上而下两个过程组成,迭代直到收敛。自下而上的过程中,在较小的局部窗口内对激光雷达帧执行局部BA,以构建从第一层到第二层的关键帧。该过程分层执行,直到满足最佳层数,并且在顶层关键帧上执行全局BA。然后,使用来自每个优化层和相邻层之间的因子来构建位姿图。如图1所示,第一层,也称为底层,描述了初始LiDAR帧和姿态的集合。同样,第二层表示使用局部BA从第一层创建的激光雷达关键帧和姿态的集合。顶层意味着最后剩余的激光雷达关键帧的集合(在图1中,顶层指的是第三层)。从底层到顶层分层创建激光雷达关键帧的过程称为自下而上过程。通过位姿图优化更新底层激光雷达位姿的过程称为自顶向下过程。

4.2. 自下而上的分层BA

我们定义F^i_j为第i层的第j个雷达帧,X^i_j \triangleq T^i_j = (R, t)表示对应的位姿。T^i_{j,k}表示T^i_{j}T^i_{k}之间的相对位姿。需要注意的是,F^i_j中的点是在激光雷达的局部坐标系,T^i_{j}是在全局坐标系中。w是窗口的大小,s为激光雷达关键帧自下而上构建过程中的步幅大小。

假设在第i层一共有N_i个雷达帧。在自下而上的过程中,每个局部窗口使用给定的初始位姿执行局部BA,优化得到帧间相对位姿和第一帧的位姿。从每个局部窗口中的BA得到的Hessian矩阵H也被记录,并用作后面的自上而下的位姿图构造中的信息矩阵。给定第i层一个局部窗口的w个激光帧\left\{F_{s j+k}^i \mid j=0, \cdots,\left\lfloor\frac{N_i-w}{s}\right\rfloor ; k=0, \cdots, w-1\right\}和优化得到的相对位姿,我们将这些帧聚合成第i+1层的关键帧。将窗口内的点云都转到第一帧坐标系,聚合后的关键帧位姿表示为T^{i+1}_{j},被设置为在前一个局部窗口优化中得到的第一帧的位姿。

\begin{aligned} & \mathbb{F}_j^{i+1} \triangleq \bigcup_{k=0}^{w-1}\left(\mathbf{T}_{s \cdot j, s \cdot j+k}^{i *} \cdot \mathbb{F}_{s \cdot j+k}^i\right) \\ & \mathbf{T}_j^{i+1}=\mathbf{T}_{s \cdot j}^{i *}=\prod_{k=1}^j \mathbf{T}_{s \cdot k-s, s \cdot k}^{i *} \end{aligned}

图3,使用w = 10, s = 5和n = 8,层数N,位姿数l
可以看出,从原始BA到分层BA时间消耗显著减少。

对于自底向上的分层BA的每一层中的特征提取和关联,我们使用BALM中提出的自适应体素化方法,该方法提取适合于不同结构的环境的不同大小的平面特征。 然而当点数非常大时,自适应体素化过程是耗时的。为了缓解这一问题,我们注意到,在较低层中不被视为平面要素的点也不会在较高层中形成平面。因此,在自下而上的过程中,我们仅使用来自局部BA中每个体素的平面特征点来构建上层的关键帧。该过程进一步节省了下一层自适应体素地图构建的时间,并提高了局部BA中的计算精度。

4.3. 自上而下的位姿图优化

自上而下的姿态图优化过程旨在减少自下而上的分层BA过程中的位姿估计误差,因为自下而上的分层BA仅考虑了同一局部窗口中的共视特征,而忽略了在不同局部窗口中共视的那些特征。

位姿图在金字塔结构中以自顶向下的方式构建。在金字塔的每一层中,因子是相邻帧之间的相对位姿。具体来说,节点X^i_{j}X^i_{j + 1}之间的第i层因子中的代价函数定义为:

其中,i\in{\mathcal{L}},\ j\in{\mathcal{L}},\ Z=\{1,\cdot\cdot\cdot,l\},\ {\mathcal{F}}^{i}=\{0,\cdot\cdot\cdot,N_{i}-1\}

由于节点X^{i+1}_{j}X^{i}_{sj}本质是同一个,所以有:

因此,代价函数可以简化为:

最终的位姿图

整体的目标函数:

其中F是第一层所有关键帧的集合,最终使用GTSAM中的LM求解该图优化问题。

5. 实验

5.1. 精度分析

数据集:KITTI、MulRan、New College、Self Collected Dataset

对比方案:MULLS、LIO-SAM、FAST-LIO2、CT-ICP、GICP Matching Factor

  • 带回环的初始位姿
表2 记录了在KITTI数据集上的角度和平移的RMSE误差。
图5 在KITTI数据集序列07上,(A)MULLS建图结果;(B)HBA优化后的结果;A白色区域中的点云分层现象在B中明显消失。
在MulRan数据集DCC03上的建图效果。(A)LIO-SAM带回环的建图结果;(B)HBA建图结果;

白色区域底部中放大的部分显示了A中存在点云分层现象,B中点云地图一致性更好。

  • 不带回环的初始位姿

图7 (A) 是在KITTI数据集00序列上,MULLS不带回环的建图结果;(B)是HBA建图结果;(A)中白色区域显示了点云重影误差,在B中明显消失;
图8 (A)是FAST-LIO建图结果;(B)是HBA优化后的结果;(B)中白色区域点云重影消失。
图9(A)是FAST-LIO建图结果;(B)是HBA优化后的结果;(B)中侧视图点云地面高度一致,俯视图中重影消失。

由于没有真值,使用MME评估建图质量。

5.2. 消融实验

  • 位姿图优化 VS 直接指定

为了更新底层姿态,一种简单的方法是直接将优化的上层姿态分配给下层姿态,例如,使用上层关键帧的优化姿态在相应的局部窗口内更新下层的前s个姿态。

图10  (A)直接指定结果;(B)从上到下的优化;从黄色虚线区域可以看出,我们提出的位姿图优化在位姿估计精度和建图一致性方面都优于直接分配优化结果。
  • 分层BA VS 简化BA
表8记录了原始BA、简化BA、分层BA在MulRan Dataset的耗时和精度结果。

5.3. 算力消耗

6. 总结

本文提出一种基于分层BA和位姿图优化的方法,对大规模激光雷达点云的位姿估计精度和建图一致性进行优化。利用自下向上的分层BA,我们用比原始BA方法小得多的Hessian矩阵并行求解多个BA问题。通过自上而下的位姿图优化,我们可以平稳高效地更新激光雷达位姿。在给定良好的初始姿态轨迹或大漂移的情况下,我们在具有结构化和非结构化场景的空间和时间大规模激光雷达数据集上验证了我们工作的有效性。在多个公共旋转激光雷达和我们自己收集的固态激光雷达数据集上,我们证明了我们提出的工作在位姿估计精度和建图一致性方面优于其他SOTA方法。在我们未来的工作中,我们可以将IMU预积分和激光雷达测量噪声模型结合到我们的分层BA工作中。

参考文献

主要内容来自下文,略有改动

RAL2023 港大开源 | 基于分层激光雷达集束调整的一致性建图 - 知乎

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python】python电影评论数据抓取分析可视化(源码+数据+课程论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Windows系统问题

Windows系统问题 一、补丁更新提示:0x80070643问题:解决方法:1.以管理员权限运行【cmd】。2.禁用 【Windows RE】,请运行reagentc /disable。3.回收【Windows RE】恢复分区空间。4.准备新的【Windows RE】恢复分区空间。5.配置并启…

如何检测UV胶的均匀性?

如何检测UV胶的均匀性? 检测UV胶的均匀性可以通过以下几种方法来实现: 肉眼目视检查: 这是最简单直接的方法。将UV胶涂在表面上,使用裸眼观察胶层的表面。特别注意是否存在气泡、颜色不均匀、裂纹或其他明显的不均匀性。如凹凸不…

从零开始实现自己的串口调试助手(9)-重置多文本框,保存/载入指令集

重置多文本框 添加多文本控件列表 在构造函数中把我们需要操作的控件归类到对应列表之中 //创建多文本存放数组 - 存放那三列内容 checkBox lineEdi btnfor(int i1;i<9;i){// 添加到按钮数组QString btnName QString("pushButton_t%1").arg(i); //构建对应控件名…

独享IP VS 原生IP,二者的区别与定义详解

原生IP&#xff1a;原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中&…

汉中门禁系统设备多少钱,门禁系统报价单

汉中门禁系统设备多少钱&#xff0c;门禁系统报价单 门禁系统设备存在普通与智能之分&#xff0c;其价格差异颇大。以下是一些国内品牌的门禁系统价格&#xff1b; 以上只是部分国内品牌门禁机设备的报价&#xff0c;仅供参考&#xff0c;能看出目前市面上&#xff0c;海…

Freetype 介绍和使用

目录 一、矢量字体引入 二、Freetype 介绍 1.给定一个字符&#xff0c;怎么在字体文件中找到它的关键点&#xff1f; 2.文字显示过程 3.如何使用 freetype 库 三、在 LCD 上显示一个矢量字体 1.使用 wchar_t 获得字符的 UNICODE 值 2.使用 freetype 得到位图 3.在屏幕上…

Java——数组排序

一、排序介绍 1、排序的概念 排序是将多个数据按照指定的顺序进行排列的过程。 2、排序的种类 排序可以分为两大类&#xff1a;内部排序和外部排序。 3、内部排序和外部排序 1&#xff09;内部排序 内部排序是指数据在内存中进行排序&#xff0c;适用于数据量较小的情况…

一个 buffer 使用的负反馈实例

端到端拥塞控制其实就是负反馈的实施。典型的做法是识别到一系列标志性事件&#xff0c;比如丢包&#xff0c;时延增加等&#xff0c;然后对这些事件做反应&#xff0c;进而形成负反馈&#xff0c;但 inflight 守恒是一种完全不同的做法&#xff0c;它将负反馈平铺到了整个传输…

pytorch 笔记:pytorch 优化内容(更新中)

1 Tensor创建类 1.1 直接创建Tensor&#xff0c;而不是从Python或Numpy中转换 不要使用原生Python或NumPy创建数据&#xff0c;然后将其转换为torch.Tensor直接用torch.Tensor创建或者直接&#xff1a;torch.empty(), torch.zeros(), torch.full(), torch.ones(), torch.…

嵌入式Linux系统编程 — 3.2 stat、fstat 和 lstat 函数查看文件属性

目录 1 文件有哪些属性 2 stat函数 2.1 stat函数简介 2.2 struct stat 结构体 2.3 struct timespec 结构体 2.4 示例程序 3 fstat 和 lstat 函数 3.1 fstat 函数 3.2 lstat 函数 1 文件有哪些属性 Linux文件属性是对文件和目录的元数据描述&#xff0c;包括文件类型…

代码随想录-算法训练营day61【代码随想录-算法训练营-总结】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 算法训练营&#xff0c;60天&#xff0c;包含这些内容&#xff1a; 01、数组 02、链表 03、哈希表 04、字符串 05、双指针法 06、栈与队列 07、二叉树 08、回溯算法 09、贪心算法 10、动态规划 11、单调栈 12、图论 做…

数据库同步软件PanguSync常见错误解决方法

​​​​​​在部署PanguSync数据库同步软件的过程中&#xff0c;常常会遇见一些错误提示&#xff0c;某些老铁可能会一脸懵逼&#xff0c;本文对一些常见的错误信息进行了总结&#xff0c;并提供了解决方法。 1.")"附近有语法错误 该问题是由于源表未设置主键&…

安卓打造安装包(应用打包、规范处理安装包、安全加固)

本章介绍应用安装包的基本制作规范&#xff0c;主要包括&#xff1a;如何导出既美观又精简的APK文件、如何按照上线规范调整App的相关设置、如何对APK文件进行安全加固以防止安装包被破解。 应用打包 本节介绍APK安装包的打包过程&#xff0c;包括&#xff1a;如何利用Androi…

Java Web学习笔记21——前后端分离开发

前后端混合开发&#xff1a; 沟通成本比较高。 分工不明确。 不便管理&#xff0c;不便于后期的维护和拓展。 前后端分离开发&#xff1a; 当前主流的开发模式&#xff1a;前后端分离开发&#xff1a; 接口文档&#xff1a; 接口并不是interface。 接口指的是业务功能。 …

选择排序(直接选择排序与堆排序)----数据结构-排序②

1、选择排序 1.1 基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完就停止 。 1.2 直接选择排序 排序思想&#xff1a; ①在元素集合array[i]--array[n-1]中选择…

Java项目如何外发告警日志到企业微信

前言 最近领导交代了一个需求,就是有些许客户不单单满足平台告警日志外发到邮箱、短信的形式,还要以消息聊天的形式外发给企业微信。 具体操作 1、注册企业微信。 2、登录企业微信,找到应用管理,创建应用。 3、创建完之后需要记录以下图片中两个值的信息。 4、然后记录下…

stanfordcorenlp+python做中文nlp任务,得到的结果中全是空字符串,而不是中文字符串

问题描述 代码&#xff1a; from stanfordcorenlp import StanfordCoreNLP import logging#中文中的应用&#xff0c;一定记得下载中文jar包&#xff0c;并标志lang‘zh’ nlp_zh StanfordCoreNLP(rD:\stanford-corenlp-full-2016-10-31, port8094, langzh,quietFalse,logg…

【排序算法】总结篇

✨✨这些 排序算法都是指的 需要进行比较的排序算法 ✨✨下面都是略微讲解一下思路&#xff0c;如果需要详细了解哪一个排序&#xff0c;点击&#x1f449;链接即可 ✨✨对于时间、空间复杂度、稳定性&#xff0c;希望你&#x1f9d1;‍&#x1f393;能够理解记忆&#x1f9d1;…

SpeedyBee飞塔F405 V3 50A

遥控器常用的几种协议&#xff1a; 一文打尽PWM协议、PPM协议、PCM协议、SBUS协议、XBUS协议、DSM协议 | STM32的通用定时器TIM3实现PPM信号输出 - 蔡子CaiZi - 博客园 (cnblogs.com) SpeedyBee飞塔的官方教程&#xff1a; FlowUs 息流 - 新一代生产力工具 为8位电调刷写固…