fast-lio2论文阅读 《FAST-LIO2: Fast Direct LiDAR-inertial Odometry》

【LOAM系列】八:Fast-Lio2论文笔记 Fast-Lio2论文笔记 阅读详情
AI摘要

FAST-LIO2是一个结合了增量k-d树和直接点配准的快速、鲁棒和通用的激光雷达惯性里程计框架。通过ikd-Tree数据结构,该系统支持高效的地图更新和查询,同时消除特征提取模块,适应不同类型的激光雷达。直接点配准增强了定位和建图的准确性,尤其在小视场和杂乱环境中。在多个数据集和实际环境的实验中,FAST-LIO2在较低计算负荷下展现出高精度和鲁棒性,适用于各种传感器和平台。

【摘要】 

        本文提出了FAST-LIO2:一个快速、鲁棒和通用的激光雷达惯性里程计框架。FAST-LIO2基于一个高效的紧密耦合迭代卡尔曼滤波器,FAST-LIO2有两个关键的新特性,允许快速、鲁棒和精确的激光雷达导航(和建图)。第一个方法是将原始点直接配准到地图上(随后更新地图,即建图),而不提取特征。这使得我们能够利用环境中的微妙特征,从而提高了准确性。消除了手工设计的特征提取模块,也使它自然地适应不同扫描模式的激光雷达;第二个主要的新颖之处是通过增量k-d树数据结构ikd-Tree维护地图,从而实现增量更新(即点插入、删除)和动态重新平衡。与现有的动态数据结构(八叉树、R∗树、naniflflann k-d tree)相比, ikd-Tree实现了卓越的整体性能,同时合理的支持对树的降采样操作。

        我们对来自各种开源的激光雷达数据集的19个序列进行了详尽的基准测试比较。与其他最先进的激光雷达-惯性导航系统相比,FAST-LIO2在更低的计算负载下实现了持续到达更高的精度。在具有小视场的固态激光雷达(livox)上也进行了各种现实世界的实验。总的来说,FAST-LIO2具有计算效率高(例如,在大型户外环境中高达100Hz的里程计定位状态估计和建图),鲁棒(例如,在杂乱的旋转高达1000度/秒的室内环境中可靠的姿态估计),多用途(即,适用于多线旋转和固态激光雷达、无人机和手持平台,以及基于英特尔和arm的处理器),同时仍然实现比现有方法更高的精度。

