从零入门激光SLAM(二十一)——FAST-LIO2论文解析

news2024/11/15 19:52:20

FAST-LIO2: Fast Direct LiDAR-Inertial Odometry

论文地址:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9697912

代码:https://github.com/hku-mars/FAST_LIO

一、文章概述

1.问题导向

基于视觉传感器的高分辨率和高精度的实时密集测绘仍然是一个巨大的挑战,同时受到光照和运动模糊的影响。新兴激光雷达显著降低了成本、尺寸、重量和功率,有可能使现有的和新兴的机器人应用程序大范围受益。但目前LIDAR-SLAM存在如下挑战。

  1. LIDAR每秒产生数十万的点甚至更多,在有限的机载计算资源上,需要LiDAR里程计方法具有较高的计算效率。
  2. 特征提取模块的性能很容易受到环境的影响。
  3. 点云在运动过程中会产生显着的运动失真,影响里程计和绘图的性能
  4. 地图需要支持有效的对应搜索查询,同时实时更新并纳入新的测量结果。维护这样的地图是一项非常具有挑战性的任务。

 2.目标

构建一个快速、健壮、通用的激光雷达惯性里程计

3.摘要

这篇文章介绍了FAST-LIO2:一个快速、健壮、通用的激光雷达惯性里程计框架。FAST-LIO2建立在高效紧耦合迭代卡尔曼滤波器的基础上,具有两个关键的新颖性,可以实现快速、稳健和准确的LiDAR导航(和测绘)。第一种是直接将原始点配准到地图上(并随后更新地图,即映射),而不提取特征。这使得能够利用环境中的细微特征,从而提高了准确性。取消了手工设计的特征提取模块,也使其自然地适应不同扫描模式的新兴LiDAR;第二个主要创新是通过增量kD树数据结构-增量k-d树(IKD-Tree)来维护地图,该结构支持增量更新(即插入和删除点)和动态重新平衡。与现有的动态数据结构(八叉树、R∗-tree和纳米k-d树)相比,它在获得更好的整体性能的同时,自然地支持对树的下采样。我们对来自各种开放的LiDAR数据集的19个序列进行了详尽的基准比较。与其他激光雷达惯性导航系统相比,FAST-LIO2具有更高的精度和更低的运算量。我们还在小视场固体激光雷达上进行了各种真实世界的实验。总体而言,FAST-LIO2在计算效率(例如,大型室外环境中高达100赫兹的里程计和测绘)、稳健性(例如,在旋转高达1000度/S的杂乱室内环境中的可靠姿势估计)、通用性(即,可同时适用于多行旋转和固态LiDAR、无人机(UAV)和手持平台以及基于Inteland ARM的处理器)方面具有优势,同时仍获得了比现有方法更高的精度。我们实现的系统FASTLIO2和数据结构IKD-Tree都是在Github上开源的。

4.贡献

  1. 开发了一种增量k-d树数据结构,增量k-d树(ikd-Tree),以有效地表示大型密集点云图。
  2. 由于ikdTree计算效率的提高,我们直接将原始点注册到地图上,从而实现更准确、更可靠的扫描配准。
  3. 将前两个改变集成到FAST-LIO2上,新系统被称为FAST-LIO2,并在Github2上开源以造福社区。
  4. 进行了各种实验来评估所开发的 ikd-Tree、直接点配准和整个系统的有效性。

二、方法解析

2.1 系统pipeline

FAST-LIO2的系统架构如上图所示。连续采样的LiDAR原始点首先在10ms和100ms之间的时间段内累积(一般将20ms作为一个周期),累积的点云称为Scan。新Scan中累计的点云会和地图点进行匹配以实现状态估计,该局部地图通过一个紧耦合的迭代卡尔曼滤波器实现(流程图的红色部分)。局部地图中的地图点由ikd-Tree(蓝色大虚线块)维护。如果当前LiDAR的FoV跨越地图边界,则从ikd-Tree中删除距离LiDAR姿态最远的地图区域的历史点。因此,ikd-Tree跟踪具有一定长度(本文称为“地图大小”)的大立方体区域内的所有地图点,并在状态估计模块中用于计算残差。优化后的姿态最终将新扫描中的点注册到全局帧中,并以里程计的频率插入到ikd-Tree中实现将它们合并到地图中,这个过程即建图。

