Lidar SLAM

激光SLAM相关论文,在这里做个笔记。


DeepPointMap: Advancing LiDAR SLAM with Unified Neural Descriptors

[2312.02684] DeepPointMap: Advancing LiDAR SLAM with Unified Neural Descriptors (arxiv.org)

提出了DeepPointMap(DPM)框架,其中包括DPM编码器和DPM解码器两个神经网络。DPM编码器从点云中提取高度代表性和稀疏的神经描述符,实现了内存高效的地图表示和准确的多尺度定位任务。DPM解码器基于这些神经描述符进行多尺度匹配和注册。与其他神经描述符方法不同的是,DPM描述符可以统一地用于SLAM任务的多个子任务,具有出色的定位精度、内存效率、地图保真度和实时处理能力。

实际中,把该网络作为Lidar SLAM的一个模块,整体SLAM中使用Pose-Graph、建图、关键帧选取、回环等技术,网络部分可以理解为之前的Lidar点云的特征提取方法、帧间匹配方法、scan-to-scan方法和回环检测方法

损失函数

Pairing Loss(配对损失):使用InfoNCE损失函数作为配对损失函数,配对损失函数的目标是最大化正样本的相似性,同时最小化负样本的相似性。

Coarse Pairing Loss(粗配对损失):粗配对损失函数的定义与配对损失函数类似,但是将负样本分为两类:一类是距离大于阈值的负样本,另一类是中性样本,不参与损失的计算。这样做的目的是为了更好地处理那些接近但不是最接近的描述符对,因为这些对在不同的时间可能会作为正样本和负样本,从而引起歧义。

Offset Loss(偏移损失):使用Offset Loss训练Offset Head。根据前面定义的三种配对类型,使用正样本和中性样本来训练Offset Head,以预测描述符对之间的偏移量。偏移损失函数的目标是最小化预测偏移量与真实偏移量之间的差异。

Overlap Loss(重叠损失):使用交叉熵损失函数训练Overlap Head。重叠损失函数用于预测输入的描述符对是否重叠,即它们之间的距离是否小于阈值

Overall Loss(总损失):DeepPointMap的方向损失由总损失函数定义。总损失函数是配对损失、粗配对损失和偏移损失的加权和。通过调整权重参数、和,可以平衡不同损失函数的重要性。

结果

FF-LINS: A Consistent Frame-to-Frame Solid-State-LiDAR-Inertial State Estimator

武大最新的关于激光Lidar的使用论文,个人认为最重要的创新点为:
1. 将Lidar构建帧间约束参与图优化,帧间约束方式采用Key frame和点到平面的误差,而没有使用全局地图的方式,不需要维护全局地图;

2. 将Key frame和普通frame作为一组构建map,作为key frame的地图,从而得到稠密点云,便于建立约束。

关键帧的选取

根据时间、移动距离、角度选取Lidar关键帧。

关键帧的点云map构建:

关键帧和下个关键帧之前的所有非关键帧用来构建点云map,非关键帧使用INS推算的位姿将其中的lidar 点云投影投影到之前的关键帧中,进而形成稠密的点云地图Mi,在此基础上才能进行帧间约束。

该操作是基于短时间内INS的推算比较精确的假设。

帧间约束

点到平面距离的残差作为约束。

寻找投影点附近最近的5个点,计算5个点构成的平面的方程。

当5个点计算的dis都满足小于0.1m的条件,才能进行后续的处理。否则,认为该点未找到关联点。

构建误差模型如下:

文中还推导了Jacobi矩阵。

outlier剔除

为了减小outliers(lidar 点)的影响,先用Huber和函数减小outlier的影响。第一次优化后,在使用卡方检验剔除outlier factor。然后再进行第二次优化。

FF-LINS:帧间数据关联的固态LiDAR/惯性导航状态估计器

激光雷达SLAM方法汇总 | 自动驾驶和移动机器人领域 (qq.com)

DLL: Direct LIDAR Localization. A map-based localization approach for aerial robots

Fernando Caballero1 and Luis Merino 2021

代码: GitHub - robotics-upo/dll: DLL: Direct Lidar Localization

本文介绍了一种基于三维激光雷达的快速直接地图定位技术DLL,并将其应用于航空机器人,DLL基于点云地图的非线性优化实现点云到地图的配准,因此不需要特征,也不需要点之间的对应关系。该方法比蒙特卡罗定位方法表现得更好,与其他基于优化的方法相当的精度,运行速度快了一个数量级,该方法对里程计误差也具有鲁棒性。

MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square

Yue PanPengchuan XiaoYujie HeZhenlei ShaoZesong Li 2021

ETHZ最新开源!自动驾驶领域高效低漂移激光SLAM (qq.com)

GitHub - YuePanEdward/MULLS: MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square [ICRA '21]

主要贡献:

  • 只有Lidar的SLAM解决方案MULLS,漂移和实时性很好,在KITTI中排名10
  • MULLS-ICP:一种高效的点云注册算法,通过粗略几何特征点分类,叨叨点-点(平面/线)的优化

几何特征点提取:

  1. 双阈值粗略分类地面点和非地面点,对于地面点使用RANSAC优化,保留inliers作为最终地面点G;
  2. 非地面点降采样到固定数量,使用主成分分析(PCA)方法分析。使用K-R近邻聚合点云,特征值分解方差矩阵C,

根据σ1D/σ2D、σc将点云分成5类。

      3. Neighborhood category context encoding 将上述分好类的点云,用特征点和特征向量描述出来。

Multi-metric linear least square ICP

  1. 对不同类点云分别进行关联(近邻搜索),5小类又被拆分成了3大类:点、线、面
  2. 不同类型点云距离计算方法:
  3. 对每组关联点云单独设计权重
  4. 方差和信息矩阵计算

前端 使用前帧位姿作为scan2scan的初值进行迭代,得到的结果作为scan2map的初值。

后端 使用TEASER方法进行回环和近邻检测

FAST-LIO2:快速直接的激光雷达与惯导里程计 (qq.com)

声称比LIO要快,而且精度更高。

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

F-LOAM : Fast LiDAR Odometry and Mapping

代码:https://github.com/wh200720041/floam

modified from LOAM and A-LOAM .

通常将激光SLAM问题归纳为两种模式:scan-to-scan和scan-to-map,这两种模式都采用计算量极大的迭代方式计算。本文采用非迭代的两级失真补偿方法来降低计算成本。对于每个扫描输入,提取到的线特征和平面特征分别与局部线地图和局部平面地图进行匹配,同时使用迭代位姿优化进行局部平滑度处理。

 3D 机械激光雷达返回的点云在垂直方向上是稀疏的,在水平方向上是密集的。因此,水平特征更加鲜明,在水平面上出现错误特征检测的可能性较小。对于每帧点云,使用下式进行平滑度计算

式中,Sk(m,n)是pk(m,n)在水平方向上的最近点,|Sk(m,n)|是点云的数量,Sk(m,n)可以根据点云的ID数量进行统计,与局部搜索相比提高计算效率。选择σ较大的作为边缘点Ek,选择σ较小的作为平面点Sk。

本文算法具有较高的稳定性和精准性,在室内测试中实现了 2 厘米的平均定位精度,是 KITTI 数据集中最准确和最快的开源方法之一。

LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping

  • 文中提到,LIO-SAM可以实时,比LOAM/LIOM效果好,而且速度快。

  • 基于因子图优化提出了一个紧耦合的激光雷达惯性里程计框架,这种框架适合多传感器数据融合和全局优化,也提到了与GPS融合;

  • 提出了一种高效的滑窗策略和关键帧策略,提高了雷达点云注册的实时性能;

Image

雷达里程计的特征提取和特征匹配与LOAM中的一样, 不同的是本文提出一个关键帧选择策略,如果当前帧的状态于上一帧状态之间的变化超过10度,1m, 则把当前帧选为关键帧,其他帧的点云数据不会被添加到因子图中。

Review on 3D Lidar Localization for Autonomous Driving Cars

基于Lidar进行定位,将可用方法分为三类(点云配准,3D特征点匹配法和深度学习的方法)

3D 点云配准方法
在自动驾驶定位场景下,可以通过两种方法使用配准的方法:

(1)通过将获取的扫描帧点云与预构建的高精点云地图的一部分进行配准,对车辆进行定位。

(2)通过连续的Lidar扫描获取的点云计算出车辆的里程计信息。

ICP算法及各种变种算法

ICP算法最终被3D正态分布(NDT)算法所超越【14】【51】3DNDT算法其实是一种将2D NDT算法的扩展到三维空间的算法,与ICP算法类似的是源点云和目标点云质检的转换也需要进行迭代和优化,但是这种方法的优化的误差方程不在点对之间,而在根据预先计算的体素中存在的点的均值和协方差,NDT首先将点云转换为概率密度函数(PDF),然后将概率密度函数与高斯牛顿算法结合优化,找到两点云之间的空间变换

另外一种流行的处理方法是计算点云的surfel,文章【24】构建点云的surel贴图,构建的贴图和法线贴图可用于ICP算法来计算车辆的里程计,并通过surfel实现回环检测和轨迹优化。在文章[38]中,通过以下步骤将激光雷达扫描转换为线点云

 2. 基于3D特征的定位方法

论文【21】【22】利用自动驾驶车辆环境中存在的几何形状作为定位的要素,将平面提取算法与帧与帧之间的技术相结合以产生姿态的估计用于车辆的定位,与通过ICP算法获得的结果比较平面提取和对齐的方法在准确性和速度上都显示出了极大的提高。

目前KITTI里程计排行榜上排名第一的方法[25],首先根据点的平滑度和遮挡度提取平面和角点要素。这些特征与后续扫描中的点patch相匹配,然后使用Levenberg-Marquardt方法求解LIDAR运动。

 3. 基于3D点云深度学习的定位方法
为了简化深度学习的网络的输入不是直接对3D点云进行处理而是将LIDAR点云投影到2D空间上生成全景的深度图像,然后将其输入到卷积网络中,求解两个输入帧之间的旋转和平移,获得的结果低于标准。

有些深度学习方法不是直接使用LIDAR进行定位车辆的,而是尝试学习常见流程中的错误模型。换句话说,深度学习可用于校正已经可用的里程计计算,产生功能强大且灵活的插件模块。

结论: 尽管基于深度学习的方法展现出良好的结果,并且似乎代表了未来的研究方向,但是基于3D特征检测和匹配的方法由于在现实应用中具有一定的稳定性,仍被认为是最佳且有效的方案。

激光惯性里程计与建图(LIOM)方法1

目前主流激光SLAM方法: LOAM 和 Suma。

目前大多数激光SLAM方法都假设周围环境是静态的,给 高速公路场景下应用带来了很多挑战

  • 高速运动造成点云失真,影响建图和定位精度(>70km/h)
  • 缺乏几何特征。垂直方向几何特征;前后向约束(长廊场景)。
  • 高速场景下,激光扫描受动态物体影响
  • 回环区域少。

参考1中提出的 激光惯性里程计与建图(LIOM)方法 声称可以实现鲁棒姿态估计,和公路场景下建立静态地图。以下做简单记录。
提出了一种利用CNN分类网络和激光里程计框架的实时运动估计和建图方案。CNN分类网络可以消除激光测量中的动态物体,激光惯性框架可以克服高速环境下的剧烈运动,实现鲁棒的姿态估计。
在这里插入图片描述
NDT matching? 正态分布变换?
扫描预处理模块
结合IMU信息,去除每个激光点的运动畸变。
在这里插入图片描述
时间戳编号图示。起始点(Start point)表示一帧激光扫描的开始时刻tstart对应的激光点。结束点(End point)表示激光扫描结束时刻相对应的激光点,其相对于起始点的旋转角度为θend。当前点(Current point)表示在该帧扫描中时间相对应的激光点,其相对于起始点的旋转角度为θcurr。根据公式1,可以得到当前激光点对应的时间戳tcurr。

动态目标检测模块
采用全卷积神经网络(FCNN)对汽车、行人、自行车等运动目标进行精确检测和分类。这个过程可以分为四个连续的步骤:1. 通道特征提取 2. 基于CNN的障碍预测 3. 障碍聚类 4. 后处理。

  • 通道特征提取:在此过程中,将输入点云投影到二维X-Y平面上。根据点的X和Y坐标,将预设范围内的每个点量化为2D网格的一个单元。然后,计算每个单元的8个点的统计测量值并将其输入FCNN。
  • 基于CNN的障碍物预测:FCNN用于预测单元格内的障碍物属性,包括中心偏移、目标性、正向性、目标高度和类概率。
  • 障碍物聚类:利用以上五个单元对象属性生成障碍物。然后,采用压缩的联合查找算法来寻找候选的障碍物簇。
  • 后处理:障碍物聚类后,得到一组候选目标聚类。后处理进一步细化潜在候选簇,并通过预先设计的参数输出最终簇。

激光惯性里程计模块

[参考]

  1. https://mp.weixin.qq.com/s?__biz=MzI5MTM1MTQwMw==&mid=2247511058&idx=1&sn=a4cf18c5e4ed3da2b33ecd518047ab3c&chksm=ec131216db649b009444c82adc8bdbf88407241951107cf84c98b8dc5611bc8dbe9c59a596b4&mpshare=1&scene=1&srcid=&sharer_sharetime=1578269912607&sharer_shareid=7f59ace4592939657cb3c14ce18f6515#rd

LOAM-SLAM

https://zhuanlan.zhihu.com/p/111388877
论文:https://www.ri.cmu.edu/pub_files/2014/7/Ji_LidarMapping_RSS2014_v8.pdf
代码:https://github.com/HKUST-Aerial
架构图
核心: 特征提取(Lidar Registration)和里程计解算(Odometry and Mapping)
文中Lidar为扫描雷达.

Lidar Registration

为了减少计算的时间消耗,一般需要使用特征点来代替完整的数据帧。尝见的特征点提取方法:特征向量、直方图、旋转图片等。这些方法虽然能很精准的涵盖一帧数据的大部分信息,但是由于计算量大,很难在激光slam的相邻帧的匹配中使用。
本文作者根据点的曲率来计算平面光滑度作为提取当前帧的特征信息的指标。在这里插入图片描述
在得到平滑度这一指标后,可以将特征点划分为两大类:平面点和边缘点

  • 平面点:在三维空间中处于平滑平面上的点,其和周围点的大小差距不大,曲率较低,平滑度较低。
  • 边缘点:在三维空间中处于尖锐边缘上的点,其和周围点的大小差距较大,曲率较高,平滑度较高。

在论文中是对整个扫描进行化段,分四段,每段各取两个边缘点和4个平面点。
选点就有了三要素:

  • 不能超过设定的size,每个集合平面点4个,边缘点2个;
  • 已选取的点周围不能有点,使得点可以分布的更加均匀;
  • 选取的平面点不能与激光扫描束平行。

Lidar Odometry (scan to scan)

由于雷达自身在 k 和k+1时刻过程中是运动的,所以,我们将所有的点重投影到每一帧的初始时刻,这样在这一帧中的所有点都可以得到对应的姿态变换信息。在LOAM的计算中,平面和边缘线是两种不同的特征是分开计算的.
边缘点匹配 Ek – Ek+1
在k+1中选择点i,在k帧中选择最近点j和j相邻线中的最近点l,这样选择是为了不共线.利用平行四边形面积公式求解i到lj到距离,该距离作为约束公式.
在这里插入图片描述
平面点匹配 Hk – Hk+1, 使用三维物体的体积来计算最小距离,进行约束.
在这里插入图片描述
姿态解算就是最小化上述De和Dh
在这里插入图片描述
假设的自身运动是匀速运动,已知每个点的时间戳信息,并使用线性方程,得到每个时刻对应的姿态变换矩阵——运动补偿。
在这里插入图片描述
A-LOAM的代码相比于LOAM-Velodyne是使用了现有的优化求解库ceres.

Lidar Mapping (map to map)

优点:

  • 新颖的特征提取方式(边缘点和平面点)
  • 运动补偿(时间戳)
  • 融合了scan-to-scan(odometry)和map-to-map(mapping)的思想

缺点:

  • 没有后端优化(年代)
  • 不能处理大规模的旋转变换(旋转向量的求解)

LeGO-LOAM 2018

https://zhuanlan.zhihu.com/p/115986186
论文:https://ieeexplore.ieee.org/abstract/document/8594299
代码:LeGO-LOAM-BOR 和LeGO-LOAM NOTED

LeGO-LOAM相对于LOAM的提升主要在于轻量级和地面优化。
在这里插入图片描述
分割模块通过对一帧的点云重投影到图像中,进行地面分割,非地面点被分割出来;
特征提取模块基于分割后的点使用和LOAM一样的方法提取边缘点和平面点;
雷达里程计模块基于提取的特征点构建 [公式] 约束关系,使用两次LM优化,得到姿态变换矩阵;
雷达建图模块将得到的特征点进一步处理,构建 [公式] 的约束关系,构建全局地图。

Segmentation

将该点云投影到一个距离图像中,其分辨率为 1800*16。Lidar的水平分辨率0.2度,竖直方向为16跟线.
对距离图像进行列式评估,提取地面点。

Efficient LiDAR Odometry for Autonomous Driving

Xin Zheng, Jianke Zhu, arxiv 2021

球形距离影像(SRI)为快速邻域搜索提供了可能,然而在处理与激光束平行的地面点时不是那么高效,因此,本文提出了一种利用非地面点的SRI与地面点的鸟瞰图(BEV)来进行激光里程计的方法,利用新颖的距离自适应的方法来估计点的法向量进行激光匹配,另外,采用一种非常快速并且内存高效的地图更新方式来融合不同时间的点云以及对应的法向量。

Image

本文只采用帧与局部地图匹配的方式,而不是帧间的。

Image

没太看懂。

LiDAR-Based Initial Global Localization Using Two-Dimensional (2D) Submap Projection Image (SPI)

2021 激光雷达的初始化定位

本工作的主要贡献如下:

1、提出了基于二维子地图投影图像的激光雷达全局初始化定位方法,包括位置识别和姿态估计两个部分。

2、提出了基于NetVLAD的位置识别方法,从SPIs中提取全局描述子。

3、使用SuperPoint和SuperGlue进行精准特征匹配。

2.1 子地图投影图像(SPI)的生成

 首先输入一个三维点云地图,将水平面分割为直角坐标系,生成一个投影图像,每个像素都代表一个垂直点,将点的最大高度储存在垂直的点上面。一个点云地图内包含一系列的激光雷达扫描结果S1,S2…..Sn,选择中间的扫描点Sn/2作为定位点,将所有的扫描转换到Sn/2中,从而形成一致的子点云地图。在spi转换的过程中,只有Sn/2框架中的水平方形区域[-R, R]的点被保留下来,形成尺寸为L×L的区域。

应注意R的范围要略小于激光雷达最大扫描范围,这样一个spi就可以覆盖大部分的点,同时每个像素的最大值值在[hmin,hmax]之间,将每个像素归一化。hmin应该低于地面,这样地面的环形特征就不会被误认为spi特征,hmax应该高于激光雷达的扫描高度。

LiTAMIN: LiDAR-based Tracking And Mapping by Stabilized ICP for Geometry Approximation with Normal Distributions

IROS 2020

本文提出了一种3D激光雷达同时定位和映射(SLAM)方法,该方法提高了迭代最近点(ICP)算法的精度、鲁棒性和计算效率。算法采用了具有正态分布的局部近似几何体,与以往基于正态分布的ICP方法(如NDT和广义ICP)相比,本文的ICP方法通过 F 范数和正则化协方差矩阵对损失函数进行归一化操作来简单的实现了稳定性。以前的方法是用主成分分析来稳定的,其计算量比此方法要高。此外,本文SLAM方法可以减少不正确闭环的影响。实验结果表明,本文的SLAM方法比开源的SLAM算法(包括LOAM、LEGO-LOAM和hdl_graph_SLAM等)具有优势。

 作者实现了1 m的体素大小;因此,与关键帧对应的局部地图的大小为200 m×200 m×40 m。

LOL: Lidar-only Odometry and Localization in 3D point cloud maps

ICRA 2020 【泡泡图灵智库】LOL:基于激光雷达的里程计和3D点云定位_腾讯新闻 (qq.com)

本文使用了一种场景识别方法来检测在线实时地图与离线先验地图之间几何相似的位置,来纠正激光雷达里程计产生的累积漂移误差。本文提出的系统将一种最新的激光雷达里程计算法与最近提出的三维点云匹配算法相结合,融合两者的优点。同时做了额外的增强措施来减少实时点云与先验地图之间的错误匹配数量,并在检测到良好匹配时改进位置误差。

开源代码地址: https://github.com/RozDavid/LOL

其中蓝色部分来自 LOAM算法 ,橙色部分来自 SegMap 算法,绿色部分是本文作者的贡献,作者修改了原始的 SegMap 方法从而使重新定位合并到全局地图中。

Lidar点云预处理、特征提取

自动驾驶-激光雷达预处理/特征提取 (qq.com)

预处理方式:

  1. 指定区域获取点云。因为距离越远点云越稀疏,相对的信息量也越小;此外还能明显看到一些离群点。以下为保留 x 在 30m,y 在 15m,z 在 2m 范围内的点的效果

template <
class PointType>
void removePointsOutsideRegion(boost::shared_ptr<pcl::PointCloud<PointType>>& src_cloud_ptr,                               boost::shared_ptr<pcl::PointCloud<PointType>>& dst_cloud_ptr,                               const std::pair<double, double>& x_range,                               const std::pair<double, double>& y_range,                               const std::pair<double, double>& z_range) 
{    
    int num_points = src_cloud_ptr->points.size();    
    boost::shared_ptr<pcl::PointCloud<PointType>> 
    cloud_ptr(new pcl::PointCloud<PointType>());    
    cloud_ptr->points.reserve(num_points);        
    for (const auto& pt : src_cloud_ptr->points) 
    {        
        bool inside = (pt.x >= x_range.first && 
        pt.x <= x_range.second && 
        pt.y >= y_range.first &&                       
        pt.y <= y_range.second && 
        pt.z >= z_range.first && 
        pt.z <= z_range.second);        
        if (inside)
        {            
            cloud_ptr->points.push_back(pt);        
        }    
    }    
    dst_cloud_ptr = cloud_ptr;
} // 或者使用CropBox来实现去除给定区域外的点 
pcl::CropBox<pcl::PointXYZ> box_filter; 
box_filter.setInputCloud(cloud_ptr); 
box_filter.setMin(Eigen::Vector4f(keep_x_range.first, keep_y_range.first, keep_z_range.first, 1.0)); 
box_filter.setMax(Eigen::Vector4f(keep_x_range.second, keep_y_range.second, keep_z_range.second, 1.0)); 
box_filter.filter(*temp_cloud_ptr);
  1. 去除给定区域的点.比如在自动驾驶中激光扫描的区域有一部分来自搭载激光雷达的车子本身.
template <class PointType>void filterPointsWithinRegion(boost::shared_ptr<pcl::PointCloud<PointType>>& src_cloud_ptr,                              boost::shared_ptr<pcl::PointCloud<PointType>>& dst_cloud_ptr,                              const std::pair<double, double>& x_range,                              const std::pair<double, double>& y_range,                              const std::pair<double, double>& z_range,                              bool remove) {    int num_points = src_cloud_ptr->points.size();    boost::shared_ptr<pcl::PointCloud<PointType>> cloud_ptr(new pcl::PointCloud<PointType>());    cloud_ptr->points.reserve(num_points);    for (const auto& pt : src_cloud_ptr->points) {        bool inside = (pt.x >= x_range.first && pt.x <= x_range.second && pt.y >= y_range.first &&                       pt.y <= y_range.second && pt.z >= z_range.first && pt.z <= z_range.second);        if (inside ^ remove) 
{            cloud_ptr->points.push_back(pt);        }    }    
dst_cloud_ptr = cloud_ptr;}// PassThrough: 可以指定点云中的点的某个字段进行范围限制,将其设为 true 时可以进行给定只保留给定范围内的点的功能 pcl::PassThrough<pcl::PointXYZ> 
pass_filter; bool reverse_limits = true; 
pass_filter.setInputCloud(filtered_cloud_ptr); pass_filter.setFilterFieldName("x"); 
pass_filter.setFilterLimits(-5, 5); 
pass_filter.getFilterLimitsNegative(reverse_limits);  // reverse the limits 
pass_filter.filter(*filtered_cloud_ptr); pass_filter.setFilterFieldName("y"); 
pass_filter.setFilterLimits(-2, 2); 
pass_filter.getFilterLimitsNegative(reverse_limits);  // reverse the limits 
pass_filter.filter(*filtered_cloud_ptr); pass_filter.setFilterFieldName("z"); 
pass_filter.setFilterLimits(-2, 2); 
pass_filter.getFilterLimitsNegative(reverse_limits);  // reverse the limits 
pass_filter.filter(*filtered_cloud_ptr);
  1. 点云下采样
    1. 栅格化采样.通过计算每个点到中心的距离结合要求的分辨率计算栅格对应的坐标,并入其中,最后遍历每个包含点的栅格计算其中点的几何中心或者取该栅格中心加入目标点云即可。
    2. 点云所在区域密度规律滤波。该方法直接基于点云分布密度进行去噪,直观的感受是可以根据点云中每个点所在区域判断其是否是噪声,一般来说噪声点所在区域都比较稀疏。
    3. 点云所在区域分布规律滤波。除了根据稠密意以外还可以根据距离来筛选滤波,每个点计算其到周围若干点的平均距离,如果这个平均距离相对于整体点云中所有点的平均距离较近,则认为其不是噪点
    4. 根据点云是否可以被稳定观察到筛选。

      LOAM 中着重提了这两种情况的点是不稳定的:

      特征成平面和扫描线近乎平行。特征扫描到的其中一端被另一个平面挡住,这部分的点也不稳定。

特征提取

  1. 激光雷达时间序列
  2. 三维激光雷达压缩成二维
  3. 面特征提取
  4. 圆柱体提取
  5. 半径近邻
  6. 聚类
  7. 区域生长
  8. 线特征拟合
  9. 点特征提取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值