【学习记录】ICP类点云配准算法总结

2024-08-25 20:20

本文主要是介绍【学习记录】ICP类点云配准算法总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

〇、ICP

在点云配准或者激光SLAM领域,ICP类算法一直是一个比较经典的算法。研二时写的那篇综述也有过总结,对于激光SLAM而言,ICP类算法属于是scan-to-scan里面基于距离的一种配准算法。对于最纯粹的ICP算法,其基本思想就是用整帧点云,用一个初始的变换矩阵T进行投影,将当前帧点云投影到前一帧点云,之后利用kd-tree结构,利用距离这一指标筛选出一个最近点,计算投影点到所有最近点的距离和,通过调整变换矩阵T来实现距离和的最小化,进而得到最优化的变换矩阵T。

这种利用点云中每个点进行配准的方法,好处是充分利用了点云中的所有信息,所以按道理计算出来的变换矩阵会更加准确。但缺点也比较致命,所有点参与计算,即使是使用了kd-tree来加速最近点搜索,时间的开销也很大,其次投影的过程过分依赖于初始的变换矩阵,一旦初始值不好,很可能产生较为严重的偏离,最后,整个过程完全以距离作为唯一的筛选指标,这可能会导致根据距离筛选出的最近点,并不是实际的匹配点。正是因为ICP算法存在的这些不足,引出了后人对该算法的一系列改进,但是并没有改动ICP基本的思想。

一、PL-ICP

在ICP中,进行筛选的是投影点云中的一个点和前一帧点云中的另一个点,这种属于是点到点的匹配关系,硬要说的话这个匹配关系是很死板的,点到点的匹配是不存在移动的。为了让匹配过程更加灵活,PL-ICP将ICP中点到点的距离,更换为点到线的距离。在完成投影之后,投影点云中的点要选择前一帧点云两个最近点,之后再计算距离时,计算投影点到两个最近点组成的线的距离。
在这里插入图片描述
通过将点到点的距离改为点到线的距离,PL-ICP给予ICP算法一定的“滑动”空间,只要初始的变换矩阵偏差不是太离谱,最近点就算不是完全匹配,真正的匹配点也会在两个最近点的连线之上。

二、PP-ICP

既然有PL-ICP,那么理所应当也会有PP-ICP,其实这两个改进ICP改进的地方都是在点到点距离这个地方。PL-ICP将点到点换为点到线,PP-ICP则是将点到点换为点到切平面。依然是在完成投影之后,根据距离选择一个最近点,之后计算最近点所在的切平面,将投影点到切平面的距离和作为优化的对象。
在这里插入图片描述
其实PP-ICP和PL-ICP改进是类似的,都是切换了距离计算的方法,PP-ICP选用切平面,其实当PL-ICP中两个点距离足够近的时候,其连线也会趋近于切平面。

三、NICP

前面两类都是对距离计算进行了改进,除了这个改进点,也有一些变体从仅考虑几何距离这个不足下手。NICP采用的方法就是在筛选最近点的时候,将投影点和待选最近点之间的曲率、法向量纳入考虑。要求两个点不仅距离要足够近,其曲率、法向量等几何性质也要保持近似。这种筛选其实也是用局部的几何指标来弥补距离这个唯一指标的不足。类似的在一些语义ICP的改进中,也使用了这种策略,要求投影点和待选最近点之间的语义必须保持一致。
在这里插入图片描述NICP代表的,实际上是增加指标以优化传统ICP仅仅考虑距离这唯一指标的不足,与现在语义ICP的改进思路是类似的。

四、GICP

GICP全名应该叫广义ICP,它的改进实际上是将计算距离的过程,改为了最大后验。从他的文章来看,其主要是将ICP问题进行了概率化,调整后优化函数也不再是许多点对距离的和,而是一个概率值。利用概率模型,作者同时还将PP-ICP的内容也进行了概率化,提升了算法的鲁棒性。
在这里插入图片描述
从优化函数可以看出,GICP中将点满足的高斯分布纳入了其中,di里面是两个点距离的差异,而Ci里面则是两个点协方差的差异。

五、VGICP

VGICP则是在GICP的基础上又进行了改进,其中的V指的是体素化voxelization,从其论文来看,他主要是借鉴了NDT类算法将点云划分为体素的策略,既然GICP已经将ICP算法与概率相结合,那么也可以将NDT选多个点的思想结合进来。在VGICP中,投影点会根据距离选择多个点参与计算,利用这多个点计算协方差矩阵,代替GICP中一个点的协方差。
在这里插入图片描述
从公式的角度来看,GICP的公式应该为:
在这里插入图片描述
di也就是公式(2)(3)表示的实际上就是两个高斯分布的叠加,叠加后均值为0,协方差为两个原始协方差矩阵的叠加。之后再公式(5)中,我们也就得到了概率化后ICP的表示方法。这其中从公式(1)可以看出,有关di的定义是基于点对的,依然是一对一的关系。
在这里插入图片描述
而在VGICP中,di的定义被扩大到一对多,也就是公式(6)(11)写的那样,只要是距离小于阈值r的点,都会被纳入到di的计算过程,也就是说投影点ai会有多个点bj与之对应,但是整体依然保持公式(7)(8)(9)所示的高斯分布。

六、总结

其实所有的ICP类算法,本质上都是找匹配点然后最小化一个损失函数,其大体的区别可以总结为:

ICP:点对点最小化距离和
PL-ICP:点到线最小化距离和
PP-ICP:点到切平面最小化距离和
NICP:点到点距离+曲率+法向量
GICP:将ICP的距离和转换为概率问题
VGICP: 在GICP概率计算的基础上,将一对一变为一对多

参考链接:
ICP与kdtree:https://blog.csdn.net/weixin_43849505/article/details/121356403?spm=1001.2014.3001.5501
GICP:https://zhuanlan.zhihu.com/p/679429950
GICP:https://baijiahao.baidu.com/s?id=1780256734339605179&wfr=spider&for=pc
GICP:https://blog.csdn.net/u014509577/article/details/86912909
ICP及其变体:https://blog.csdn.net/zhaoliang38/article/details/127636206
NICP:https://blog.csdn.net/weixin_41469272/article/details/105522443

这篇关于【学习记录】ICP类点云配准算法总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106565

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自