【I. INTRODUCTION】

        实时构建一个未知环境的密集三维(3D)地图,同时在地图中定位(即SLAM),对于自主机器人在未知环境中安全导航至关重要。定位为机器人机载控制器提供了状态反馈,而密集的三维地图为轨迹规划提供了必要的环境信息(即自由空间和障碍物)。基于视觉的SLAM[1]-[4]在定位上非常精确,但只保持了一个稀疏的特征图,并存在光照变化和严重的运动模糊。另一方面,基于机器人计算资源的高分辨率和精度的实时稠密建图[5]-[8]仍然是一个巨大的挑战。

        由于能够提供直接、密集、主动和精确的环境深度测量的能力,3D光探测和测距(激光雷达)传感器已经成为另一种机器人所必备的传感器。在过去的十年里,激光雷达在许多自动驾驶机器人中扮演着越来越重要的角色,比如自动驾驶汽车[11]和自动驾驶无人机[12,13]。激光雷达技术的最新发展使商业化和大规模生产更轻量级,成本效益(成本范围类似于全局快门相机),和高性能(厘米精度数百米测量范围)固态激光雷达[14,15],吸引了最近[16]-[20]的研究兴趣。这些激光雷达大大降低了成本、尺寸、重量和功率,有可能使现有和新兴的机器人应用广泛受益。

        在这些广泛的应用中,采用基于激光雷达的SLAM方法的核心要求是在有限的板载计算资源下获得准确、低延迟的状态估计和密集的三维地图。然而,高效和准确的激光雷达里程计和建图仍然是一个具有挑战性的问题:1)当前的激光雷达传感器产生大量的从数十万到数百万的三维点。在有限的板载计算资源上实时处理如此大量的数据,需要激光雷达里程计方法具有较高的计算效率;2)为了减少计算负荷,通常基于局部平滑度提取特征点、边缘点或平面点等特征点。然而,特征提取模块的性能很容易受到环境的影响。

        例如,在没有大平面或长边的无结构环境中,特征提取将导致很少的特征点。如果激光雷达视场(FoV)很小,这种情况就会严重恶化,这是新出现的固态激光雷达[16]的典型现象。此外,特征提取也从激光雷达到激光雷达,这取决于扫描模式(例如,旋转,基于棱镜的[15],基于MEMSs的[14])和点密度。因此,采用激光雷达里程计通常需要大量的人工处理的工程工作;3)当传感器进行连续运动时,激光雷达点通常是按顺序采样的。这一过程产生了显著的运动失真,影响里程计和建图的性能,特别是当运动严重时。惯性测量单位(IMU)可以缓解这个问题,但引入额外的状态(例如偏差,外参)需要估计;4)激光雷达通常有一个很长的测量范围(例如,几百米),但在扫描的扫描线之间的分辨率相当低。所得到的点云测量值稀疏地分布在一个大的三维空间中,需要一个大的和密集的地图来配准这些稀疏的点。此外,该地图需要支持高效的查询对应的搜索,同时实时更新整合新的测量。

       维护这样的一个地图是一项非常具有挑战性的任务,与视觉测量明显不同的是,视觉测量的图像测量值具有很高分辨率,所以只需要一个稀疏的特征图,因为地图中的一个特征点总是可以找到对应关系,只要它落在FOV中。

        在这项工作中,我们通过两个关键的新技术来解决这些问题:增量k-d树和直接点配准。更具体地说,我们的贡献如下:

        1)我们开发了一个增量的k-d树数据结构,ikd-Tree,以有效地表示一个大的密集点云图。除了有效的最近邻搜索外,新的数据结构还支持增量地图更新(即点插入、树上降采样、点删除)和以最小的计算成本进行动态重新平衡。这些特性使得ikd-Tree非常适合激光雷达状态估计和建图应用,实现100hz里程计和在计算约束平台上的建图,如基于英特尔i7的微型无人机机载计算机,甚至基于arm的处理器。ikdTree数据结构工具箱是在Github上开源的。

        2)由于ikd-Tree的计算效率有所提高,我们直接将原始点注册到地图上,即使在剧烈的运动和非常杂乱的环境中,也能实现更准确可靠的扫描配准。我们将这种基于原始点的配准称为直接方法,类似于视觉SLAM[21]。消除了人工处理的特征提取,使该系统自然地适用于不同的激光雷达传感器;

        3)我们将这两种关键技术集成到我们最近开发的一个完全紧密耦合的激光雷达-惯性里程计系统FAST-LIO[22]中。该系统使用一个IMU,通过一个严格的反向传播步骤来补偿每个点的运动,并通过一个流形上迭代卡尔曼滤波器来估计系统的全状态。为了进一步加快计算速度,我们使用了一个新的、数学上等价的计算卡尔曼增益的公式,将计算复杂度降低到状态的维数(而不是测量量的维数)。

        新系统被称为FAST-LIO2,在Github开源以造福社区;4)我们进行各种实验来评估开发的ikd-Tree、直接点云配准和整个系统的有效性。对18个不同大小的序列进行的实验表明,ikdTree在应用激光雷达里程计和建图方面,比现有的动态数据结构(八叉树、R∗树、nanoflflann k-d树)具有优越的性能。对来自各种开放激光雷达数据集的19个序列进行详尽的基准比较表明,与其他最先进的激光雷达惯性导航系统相比,FAST-LIO2在更低的计算负载下始终获得更高的精度。最后,我们展示了FAST-LIO2在具有挑战性的新兴固体激光雷达收集的真实世界数据上的有效性,包括剧烈性运动(例如,旋转速度高达1000度/s)和无结构环境。

【II. RELATED WORKS 】

