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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]