2.2 紧耦合迭代卡尔曼滤波

FAST-LIO2的论文中简要地解释了过滤器的基本公式和工作流程,如果读者需要了解更多,请读者参阅原论文并且结合FAST-LIO了解更多细节。

2.2.1 IMU预测步

1.IMU运动学模型

2.IMU离散运动学模型

其中函数f、状态x、输入u和噪声w,定义如下

2.2.2 观测模型

1.点云残差计算

激光雷达通常一个接一个地对点进行采样。因此,当激光雷达经历连续运动时,所得到的点在不同的坐标系下。为了纠正这种扫描中的运动,我们采用了中提出的反向传播方法对点云运动补偿。

去除该噪声可获得局部LiDAR坐标系中的真实点位置

    点云残差的计算公式如下

FAST-LIO不一样的地方是不再提取特征点,而是使用源点计算残差。

2.迭代

IMU的预测残差如下

构建了关于IMU预测过程以及基于LIDAR匹配残差的最大后验分布,求解使得误差最小时对应的系统状态。

3.更新

迭代优化直至达到阈值,计算最后一次迭代的卡尔曼增益和状态量。

4.映射

2.3 映射

2.3.1 地图管理

地图点被组织成一棵IKD-Tree,它通过以里程计合并新扫描的点云来动态增长。为了防止地图的大小脱离绑定,在IKD-Tree上只保留激光雷达当前位置周围L长度的大局部区域中的地图点。

改进:1.重建树时,使用两个线程。2.删除点时,先标记为deleted,需删除的点达到一定比例后再重建树。3.类似的,添加点时,先放到未端,不平衡的部分达到一定比例后再重建树。

2.3.2 树的结构和构建

1.构造

ikd-tree是一种二叉树,在kdtree的基础上进行改进,支持高效的插入和删除操作,与kdtree不同的是在叶子节点与内部节点均存储点。ikd-tree的构建过程:与静态kd-tree的构建过程类似,ike-tree不断根据最长维度的终点进行划分空间,直到子空间中只有一个点。ikd-tree的数据结构如下

  • Point 点的坐标强度信息
  • Leftchild/rightchild 指向其左右子节点的指针
  • Axis 用于分割空间的分割轴记录
  • deleted 当点从地图中删除时,节点不会立即从树中删除,而只是将布尔变量 deleted 设置为 true
  • treedeleted  删除以节点为根的整个子树,将 treedeleted 设置为 true
  • invalidnum 从(子)树中删除的点的数目
  • range 子树上点的范围信息

2.增量更新

ikd-Tree 上的增量更新指的是增量操作,支持 逐点操作按框操作

逐点操作在 k-d 树中插入、删除或重新插入单个点。

按框操作在给定的轴对齐长方体中插入、删除或重新插入所有点。

3.逐点插入与地图下采样

考虑到机器人的应用,ikd-tree支持同时进行点插入和地图下采样操作

4.惰性标签按框删除

在删除操作中,我们使用惰性删除策略。也就是说,这些点不会立即从树中删除,而只是通过将属性deleted(参见数据结构,第6行)设置为true来标记为“已删除”。如果以节点T为根的子树上的所有节点都已被删除,则T的属性treedeleted将被设置为true。因此,属性deleted和treedeleted被称为懒惰标签。标有“已删除”的点将在重建过程中(参见SectionV-D)从树中移除。

5.属性更新

在每次增量操作之后,需根据最新的信息并借助函数AttributeUpdate更新被访问节点的属性。该函数通过汇总两个子节点上的相应属性和自身的点信息来计算属性treesize和invalidnum。通过合并两个子节点的范围信息和其上存储的点信息来确定属性range;如果两个子节点的treedeleted都为true并且节点本身被删除,则treedeleted被设置为true。