A. LiDAR(-Inertial) Odometry

        现有的三维激光雷达上的工作通常继承张继[23]中提出的LOAM框架。它由三个主要模块组成:特征提取、激光里程计和建图。为了减少计算负荷,一种新的激光雷达扫描首先基于局部平滑度进行特征点(即边缘和平面)的提取。然后,里程计模块(帧到帧)匹配来自两个连续扫描的特征点,以获得一个粗糙的但实时的(例如,10Hz)激光雷达姿态里程计。使用里程计,多个扫描被组合合并为一个扫描,然后将其配准并合并到一个全局地图(即建图)。在这个过程中,建图点云被用来构建一个kd树,使一个非常高效的k-最近邻搜索(kNN搜索)。然后,通过迭代最近点(ICP)[24]-[26]方法实现点云配准,其中每次迭代中,地图中的几个最近点形成一个目标点属于的平面点或边缘点。为了减少k-d树的时间,地图点以规定的分辨率进行降采样。优化的建图过程通常以很低的速率(1-2Hz)执行。

        随后的激光雷达里程计法工作保持了一个类似于LOAM的框架。例如,Lego-LOAM[27]引入了一个地面点分割来减少计算量,以及一个闭环模块来减少长期漂移。此外,LOAM-Livox[16]采用了LOAM到一个新兴的固态激光雷达。为了处理小视场和非重复扫描,即连续两次扫描的特征点对应点很少,通过直接将新的scan配准到全局地图上得到LOAM-Livox的里程计。这种直接扫描到地图配准增加了里程计的精度,但代价是增加了在每一步建立更新的地图点的k-d树的计算量。

        通过提供ICP所需的良好初始姿态,加入IMU可以显著提高激光雷达里程计的精度和鲁棒性。此外,高速率IMU测量可以有效地补偿激光雷达扫描中的运动失真。LION[28]是一种松散耦合的激光雷达惯性SLAM方法,它保持LOAM的帧到帧的配准,并在里程计中引入可观测意识检查,以降低点数,从而节省计算量。更紧密耦合的激光雷达-惯性融合框架成果有,[17,29]-[31]在一个由固定数量的最近的激光雷达扫描(或关键帧)组成的小型局部地图(固定关键帧的local map)中执行里程计测量。与scan到scan配准相比,scan to local map局部地图配准通常更准确。更具体地说,LIOM[29]提出了一种紧密耦合的激光雷达惯性融合方法,其中IMU的预积分被引入到里程计中。LILIOM[17]开发了一种新的非重复扫描激光雷达特征提取方法,并在一个由最近20次的激光雷达帧数据组成的小local地图中进行扫描配准。

        LIO-SAM[30]的里程计需要一个9轴的IMU来产生姿态测量,作为在一个小的局部地图内的扫描配准的预先测量值。

        LINS[31]在里程计中引入了紧密耦合迭代卡尔曼滤波器和自动中心公式。由于上述工作中的局部图local map通常较小,无法获得实时性能,里程计的漂移迅速,需要一个低速率的建图过程,如地图提纯(LINS[31])、滑动窗口联合优化(LILI-OM[17]和LIOM[29])和因子图平滑[32](LIO-SAM[30])。

        与上述方法相比,FAST-LIO[22]引入了一种整齐的反向传播,它精确地考虑scan中每个单个点的采样时间,并通过一个由IMU测量驱动的严格运动学模型来补偿运动失真(去畸变)。此外,利用一种新的卡尔曼增益公式,将计算复杂度从测量值的维数降低到状态的维数。证明了新公式在数学上与传统公式等价,但将计算量减少了几个数量级。显著提高的计算效率能够直接和实时在里程计中实现scan to map的配准,并在每一步更新地图(即建图)。及时配准所有最近的扫描点可以增加里程计的准确性。然而,为了防止构建地图的k-d树的时间不断增加,该系统只能在较小的环境中工作(例如,数百米)----这就是fast-lio的缺陷,因为地图的扩大,到达一定值后scan to map的计算和map的维护无法保证实时性。

        为此,作者优化了其缺陷,引入了FAST-LIO2。FAST-LIO2建立在FAST-LIO[22]的基础上,因此继承了紧密耦合的融合框架,特别是反向传播解决运动失真和快速卡尔曼增益计算,提高了效率。为了系统地解决日益增长的计算问题,我们提出了一种新的数据结构ikd-Tree,它支持每一步的增量地图更新和高效的kNN查询。得益于计算负荷的大幅减少,里程计是通过直接配准原始激光雷达点到地图来实现的(不需要降采样),这样它提高了里程计和建图的准确性和鲁棒性,特别是当一个新的scan不包含显著的特征(例如,由于小视场雷达和/或无结构环境)。与上述所有使用特征点的紧密耦合激光雷达惯性方法相比,我们的方法轻量,实现了更高的建图速率和里程计精度,并消除了特征提取的参数调整的需要。

        我们的工作中直接配准原始点云的想法已经在LION[28]中探索过,然而,这是如上所述的一种松散耦合的方法。这个想法也与[26]中提出的广义ICP(G-ICP)非常相似,其中一个点被配准到地图上的一个小的局部平面上。这最终假设环境是平滑的,因此可以视为一个平面。然而,广义icp的计算负荷通常是较大的[33]。其他基于正态分布变换(NDT)[34]-[36]的工作也配准了原始点,但NDT比ICP的稳定性较低,在某些场景[36]中可能存在发散不收敛情况。

