FAST-LIO2论文阅读

news2024/11/26 14:33:53

目录

    • 迭代扩展卡尔曼滤波
    • 增量式kd-tree(ikd-tree)
      • 增量式维护示意图
      • ikd-tree基本结构与构建
      • ikd-tree的增量更新(Incremental Updates)
        • 逐点插入与地图下采样
        • 使用lazy labels的盒式删除
        • 属性更新
      • ikd-tree重平衡
        • 平衡准则
        • 重建及并行重建子树
      • KNN搜索

之前写的一个关于FAST-LIO论文阅读的总结,可以参考FAST-LIO论文阅读参考链接

FAST-LIO2是港大MaRS实验室在FAST-LIO框架的基础上进行了修改而成,集成了他们课题组的几个工作,形成了一个非常优秀且极具代表性的框架。

论文:FAST-LIO2: Fast Direct LiDAR-Inertial Odometry
源码链接
FAST-LIO2简明公式推导
ikd-tree解析

系统的整体框架如下,与FAST-LIO相同仍然使用了一个紧耦合迭代扩展卡尔曼滤波(红色框内)。不同的地方主要在于1)直接使用输入的激光雷达原始点进行配准,去除了特征提取模块;2)增加一个ikd-tree的数据结构,能够快速的查询、增删,提高效率。
在这里插入图片描述
整体的突出贡献有以下三个部分:

  1. 提出一个iKd-tree的数据结构,能够高效查询,增量式建图。除了高效的近邻点搜索,新的数据结构还支持增量式地图更新(即点插入,在树上进行下采样,以及点删除)还能在最小化计算代价的前提下进行动态重平衡。
  2. 基于ikd-tree计算效率的提高,去除了特征提取模块,能够直接配准原始点。在剧烈运动以及杂乱的环境中更加准确、可靠。
  3. 把上述两项技术(ikd-tree与直接配准),结合到FAST-LIO(紧耦合的雷达惯性里程计,流形上的迭代卡尔曼滤波)中。

下面对系统的各模块分别进行介绍:

迭代扩展卡尔曼滤波

FAST-LIO论文阅读参考链接
算法的整体流程如下:
在这里插入图片描述

增量式kd-tree(ikd-tree)

增量式维护示意图