6.Ikd-tree重平衡

ikd-Tree在每次增量操作后会主动监控平衡属性,并通过仅重建相关的子树来动态地重新平衡自身。

平衡准则由两个子准则组成:α-平衡准则和α-删除准则

假设ikd树的子树以T为根,当且仅当它满足以下条件时子树是α-平衡的:

以T为根的子树的α-删除准则是:

如果ikd-Tree的子树满足这两个标准,则该子树是平衡的。如果所有子树都是平衡的,则整个树是平衡的。违反任何一个标准都将触发重新构建过程来重新平衡该子树:α平衡标准保持着树的最大高度。α-删除准则确保子树上的无效节点被移除以减小树的大小。通过降低k-d树的高度和大小允许将来高效的增量操作和查询。

7.重建及并行重建子树

假设对于一个子树触发了重建准则(如下图所示),首先把子树展开为一个向量V,并去除其中的无效点(被lazy label标记删除的点)。然后,对向量V中的点进行重建一个更加完美的子树。为了保持较高的实时性,我们设计了一种双线程重建方法。我们提出的方法不是简单地在第二个线程中重建,而是通过操作记录器避免了两个线程中的信息丢失和内存冲突,从而始终保持knearest邻居搜索的完全准确性。

重建的方法参见 Algorithm 4。当违反平衡标准时,当子树的树大小小于预定值Nmax时,在主线程中重建子树;否则,在第二线程中重建子树。第二个线程上的重建算法如函数ParRebuild所示。将第二个线程中要重建的子树表示为t,将其根节点表示为T。第二个线程将锁定所有增量更新(即点插入和删除),但不锁定该子树上的查询(第12行)。然后,第二线程将子树t中包含的所有有效点复制到点数组V中(即,展平),同时保持原始子树不变,以用于重建过程中可能的查询(第13行)。展平后,原始子树被解锁,以便主线程进一步执行增量更新的请求(第14行)。这些请求将同时记录在一个名为operation logger的队列中。一旦第二个线程完成从点数组V构建新的平衡k-d树t`(第15行),记录的更新请求将由函数IncrementalUpdates在t`上再次执行(第16-18行)。

上述的并行重建设计能够保证在第二个线程中重建过程中,主线程中的建图过程仍然能够在里程计的频率进行而不被任何中断。

8.最邻近搜索

尽管与那些众所周知的k-d树库[43]-[45]中的现有实现类似,但最近搜索算法在ikd树上被彻底优化。使用[41]中详述的“边界重叠球”测试,充分利用树节点上的范围信息来加速我们的最近邻搜索。维护优先级队列q以存储迄今为止遇到的k个最近邻点以及它们到目标点的距离。当从树的根节点向下递归搜索树时,首先计算从目标点到树节点的立方体CT的最小距离dmin。如果最小距离dmin不小于q中的最大距离,则不需要处理该节点及其后代节点。此外,在FAST-LIO2(和许多其他激光雷达里程计)中,只有当邻近点在目标点周围的给定阈值内时,才会被视为内点,并因此用于状态估计,这自然为knearest邻近点的范围搜索提供了最大搜索距离[43]。在任一情况下,范围搜索通过将dmin与最大距离进行比较来删减算法,从而减少回溯量以提高时间性能。需要注意的是,我们的ikd-Tree支持并行计算架构的多线程k近邻搜索。

三、总结

本文提出了FAST-LIO2,这是一个直接和健壮的LIO框架,其速度明显快于当前最先进的LIO算法,同时在各种数据集中实现了极具竞争力的或更好的准确性。速度的提高归功于删除了特征提取模块和高效的映射。提出并验证了一种新的支持动态点插入、删除和并行重建的增量k-d树(IKD-Tree)数据结构。在开放数据集上的大量实验表明,在LiDAR里程计的KNN搜索数据结构中,所提出的IKD-Tree能够获得最好的整体性能。通过利用里程表中更多的测点,提高了测绘效率,提高了对快速运动和稀疏场景的准确性和稳健性。FAST-LIO2的另一个好处是,由于取消了特征提取,它自然能够适应不同的激光雷达,而特征提取必须根据不同的激光雷达各自的扫描模式和密度仔细设计。作为里程计,FAST-LIO2可能会漂移很远的距离。