B. Dynamic Data Structure in Mapping

        为了实现实时地图构建,需要一个动态的数据结构来高效地支持地图增量更新和kNN搜索。一般来说,kNN搜索问题可以通过建立数据点的空间指标来解决,可分为两类:数据分区并分割空间。划分数据的一个著名实例是R-tree[37],它基于空间中数据的接近度将数据聚类为潜在的重叠轴对齐长方体。各种R-tree通过线性、二次和指数复杂度来分割节点,所有这些复杂性都支持最近邻搜索和点级更新(插入、删除和重新插入)。此外,R-tree还支持在给定的搜索区域内或满足给定的条件搜索目标数据点。R-树的另一个版本是R∗-tree,它的性能优于原始的R-tree[38]。R∗-tree通过最小重叠标准处理插入,并对节点分割算法应用强制重新插入原则。 

        八叉树[39]和k维树(k-d树)[40]是两种众所周知的数据结构类型,用于分割kNN搜索的空间。八叉树通过递归地将空间平均分成8个轴对齐的立方体来组织三维点云。当立方为空,或满足停止规则(如最小分辨率或最小点数)时,立方的细分将停止。新的点被插入到八叉树上的叶节点上,同时在必要时应用进一步的细分。八叉树支持kNN搜索和按框式搜索,它返回给定轴对齐的长方体中的数据点。

        k-d树是一种二叉树,其节点表示一个轴对齐的超平面,将空间分成两部分。在标准构造规则中,选择分割节点作为沿最长维数的中值点,以实现一个紧凑的空间分割[41]。在建图中考虑低维和主内存存储的数据特征时,对比研究表明,k-d树在kNN问题[42,43]中的性能最好。但是,在k-d树中插入新点和删除旧点会恶化树的平衡属性;因此,需要重新构建来重新平衡树。使用k-d树库的建图方法,如ANN[44],libbabo[43]和FLANN[45],完全重建了k-d树来更新地图,这导致了相当多的计算。

        虽然在三维图形应用[46]-[49]中对基于硬件重建k-d树的方法进行了深入的研究,但所提出的方法严重依赖于计算源,这些方法通常在车载计算机的计算源非常局限。Galperin等人提出了全规模重建树,而是提出了一种替身k-d树,其中应用于重建部分不平衡的子树,以保持整个树[50]的松散平衡特性。另一种实现增量操作的方法是以类似于[51,52]的对数方法维护一组kd树,并重建一个精心选择的子集。Bkd-树在主内存中维护一个最大大小为M的kd树T0,在外部内存中维护一组kd树Ti,其中第i棵树的大小为2(i−1)M[53]。当树T0已满时,将这些点从T0提取到Tk−1,并插入到第一个空树Tk中。最先进的实现 nanoflflann kd树利用对数结构进行增量更新,而惰性标签只标记被删除的点,而没有从树(从此处的内存)[54]中删除它们。

        我们提出了一种基于替身k-d树树的动态数据结构,称为增量树(ikd-tree)[50],以实现实时的建图。我们的ikd-tree支持点级插入,且能够使用在树上降采样,这是建图中的一个常见要求,而降采样必须在向其他动态数据结构[38,39,54]中插入新的点之前在外部进行。当需要在给定区域中去除具有规则形状的不必要的点时(如长方体)时,现有的r树和八叉树实现搜索给定空间内的点并一个一个地删除它们,而常见的k-d树使用半径搜索来获得点索引。

        与这种间接和低效的方法相比,ikd-Tree通过维护范围信息和惰性标签,直接删除给定轴对齐长方体中的点。标记为“已删除”的点将在重建过程中被删除。此外,虽然将部分重平衡方法作为替身k-d树[50]和nanoflflann k-d树[54]后,可以进行增量更新,但使用k-d树的建图方法在大量点上重建时存在间歇性延迟。为了克服这一问题显著延迟,ikd-tree中通过并行重建,同时保证主线程的实时能力和准确性。 