下图为Fast-LIO2框架中对地图进行区域管理和维护的二维演示:
在这里插入图片描述
地图点通过一个ikd-tree进行维护,通过不断融合新的扫描点,地图的区域也不断增大,但是地图不能无限制的增大,所以在当前的位置设置了一个长度为 L L L的局部区域,如上图(a)中所示。检测区域为计算的激光雷达位姿(位置)为中心, r r r为半径的球( r = γ R r=\gamma R r=γR,其中 R R R为激光雷达的测距范围, γ \gamma γ为一个大于1的松弛参数)。当新位置 p ′ p^{'} p处的检测球与地图边缘相交时,地图将会移动距离 d = ( γ − 1 ) R d=(\gamma-1) R d=(γ1)R,如上图(b)中所示,橙色区域将会被通过盒式操作删除。

ikd-tree基本结构与构建

已有的K-D tree只在叶子节点 存储一系列的点,而ikd-tree在叶子节点与内部节点均存储点(一个节点对应一个点,后续将不加区分的使用二者),以更好的支持动态点插入与重新平衡。下表中为一个节点的数据结构。
在这里插入图片描述
point:其中存储了点信息,如坐标,强度之类的。
leftchild/rightchild:指向左、右孩子节点的指针。
axis:划分空间的分割轴。
treesize:以当前点为根的子节点数量。
range:外接的轴对齐立方体。由两个对角点组成,每个维度的最大最小坐标。

ikd-tree的构建过程:与静态kd-tree的构建过程类似,ike-tree不断根据最长维度的终点进行划分空间,直到子空间中只有一个点。kd-tree数据结构的属性在构建过程中被初始化,包括(子)树的大小与距离信息,初始值如下表中所示。

在这里插入图片描述

ikd-tree的增量更新(Incremental Updates)

增量式更新在ikd-tree中被称为增量式操作,接着是动态重平衡。增量式操作包含两种类型:点式操作、盒式操作。点操作是在kd tree中插入、删除或重新插入一个单独的点。而盒式操作是对一个轴对齐立方体中的所有点进行插入、删除或重新插入操作。两种操作均集成了一个在树上下采样操作,保持地图在一个预定的分辨率。由于FAST-LIO2地图管理的需要,本文只解释了逐点插入盒式删除操作。

逐点插入与地图下采样

考虑到机器人的应用,ikd-tree支持同时进行点插入和地图下采样操作。如Algorithm2中所示:
在这里插入图片描述
对Algorithm2进行描述如下:
给定一个转换到全局坐标系下的点 p p p,下采样分辨率 l l l

  1. 下采样操作:是算法将空间分割成长度为 l l l的小立方体,找到包含点 p p p的小立方体 C D C_D CD,仅保存 C D C_D CD中最靠近中心的点。实现流程为:首先在kd tree上搜索所有包含在立方体 C D C_D CD的点,与新插入点一起存储在一个数组 V V V中。之后,比较数组 V V V中的所有点与小立方体 C D C_D CD中心点 p c e n t e r p_{center} pcenter之间的距离,仅保留 V V V中的最近点 p n e a r e s t p_{nearest} pnearest。把保留的点 p n e a r e s t p_{nearest} pnearest插入到kd tree中。

  2. 逐点插入:11-24行中的逐点插入是递归执行的,算法从根节点进行递归搜索,直到找到一个空的节点,并添加新的节点。在每一个非空节点,新的点与存储在树节点上的点在分割维度上进行比较,以进一步递归。插入过程中访问过节点的treesize, range属性会更新为最新的信息(line 21)。(line 22)中检查了插入新点后子树的平衡性,以保持ikd-tree的平衡性质。

使用lazy labels的盒式删除

在删除过程中使用lazy labels的策略,即点不会立即被从树上移除,而仅被标记为“deleted”(TABLE 1中的deleted值被标记为true),如果节点 T T T处的子树中的所有节点均被标记为“deleted”,则节点 T T T t r e e d e l e t e d treedeleted treedeleted属性被标记为 t r u e true true。在重新构建过程中,被标记为“deleted”的点将会被从树中移除。

盒式删除操作依靠 r a n g e range range属性中的范围信息以及树节点中的lazy labels策略进行实现。假设,针对一个节点 T T T,其对应的空间范围为立方体 C T C_T CT,需要从以节点 T T T的(子)树中删除立方体 C O C_O CO中的点。操作步骤如下:
在这里插入图片描述

  1. 如果立方体 C O C_O CO与立方体 C T C_T CT之间没有交集,则直接返回,不需要更新ikd-tree。(line 3)
  2. 如果立方体 C O C_O CO完全包含立方体 C T C_T CT,则删除节点 T T T,设置 d e l e t e d deleted deleted属性与 t r e e d e l e t e d treedeleted treedeleted属性均为 t r u e true true i n v a l i d n u m invalidnum invalidnum属性设置为树的尺寸。(line 4~6)
  3. 如果立方体 C O C_O CO与立方体 C T C_T CT部分相交,但不完全重叠,则对当前点及左右子节点进行递归操作(line 7~11)。当盒式删除递归操作完成后,同样做了属性更新与重平衡(line 12-13)。

属性更新

在每一个增量式操作之后都使用 A t t r i b u t e U p d a t e AttributeUpdate AttributeUpdate函数对遍历过的节点属性更新为最新的信息。
t r e e s i z e treesize treesize i n v a l i d n u m invalidnum invalidnum属性:通过求和两个子树节点的对应属性信息以及自身的点信息进行计算。
r a n g e range range属性:通过融合两个子节点的范围信息进行确定。
t r e e d e l e t e d treedeleted treedeleted:如果两个子节点属性为 t r u e true true且自身也被删除了,则设置为 t r u e true true

ikd-tree重平衡

ikd-Tree在每次增量式操作之后自动检测平衡性,并通过重建相关的子树进行动态重平衡其自身。

平衡准则

平衡准则由两部分组成, α − b a l a n c e d \alpha-balanced αbalanced α − d e l e t e d \alpha-deleted αdeleted

α − b a l a n c e d \alpha-balanced αbalanced:针对一个节点 T T T,当其左右子树满足下述条件时,则认为是 α − b a l a n c e d \alpha-balanced αbalanced的。该条件中 S S S为(子)树的尺寸, α b a l ∈ ( 0.5 , 1 ) \alpha_{bal}\in(0.5, 1) αbal0.5,1。由上可知,当 α b a l \alpha_{bal} αbal接近0.5时则对平衡性的要求也越高。

在这里插入图片描述

α − d e l e t e d \alpha-deleted αdeleted:针对一个节点 T T T,当其无效点(被删除点)数量满足下述条件时,则认为平衡。该条件中 S S S为(子)树的尺寸, I ( T ) I(T) I(T)为(子)树中无效点的数量(节点 T T T中的 i n v a l i d n u m invalidnum invalidnum属性), α d e l ∈ ( 0 , 1 ) \alpha_{del}\in(0, 1) αdel0,1,当 α d e l \alpha_{del} αdel接近0,则要求越严格。
在这里插入图片描述
违反上述的任何一个准则将触发一个重建过程,以重新平衡子树。降低树的高度与大小,能够更高效的增量式操作与查询。

重建及并行重建子树

假设对于一个子树 τ \tau τ触发了重建准则(如下图所示),首先把子树展开为一个向量V,并去除其中的无效点(被lazy label标记删除的点)。然后,对向量V中的点进行重建一个更加完美的子树 τ ′ \tau^{'} τ
在这里插入图片描述
为了避免子树 τ \tau τ过大,重建影响实时性能。使用双线程重建方法来保证高实时性。作者通过一个操作记录器来避免了两个线程间的信息丢失和内存冲突,而不是直接在第二个线程中进行重建,因此在任何时间均保持了k近邻搜索的全部性能。

重建方法流程如Algorithm 4中所示:
在这里插入图片描述
当检测到 α − b a l a n c e d \alpha-balanced αbalanced α − d e l e t e d \alpha-deleted αdeleted两个平衡准则被违反了之后,需要对子树进行重建。若子树的尺寸小于阈值 N m a x N_{max} Nmax则直接在主线程进行重建,反之,则在第二线程进行重建。第二线程的重建算法见 P a r R e b u i l d ParRebuild ParRebuild(line 11-24)。
表示要在第二线程重建的子树为 τ \tau τ,其根节点为 T T T
首先,第二线程会锁住所有的增量式更新但不会影响查询(如增删操作,line 12)。随后,第二线程复制子树 τ \tau τ中的所有有效点到向量 V V V中,但保留原始的子树不发生变化以防在重建过程中有可能的查询(line 13)。展开之后,原始的子树对主线程打开,可以进行相关的增删操作,但是这些操作同时被记录在了一个 o p e r a t i o n operation operation l o g g e r logger logger的队列中。一旦第二线程中完成了子树的重建操作(line 15)则对重建后的子树 τ ′ \tau_{'} τ执行 o p e r a t i o n operation operation l o g g e r logger logger队列的增量式操作(lines 16-18)。当所有的操作都被完成之后,使用新的子树 τ ′ \tau_{'} τ来代替原始的子树 τ \tau τ。算法锁住节点 T T T以防进行更新,然后查询并替代为 T ′ T^{'} T(line 19-22),最后释放原始子树的内存(line 23)。(注意,这一过程中虽然 L o c k A l l LockAll LockAll禁止了所有的操作,但是替换过程是非常快的,所以允许在主线程中及时操作。) L o c k U p d a t e s LockUpdates LockUpdates L o c k A l l LockAll LockAll这两个操作均通过互斥操作实现。

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

KNN搜索

尽管与现有的kd树第三方库的实现类似,ikd-tree中的近邻搜索也做了深入的优化。节点中的 r a n g e range range属性信息通过 “bounds-overlap-ball”方法用于加速近邻点搜索(详细可参考链接)。以及下图中的说明:
在这里插入图片描述

图片来源于知乎大佬无疆的文章

在搜索过程中会根据所遇到的点与目标点之间的最近的k个距离存储在一个队列 q q q中。当递归搜索到一个树节点 T T T,计算目标点到立方体 C T C_T CT之间的最小距离 d m i n d_{min} dmin,若 d m i n d_{min} dmin大于队列 q q q中的最大距离,则此节点及子节点都不用进行搜索处理了,这样就降低了回溯的量,提高时间性能。此外,在FAST-LIO2以及其他的很多LIO算法中都仅使用到达目标点一定距离范围内的点作为内点,参与状态估计。这自然的为KNN搜索提供了最大的搜索距离。还有,ikd-tree支持并行计算结构的多线程KNN搜索。

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

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

相关文章

SMTP简单邮件传输协议(C/C++ 发送电子邮件)

SMTP是用于通过Internet发送电子邮件的协议。电子邮件客户端(如Microsoft Outlook或macOS Mail应用程序)使用SMTP连接到邮件服务器并发送电子邮件。邮件服务器还使用SMTP将邮件从一个邮件服务器交换到另一个。它不用于从服务器下载电子邮件;相…

jmeter安装及使用

jmeter安装及使用 一、说明二、安装2.1 目录结构 三、使用3.1 运行jmeter3.2 设置语言3.3 设置线程组3.3.1 设置压测请求3.3.2 设置汇总报告3.3.3 设置结果树 3.4 开始压测 四、导出执行报告4.1 保存配置4.2 执行命令4.3 生成报告常见问题 一、说明 最近需要对项目接口进行压测…

vue简单实现一个类似微信左右滑动更多功能

1、需求背景 产品需要在购物车加一个左右滑动更多的功能,由于是PC端,大致扫描了下使用的UI库,貌似没有单独提供此类组件,反正有时间,就自己造一个轮子试试 2、先看效果 大致有一个橡皮筋的效果,可能没那…

分布式锁方案学习

很久没有写文章了,前些天的面试被问到了分布式锁的解决方案,回答的比较简单,只知道Redis,Mysql,Zookeeper能够作为分布式锁应用,今天就来详细的学习一下这三种分布式锁的设计思想及原理。 能够来看这篇文章…

05WEB系统的通信原理图

WEB系统的通信原理 名称作用URL统一资源定位符, 例如:http://www.baidu.com域名在https://www.baidu.com/这个网址中www.baidu.com 是一个域名IP地址计算机在网络当中的一个身份证号, 在同一个网络当中IP地址是唯一的, 有了IP地址两台计算机直接才能建立连接通信端口号一个计算…

如何让你的汇报更有说服力?数据监控是关键!

第5讲中玩过一个扫雷游戏,目标是排除计划中的“延期地雷”,但是,总有些“雷”防不胜防。我们在做计划的时候,明明已经想得非常周全了,可是,真正开工几天之后才发现,很多事情并没有那么简单。 1…

4-1 活动安排问题

1.什么是贪心算法 我的理解: 贪心算法是一种常用的问题求解方法,它在每个步骤上都选择当前看起来最优的解,而不考虑整体的最优解。简单来说,贪心算法采取局部最优的决策,希望通过每个局部最优解的选择,最终…

网络安全面试题大全(整理版)500+面试题附答案详解,最全面详细,看完稳了

前言 随着国家政策的扶持,网络安全行业也越来越为大众所熟知,想要进入到网络安全行业的人也越来越多。 为了拿到心仪的Offer之外,除了学好网络安全知识以外,还要应对好企业的面试。 作为一个安全老鸟,工作这么多年&…

全网最全的网络安全技术栈内容梳理(持续更新中)

前言 本文篇幅比较长~~耐心看完哦~ 网络安全真的那么好吗 据我了解现在我国网络安全人才缺口相当大,预计在2023年这方面人才缺口达到327万,我每年这方面的大学生才2W多。现在各政企都在发展数字化变革,对网络安全方面人才也是垂涎若渴&…

【31】核心易中期刊推荐——电子信息技术计算机技术

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

06SpringCloud rabbitmq安装

rabbitmq安装 说明:请使用资料里提供的CentOS-7-x86_64-DVD-1810.iso 安装虚拟机. 1. 安装依赖环境 在线安装依赖环境: yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel …

动态规划-概率DP

Bag of mice 题面翻译 https://www.luogu.com.cn/problem/CF148D 袋子里有 w w w 只白鼠和 b b b 只黑鼠 ,A和B轮流从袋子里抓,谁先抓到白色谁就赢。A每次随机抓一只,B每次随机抓完一只之后会有另一只随机老鼠跑出来。如果两个人都没有抓到…

【小沐学GIS】基于Cesium实现三维数字地球Earth(CesiumJS入门安装)

文章目录 1、简介1.1 平台1.1.1 Cesium ion1.1.2 CesiumJS1.1.3 Cesium for Unity1.1.4 Cesium for Unreal1.1.4 Cesium for Omniverse1.1.5 Cesium for O3DE 1.2 支持的数据格式 2、CesiumJS安装3、代码测试3.1 安装node3.2 安装依赖项3.3 运行测试示例3.4 注册获取token 4、扩…

常见的前端框架

随着前端行业的发展,前端框架越来越多出现,为我们的项目开发工作带来了极大的便利,那目前主流的前端框架有哪些呢? 工作中我们常用的前端框架有vue框架、React框架、Bootstrap框架、Angular框架等,下面给大家简单介绍…

【AI绘图】二、stable diffusion环境准备与安装

前一篇:一、stable diffusion的发展史 放一张SD的效果图 硬件配置要求 Stable Diffusion是使用显卡生成图片,对电脑硬件有一定要求。 电脑配置最核心的关键点:看显卡、看内存、看硬盘、看 CPU。 显卡:N 卡(英伟达 N…

基于内点法求解最优潮流研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Spring源码(二)— AbstractApplicationContext

上一篇文章简单的介绍了一下Spring框架大体的一个执行流程,整个专栏的内容也会根据第一篇序言中的流程图一步一步的向下梳理,并会慢慢补充更多的细节进去。 Test 创建ClassPathXmlApplicationContext来解析xml。 public class Test {public static vo…

剖析 OpenShift 中的 DNS

深入分析 OpenShift 内部 DNS OpenShift 中的DNS 相关组件及其配置1.1 Pod 中的 DNS 配置1.2 Pod 所在宿主机上的 DNS 配置及服务1.2.1 resolv.conf 文件 DNS 配置DNS 查询流程为什么需要内部 DNS? 本文基于 OpenShift 3.11,Kubernetes 1.11 进行测试 O…

2023/6/4周报

目录 摘要 论文阅读 1、标题和现存问题 2、使用GNN进行文本分类 3、INDUCT-GCN 4、实验准备 5、实验结果 深度学习 1、时空图的种类 2、图在环境中的应用 3、STGNN 总结 摘要 本周在论文阅读上,阅读了一篇InducT-GCN:归纳图卷积文本分类网络的论文。基…

python-pandas按各种时间统计和案例

使用到的库 pandas、matplotlib、numpy 使用到的函数 df.resample(“H”).sum() 参数 B business day frequency C custom business day frequency (experimental) D calendar day frequency W weekly frequency M month end frequency BM business month end frequency CBM…