将来,我们可以在FAST-LIO2中集成闭环检测和LiDAR束调整来纠正这种长期漂移。此外,将探索与其他传感器的融合,如GPS或照相机,以使FAST-LIO2能够在部分或完全退化的环境中工作。

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

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

相关文章

金锋关晓柔短视频:成都鼎茂宏升文化传媒公司

金锋关晓柔短视频:情感与创意的交织 在短视频的浪潮中,无数创作者凭借独特的视角和创意脱颖而出。其中,金锋和关晓柔共同打造的短视频系列以其深厚的情感内涵和精湛的创意表达,成都鼎茂宏升文化传媒公司吸引了大量观众的关注&…

zabbix自定义监控项

文章目录 1、配置conf文件(zabbix_agent2)linuxwindows 2、配置监控项3、配置触发器4、查看监控数据 示例自定义程序 hash_tool:输出指定目录的哈希值 调用指令: hash_tool --path [指定目录] 1、配置conf文件(zabbix_agent2) linux vim /etc/zabbix/z…

液氢产业化进程提速 液氢装备检测市场需求空间广阔

液氢产业化进程提速 液氢装备检测市场需求空间广阔 液氢装备检测试验项目涉及到火烧试验、置换试验、振动试验、燃烧实验、高压氢循环试验、预冷试验、液氢阀门检测试验等。检测试验是推动氢能技术自主化、高质量发展的重要步骤,近年来,随着液氢应用场景…

工博科技联手伯尼纳,共谋食品包装外贸行业新市场,助力全球市场拓展!

4月11日,伯尼纳贸易(江苏)有限公司(以下简称“伯尼纳”)SAP项目正式启动,双方项目组成员在福建厦门出席本次项目启动会。伯尼纳SAP项目的启动标志着企业业财信息化建设进入了一个新的历程。 实现业财一体化…

【软件设计师】——9.UML建模

目录 9.1概述 9.2 结构图 9.2.1 对象图 9.2.2 类图 9.2.3 构件/组件图 9.2.3 部署图 9.2.4 制品图 9.2.5 组合结构图 9.3 行为图 9.3.1 用例图 9.3.2 协作图 9.3.3 顺序/序列/时序图 9.3.4 活动图 9.3.5 状态图 9.3.6 通信图 9.4 交互图 9.1概述 基本概念 UML统…

matplotlib---气泡图

气泡图简介: 气泡图(Bubble Chart)是一种数据可视化图形,主要用于展示多个数据点之间的关系。 气泡图通过气泡的大小,位置和颜色可以展示数据之间的关系。在气泡图中,横轴和纵轴通常表示数据的两个维度&a…

【二分查找 位运算】3145. 大数组元素的乘积

