【学习记录】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通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和