【III. SYSTEM OVERVIEW】

        顺序采样的激光雷达原始点首先在10ms(100Hz更新)和100ms(10Hz更新)之间的一段时间内累积,累积的点云被称为一帧scan。为了执行状态估计,一个新scan中的点就与地图点云进行配准,通过一个紧密耦合的迭代卡尔曼滤波框架来,在一个大的局部地图中进行维护(大的红色虚线块)。在大的局部地图中的全局地图点由一个增量kd树结构ikd-Tree来组织管理(蓝色大虚线块)。如果当前激光雷达的视场范围越过地图边界,则将从ikd-Tree中删除距离LiDAR姿态最远的历史点云(一旦越过边界获得更大地图范围触发ikd-tree重构最远点)。因此,ikd-Tree跟踪一个具有一定长度(本文称为“地图大小”)的大立方体区域中的所有地图点,(也可以理解为滑窗形式)并用于计算状态估计模块中的残差。优化后的姿态最终将新scan中的点配准到全局帧中,并通过以里程计(即映射)的频率插入到ikd-Tree中,将它们合并到建图中。

IV. STATE ESTIMATION

        FAST-LIO2的状态估计是一个继承自FAST-LIO[22]的紧密耦合迭代卡尔曼滤波器,但进一步改进包括激光雷达-IMU外参的在线校准。在这里,我们简要地解释了滤波器的基本公式和工作流程,并参考读者到[22]了解更多的细节。    即参看fast-lio的推导过程  https://mp.youkuaiyun.com/mp_blog/creation/editor/124033588

A. Kinematic Model

首先推导出由状态转移模型和测量模型组成的系统模型。

1) State Transition Model:

        以第一个IMU坐标系(记为I)为全局帧(记为G),表示ITL = 

GpI,GRI表示IMU在全局坐标系下的位置和姿态,Gg是全局坐标系的重力向量,am和ωm IMU测量,na和nω表示测量噪声ωm,ba和bωIMU偏差建模为随机行走过程由nba和nbω,符号b∧表示向量∈的斜对称交叉积R3矩阵。

 

FAST-LIO2:论文和算法解析 本文介绍了FAST-LIO2算法:一种快速、鲁棒、通用的激光雷达-惯性里程计框架。FAST-LIO2基于高效的紧密耦合迭代卡尔曼滤波器,具有两个关键的新颖之处,可实现快速,稳健和准确的激光雷达导航(和测绘)。第一种方法是直接将原始点注册到地图上然后更新地图,而不提取特征。这样可以利用环境中的细微特征,从而提高准确性。消除手工设计的特征提取模块,也使其能够适应不同扫描模式的新兴激光雷达; 阅读详情

相关推荐

FAST-LIO2论文阅读

之前写的一个关于FAST-LIO论文阅读的总结,可以参考FAST-LIO2是港大MaRS实验室在FAST-LIO框架的基础上进行了修改而成,集成了他们课题组的几个工作,形成了一个非常优秀且极具代表性的框架。系统的整体框架如下,与FAST-LIO相同仍然使用了一个紧耦合迭代扩展卡尔曼滤波(红色框内)。不同的地方主要在于1)直接使用输入的激光雷达原始点进行配准,去除了特征提取模块;2)增加一个ikd-tree的数据结构,能够快速的查询、增删,提高效率。

晓晨的博客 2641

FAST-LIO2:快速且直接的激光雷达与惯导里程计

本文介绍了FAST-LIO2:一种快速、稳健且通用的激光惯性里程计框架。FAST-LIO2建立在高效的紧耦合迭代卡尔曼滤波器的基础上,有两个关键的创新之处可以实现快速、稳健和准确的激光雷达导航(和建图)。第一个是不提取特征直接将原始点配准到地图(并随后更新地图,即建图),而这使得环境中的细微特征能够被使用,从而提高匹配准确性,且取消提取特征模块能够适应有着不同扫描模式的新兴雷达;第二个新颖之处是通过增量k-d树(ikd-tree)数据结构维护地图。ikd-tree支持增量更新(即点插入删除)和动态平衡。与现

人无远虑,必有近忧 1万+

Mid-360激光雷达室内无人机定位实战:从驱动到FAST-LIO2

室内环境缺少卫星信号,无人机自主定位需要依赖激光雷达与惯性测量的融合技术。SLAM作为核心原理,通过点云与IMU数据的时间同步和紧耦合解算,实时估计飞行器位姿。激光雷达因不受光照影响而成为室内定位的首选传感器,其中非重复扫描方式能有效提升点云覆盖率,为特征提取和建图提供更稳定的输入。这种技术通常应用于无人机巡检、仓储物流和地下空间探测等场景。Livox Mid-360凭借宽垂直视场角和内置IMU硬件同步能力,配合FAST-LIO2开源方案,可实现可靠的室内定位测试。本文从设备特性、环境搭建、驱动安装到算法实

