Large-Scale LiDAR Consistent Mapping usingHierarchical LiDAR Bundle Adjustment

news2024/11/26 20:42:18

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 港大开源 | 基于分层激光雷达集束调整的一致性建图 - 知乎

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

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

相关文章

GiantPandaCV | 提升分类模型acc(一):BatchSizeLARS

本文来源公众号“GiantPandaCV”,仅用于学术分享,侵权删,干货满满。 原文链接:提升分类模型acc(一):BatchSize&LARS 在使用大的bs训练情况下,会对精度有一定程度的损失,本文探讨了训练的b…

SuntoryProgrammingContest2024(AtCoder Beginner Contest 357)(A~F)(最爱线段树的一集)

A - Sanitize Hands 题意: 模拟 // Problem: A - Sanitize Hands // Contest: AtCoder - SuntoryProgrammingContest2024(AtCoder Beginner Contest 357) // URL: https://atcoder.jp/contests/abc357/tasks/abc357_a // Memory Limit: 1024…

【python报错】TypeError: ‘dict_values‘ Object IsNot Subscriptable

【Python报错】TypeError: ‘dict_values’ object is not subscriptable 在Python中,字典(dict)提供了几种不同的视图对象,包括dict_keys、dict_values和dict_items。这些视图对象允许你以只读方式遍历字典的键、值或键值对。如果…

30-unittest生成测试报告(HTMLTestRunner插件)

批量执行完测试用例后,为了更好的展示测试报告,最好是生成HTML格式的。本文使用第三方HTMLTestRunner插件生成测试报告。 一、导入HTMLTestRunner模块 这个模块下载不能通过pip安装,只能下载后手动导入,下载地址是:ht…

Elasticsearch之写入原理以及调优

1、ES 的写入过程 1.1 ES支持四种对文档的数据写操作 create:如果在PUT数据的时候当前数据已经存在,则数据会被覆盖,如果在PUT的时候加上操作类型create,此时如果数据已存在则会返回失败,因为已经强制指定了操作类型…

vue ts 导入 @/assets/ 红色显示的问题解决

vue ts 导入 /assets/ 红色显示的问题解决 一、问题描述 在使用的时候这样导入会出现如上的错误。 在使用的时候,导入的类型也没有对应的代码提示,说明导入有问题。 二、解决 在 tsconfig.json 中添加如下内容: {"compilerOptions&…

【机器学习】因TensorFlow所适配的numpy版本不适配,用anaconda降低numpy的版本

目录 0 TensorFlow最高支持的numpy版本 1 激活你的环境(如果你正在使用特定的环境) 2 查找可用的NumPy版本 3 安装特定版本的NumPy 4. 验证安装 5.(可选)如果你更改了base环境 0 TensorFlow最高支持的numpy版本 要使用 …

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

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

关于python中的关键字参数

在python语言中存在两种传参方式: 第一种是按照先后顺序来传参,这种传参风格,称为“位置参数”这是各个编程语言中最普遍的方式。 关键字传参~按照形参的名字来进行传参! 如上图所示,在函数中使用关键字传参的最大作…

MySQL-备份(三)

备份作用:保证数据的安全和完整。 一 备份类别 类别物理备份 xtrabackup逻辑备份mysqldump对象数据库物理文件数据库对象(如用户、表、存储过程等)可移植性差,不能恢复到不同版本mysql对象级备份,可移植性强占用空间占…

为什么说组合优于继承?

在编程中,继承和组合是用于在面向对象语言中设计和构建类和对象的两种基本技术。 继承,它允许一个类(称为派生类或子类)从另一个类(称为基类或超类)继承属性和行为。换句话说,子类“是”超类的…

独立游戏之路 -- 获取OAID提升广告收益

Unity 之 获取手机:OAID、IMEI、ClientId、GUID 前言一、Oaid 介绍1.1 Oaid 说明1.2 移动安全联盟(MSA) 二、站在巨人的肩膀上2.1 本文实现参考2.2 本文实现效果2.3 本文相关插件 三、Unity 中获取Oaid3.1 查看实现源码3.2 工程配置3.3 代码实现3.4 场景搭建 四、总…

编译和运行qemu-uboot-arm64单板的Armbian系统

这篇文章ARM虚拟机安装OMV-CSDN博客遗留一个启动qemu-uboot-arm64单板Armbian镜像的问题,使用官方下载的镜像,会报错: fatal: no kernel available .... Failed to load /vmlinuz ...... qemu-system-aarch64 -smp 8 -m 8G -machine virt …

搭建多平台比价系统需要了解的电商API接口?

搭建一个多平台比价系统涉及多个步骤,以下是一个大致的指南: 1. 确定需求和目标 平台选择:确定你想要比较价格的平台,例如电商网站、在线旅行社等。数据类型:明确你需要收集哪些数据,如产品价格、产品名称…

苹果手机微信如何直接打印文件

在快节奏的工作和生活中,打印文件的需求无处不在。但你是否曾经遇到过这样的困扰:打印店价格高昂,让你望而却步?今天,我要给大家介绍一款神奇的微信小程序——琢贝云打印,让你的苹果手机微信直接变身移动打…

二叉树的实现(初阶数据结构)

1.二叉树的概念及结构 1.1 概念 一棵二叉树是结点的一个有限集合,该集合: 1.或者为空 2.由一个根结点加上两棵别称为左子树和右子树的二叉树组成 从上图可以看出: 1.二叉树不存在度大于2的结点 2.二叉树的子树有左右之分,次序不能…

后端启动项目端口冲突问题解决

后端启动项目端口冲突 原因: Vindows Hyper-V虚拟化平台占用了端口。 解决方案一: 查看被占用的端口范围,然后选择一个没被占用的端口启动项目。netsh interface ipv4 show excludedportrange protocoltcp 解决方案二: 禁用H…

调试环境搭建(Redis 6.X 版本)

今儿,我们来搭建一个 Redis 调试环境,目标是: 启动 Redis Server ,成功断点调试 Server 的启动过程。使用 redis-cli 启动一个 Client 连接上 Server,并使用 get key 指令,发起一次 key 的读取。 视频可见…

鸿蒙状态管理-@Builder自定义构建函数

Builder 将重复使用的UI元素抽象成一个方法 在build方法里调用 使其成为 自定义构建函数 Entry Component struct BuilderCase {build() {Column(){Row(){Text("西游记").fontSize(20)}.justifyContent(FlexAlign.Center).backgroundColor("#f3f4f5").hei…

技术革命的十年:计算机、互联网、大数据、云计算与AI

近10年来,计算机、互联网、大数据、云计算和人工智能等技术领域发展迅速,带来了巨大的变革和创新。以下是各个领域的发展历史、现状、问题瓶颈、未来趋势以及可能的奇点。 计算机技术: 发展历史: 过去:过去十年间&am…