本文涉及知识点 二分查找算法合集 位运算、状态压缩、枚举子集汇总 LeetCode3145. 大数组元素的乘积 一个整数 x 的 强数组 指的是满足和为 x 的二的幂的最短有序数组。比方说,11 的强数组为 [1, 2, 8] 。 我们将每一个正整数 i (即1,2&am…

揭秘订单排队模式:社交电商新策略

随着移动互联网的蓬勃发展,社交电商正以其独特的魅力席卷全球。据权威机构预测,到2024年,全球社交电商市场规模有望达到惊人的2.8万亿美元。面对如此庞大的市场蛋糕,如何精准把握机遇,实现业务的跨越式增长&#xff0c…

Java基础之面向对象练习

需求1: 代码呈现 商品类型 public class Goods {private String id;private String name;private double price;private int count;public Goods() {}public Goods(String id, String name, double price, int count) {this.id id;this.name name;this.price p…

真心分享:公司监控员工聊天记录的七种方法

公司为了让员工专注于工作,避免无关事情分心,比如无关的瞎聊天,会使用一些手段监控员工聊天,那么这些手段是什么呢?主要有以下几种。 1.使用专业监控软件: 如安企神软件、域智盾等,这些软件设计…

SwiftUI 5.0(iOS 17)进一步定制 TipKit 外观让撸码如虎添翼

概览 在之前 SwiftUI 5.0(iOS 17)TipKit 让用户更懂你的 App 这篇博文里,我们已经初步介绍过了 TipKit 的基本知识。 现在,让我们来看看如何进一步利用 SwiftUI 对 TipKit 提供的细粒度外观定制技巧,让 Tip 更加“明眸…

Vapor Mode:Vue.js 的速度与激情,代码界的闪电侠

大家好,我是宝哥。 在快速发展的网络开发世界中,创新的Vue.js团队给我们带来了Vapor Mode。这个新模式优化了Vue的核心渲染过程,帮助我们的应用程序像轻烟一样运行,开发者无需深入复杂的优化工作。 在这篇文章中,我们将…

Windows:安装Win10、Win7系统常用的2种方式及相关问题处理

一、准备工作 1、U盘 首先,我们要准备一个8G左右大小的U盘 2、下载镜像文件 参考∶ 镜像文件下载及其检验方法 3、新机必备软件 建议安装之前,先把这些软件下载好。 360驱动大师、chrom浏览器、搜狗输入法、爱奇艺万能联播、Notepad、PDF、QQ、微信、…

re:记录下正则的使用方法

1、match pattern r(\d{4})[-\/](\d{1,2})[-\/](\d{1,2}) match re.search(pattern, text) if match:year, month, day match.groups()

音视频开发—音频相关概念:数模转换、PCM数据与WAV文件详解

文章目录 前言1.模拟数字转换(ADC)1.1ADC的关键步骤: 2.数字模拟转换(DAC)2.1DAC 的基本流程包括: 3.PCM数据3.1PCM 数据的关键要素包括: 4.WAV文件4.1 WAV的构成4.2WAV文件的标准块结构4.3WAV的…

Vue3学习使用axios和qs进行POST请求和响应处理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、前言1.准备工作2.发送POST请求3.处理响应数据4.总结 一、前言 在前端开发中,经常需要与后端进行数据交互,其中包括发送POST请求并处理响…

Kubernetes核心组件Ingress详解

1.1 Ingress介绍 Kubernetes 集群中,服务(Service)是一种抽象,它定义了一种访问 Pod 的方式,无论这些 Pod 如何变化,服务都保持不变。服务可以被映射到一个静态的 IP 地址(ClusterIP&#xff09…

代码随想录算法训练营第36期DAY36

贪心好难&#xff0c;希望能坚持到柳暗花明那天。 DAY36 1005K次取反后最大化的数组和 自己的方法&#xff0c;注意越界条件放在最前面就好&#xff1a; class Solution {public: int largestSumAfterKNegations(vector<int>& nums, int k) { //自己的…

Kubernetes数据存储

1. 数据存储 容器的生命周期可能很短&#xff0c;会被频繁地创建和销毁。那么容器在销毁时&#xff0c;保存在容器中的数据也会被清除。这种结果对用户来说&#xff0c;在某些情况下是不乐意看到的。为了持久化保存容器的数据&#xff0c;kubernetes引入了Volume的概念。 Volu…

光纤跳纤,这篇文章值得一看

光纤跳线作为光网络布线最基础的元件之一&#xff0c;被广泛应用于光纤链路的搭建中。 如今&#xff0c;光纤制造商根据应用场景的不同推出众多类型的光纤跳线&#xff0c;如 MPO / LC / SC / FC / ST 光纤跳线&#xff0c;单工/双工光纤跳线&#xff0c;单模/多模光纤跳线等&…