weixin_34007886的博客 393

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

问题导向基于视觉传感器的高分辨率和高精度的实时密集测绘仍然是一个巨大的挑战,同时受到光照和运动模糊的影响。新兴激光雷达显著降低了成本、尺寸、重量和功率,有可能使现有的和新兴的机器人应用程序大范围受益。但目前LIDAR-SLAM存在如下挑战。LIDAR每秒产生数十万的点甚至更多,在有限的机载计算资源上,需要LiDAR里程计方法具有较高的计算效率。特征提取模块的性能很容易受到环境的影响。点云在运动过程中会产生显着的运动失真,影响里程计和绘图的性能。

HUASHUDEYANJING的博客 7146

SALM文献之-FAST-LIO2: Fast Direct LiDAR-Inertial Odometry(1)

是一种**直接(non-feature)且紧耦合的 LiDAR–IMU 里程计(LIO)**方法,目标是在保持高精度同时极大提升计算效率,适用于旋转快、场景复杂、以及固态小视场(small-FoV)LiDAR 的实时导航。ikd-Tree。

qq_36812406的博客 1651

论文笔记 《FAST-LIO2: Fast Direct LiDAR-inertial Odometry》及 激光SLAM综述

同Fast-LIO,采用IKF。直接将原始点注册到地图(并随后更新地图),而不提取特征。(问题: 直接映射需要位姿估计,但不提特征位姿哪里来?)采用ikd_Tree的数据结构,支持数据的增量式更新(增删)计算效率高(例如,在大型室外环境中高达100 Hz的轨迹估计和建图)鲁棒(例如,在转速高达 1000deg/s 的嘈杂室内环境中依旧能可靠估计姿态)多用途(例如,适用于多线旋转和固态激光雷达、UAV(无人机)和手持平台,以及基于 Intel 和 ARM 的处理器)

~勿据散客~的博客 1215

FAST-LIO2详细解析

FAST-LIO2是一种高效、稳健的雷达惯性里程计算法,它通过紧耦合误差状态卡尔曼滤波器实现IMU和激光雷达融合的状态估计。FAST-LIO2的代码结构清晰,包含预处理、IMU处理、特征提取与匹配、卡尔曼滤波和地图更新等关键组件。通过对代码的详细解析,可以深入理解FAST-LIO2的工作原理和实现细节,为进一步优化和扩展提供基础。

weixin_41150257的博客 5262

SLAM文献之-FAST-LIVO: Fast and Tightly-coupled Sparse-Direct LiDAR-Inertial-Visual Odometry

FAST-LIVO 将 LiDAR、IMU 和摄像头数据紧密融合,构建了一个统一的稀疏直接里程计框架。:直接将原始 LiDAR 点云与增量构建的点云地图对齐,无需提取特征点。:将附加了图像补丁的地图点用于直接最小化光度误差,避免了传统的特征提取步骤。此外,FAST-LIVO 引入了一种新的异常点剔除方法,去除位于边缘或图像中被遮挡的地图点,从而提高 VIO 的鲁棒性和准确性。

qq_36812406的博客 1466

FAST-LIVO2: Fast, Direct LiDAR-Inertial-Visual Odometry 香港大学fast-livo2论文解析

本文提出fast - livo2:一种快速、直接的激光雷达-惯性-视觉里程计框架,实现准确同时定位和鲁棒状态估计测绘(SLAM)任务,并在实时机载机器人应用中提供了巨大的潜力。FAST-LIVO2融合IMU,激光雷达和图像测量,有效地通过一个错误状态迭代卡尔曼滤波(ESIKF)提出了新的方法跟框架。

m0_52115153的博客 1万+

国产麒麟系统下Kettle安装避坑指南:解决aarch64架构不支持问题

本文详细解析了在国产麒麟系统上部署Kettle时遇到的aarch64架构不支持问题,提供了从获取适配的SWT库、修改启动脚本到生产环境调优的完整解决方案。文章重点解决了ARM架构与Java GUI工具的兼容性挑战,并分享了内存配置、字体显示及Carte服务部署等实战经验,助力用户在国产化环境中稳定运行ETL流程。

weixin_29197835的博客 561

EMC案例:解决千兆网口RTL8211F EMI问题

