【学习记录】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

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1