摘要:本文分析了Amlogic S812平台OEM项目中RTL8211F-CG千兆网卡EMI辐射超标问题。发现百兆测试时25MHz时钟有3dB余量,但千兆125MHz时钟导致超标。问题根源包括:未关闭PHY芯片悬空CLKOUT引脚、TX/RXCLK端RC位置错误、包地不完整及参考地缺失。解决方案涉及软件关闭无用时钟、优化RC布局、加强包地与打孔、调整共模电感位置,并在HDMI 3.3V加磁珠。关键结论指出千兆网125MHz时钟需严格包地打孔,且RC取值需平衡EMI与通信性能。

电子绿洲的博客 1279

SLAM文献之-FAST-LIO2: Fast Direct LiDAR-inertial Odometry(2)

值得注意的是,LILI-OM 在 utbm 9、nclt 4、nclt 6、nclt 8 和 nclt 10 中漂移非常大,其原因在于滑动窗口后端融合(mapping)失败,当地图点数量增多时,位姿估计完全依赖前端里程计,导致漂移快速累积。另一方面,LILI-OM、LIO-SAM 和 LINS 都有独立的里程计(含特征提取及粗位姿估计)与建图(如 LILI-OM 的后端融合 [17]、LIO-SAM 的增量平滑与建图 [30]、LINS 的地图优化 [31]),各自激光帧平均处理时间分别记作。

qq_36812406的博客 1636

TTL转RS422(B)工业级转换模块设计:从原理到实战部署

在工业自动化与嵌入式系统中,串行通信是实现设备间数据交换的基础。其核心原理在于通过特定的电气标准与协议,将数据位序列化后进行传输。RS422作为一种差分平衡传输协议,相比常见的TTL电平,在抗共模干扰与远距离传输能力上具有显著的技术优势,这使其成为工业现场总线、楼宇自动化等对可靠性要求严苛场景的优选方案。要实现TTL设备与RS422网络的稳定互联,关键在于设计一个能够完成单端信号到差分信号高质量转换的硬件模块。这涉及到差分总线收发器芯片的选型、包含终端电阻与TVS二极管的保护电路设计,以及遵循差分走线规则的

weixin_29195615的博客 342

论文Review FAST-LIVO2: Fast, Direct LiDAR–Inertial–Visual Odometry

来源:IEEE TRANSACTIONS ON ROBOTICS, VOL. 41, 2025学校:University of Hong Kong摘要:本文介绍了 FAST-LIVO2,这是一种快速直接的 LiDAR 惯性视觉里程计框架,旨在在 SLAM 任务中进行准确和稳健的状态估计,从而实现实时机器人应用。FAST-LIVO2 通过高效的误差状态迭代卡尔曼滤波器 (ESIKF) 集成 IMU、LiDAR 和图像数据。为了解决 LiDAR 和图像测量之间的尺寸不匹配问题,我们采用了顺序更新策略。

weixin_42148238的博客 3473

从翼型到湍流:用生活化案例图解空气动力学核心概念(中英双语版)

本文通过飞机机翼、F1赛车、高尔夫球等生活化案例,图解空气动力学核心概念。深入浅出地解释了攻角如何产生升力、边界层与流动分离如何影响阻力、马赫数如何划分速度世界,以及涡流与湍流的特性与应用。文章还介绍了计算流体动力学(CFD)这一现代数字风洞工具,帮助读者直观理解这些塑造现代交通与运动设计的无形之力。

metaverse5vr的博客 475

docker部署zabbix6.2.7+grafana

docker部署zabbix6.2.7+grafana。

qq_48391148的博客 3656

lio汇总

强度。

z15f34的博客 491

C#项目实战——【实例】企业人事管理系统(二):4、数据库与数据表设计;5、创建项目;

(1)展开新建的db_PWMS数据库节点,选中“表”节点,单击鼠标右键,在弹出的快捷菜单中选择“新建表”命令,如下图:(2)在SQL Server 2008管理器的右边显示一个新表,这里输入要创建的表中所需要的字段,并设置主键,如下图:(3)单击“保存”按钮,弹出“选择名称”对话框,如下图,输入要新建的表名“tb_Login”,单击“确定”按钮,即可在数据库中添加一个表。

做有价值的事,积累有价值的笔记! 1621

FAST-LIVO终极指南:构建高精度LiDAR-视觉惯性里程计系统

FAST-LIVO是一款快速且紧密耦合的稀疏直接LiDAR-视觉惯性里程计系统,它结合了VIO和LIO两个子系统,通过直接光度误差最小化实现高精度定位,无需提取视觉特征点。该系统由香港大学MARS实验室开发,已在IROS2022发表相关论文,为机器人导航提供了高效解决方案。 ## 核心功能解析:为什么选择FAST-LIVO? 🚀 FAST-LIVO的核心优势在于其**紧耦合架构**和**稀疏

gitblog_01156的博客 690

分数间隔均衡器的基本原理及应用(使用Matlab)

通过对接收信号进行加权求和,分数间隔均衡器可以抵消信号在传输过程中受到的频率响应失真。Matlab提供了丰富的工具和函数,可以方便地实现分数间隔均衡器,并进行性能评估。分数间隔均衡器(Fractional Interval Equalizer)是一种数字信号处理技术,用于均衡带通信道中的信号失真。分数间隔均衡器的基本原理是通过对接收信号进行加权求和,以抵消信号在传输过程中受到的频率响应失真。分数间隔均衡器在通信系统中具有广泛的应用。最后,我们通过比较均衡后的信号和发送数据的阈值来进行解调,并计算误码率。

2301_79325657的博客 683

PMP–一、二、三模–分类–13.干系人管理

A:确认是否已制定沟通管理计划,使业务干系人认识到项目的成功之处。B:让业务干系人参加冲刺回顾会议。C:与发起人和关键干系人一起确定产品待办事项列表中的优先要务,以便交付商业利益。D:为关键干系人开展收尾调研。C。

stqer的博客 1418

FAST-LIO2: 快速且直接的激光雷达与惯导里程计(arXiv 2021)

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达作者丨泡泡机器人来源丨泡泡机器人SLAM标题:FAST-LIO2: Fast Direct LiDAR-inertial Odometry作者:Wei Xu, Yixi Cai, Dongjiao He, Jiarong Lin, Fu Zhang机构:香港大学张富团队来源:arXiv 2021编译:介来拉石审核: ...

3D视觉工坊 2750

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

2021 年开源 SLAM 算法集锦

文章汇总2021年前后15项开源SLAM研究,覆盖单目稠密重建、激光雷达定位、激光惯性里程计、GNSS视觉惯导融合、语义及结构化建图、大规模BA等方向。代表项目包括TANDEM、MonoRec、FAST-LIO2、R3LIVE、GVINS和LVI-SAM,并列出团队、方法、论文与源码。整体反映SLAM正由单一视觉或激光方案转向多传感器紧耦合、动态环境适应、实时稠密建图和GPU加速,应用面向自动驾驶、机器人及智能轮椅。

人无远虑,必有近忧 2200

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FAST-LIVO2深度解析:构建高性能激光-惯性-视觉融合SLAM系统

FAST-LIVO2是一款基于紧耦合扩展状态迭代卡尔曼滤波(ESIKF)的快速直接激光雷达-惯性-视觉里程计系统,专为资源受限平台上的实时3D重建和机器人定位而设计。该系统通过创新的体素地图架构和稀疏直接光度误差优化,在恶劣环境下仍能保持卓越的定位精度和鲁棒性。 ## 快速导航 - [系统架构核心](#系统架构核心):探索FAST-LIVO2的多传感器融合框架 - [传感器配置优化](#传感器配

gitblog_00729的博客 684

【FAST-LIO2 源码解读】从 Mid-360 到 ESEKF — 公式与代码逐行对照

本文从 Mid-360 硬件特性出发,深入 FAST-LIO2 源码,逐行对照 IMU 预测、反向传播去畸变、ikd-tree、Point-to-Plane、雅可比推导到 iEKF 迭代更新的完整紧耦合定位链路。

m0_73800387的博客 858

如何高效使用FAST-LIVO2:从零开始的多传感器融合SLAM实战指南

FAST-LIVO2是一个高效且精确的LiDAR-惯性-视觉融合定位与建图系统,专为在恶劣环境下实现实时三维重建和机器人自主定位而设计。本文将带你从环境配置到实战部署,全面掌握这个强大的多传感器融合框架。 ## 为什么选择FAST-LIVO2进行SLAM开发? 在机器人感知领域,单一传感器往往难以应对复杂多变的实际场景。FAST-LIVO2通过深度融合LiDAR、IMU和相机数据,实现了在光照

gitblog_00580的博客 723
上一篇: 《LeGO-LOAM: Lightweight and Ground-OptimizedLidar Odometry and Mapping on Variable Terrain》论文精读
下一篇: 《Visual-lidar Odometry and Mapping: Low-drift, Robust, and Fast》论文阅读
avenger_fang
博客等级 码龄8年 6451粉丝 39原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值