icp和ndt点云配准效率对比

本文通过实验证明了ICP在点云粗精配准中的快速但鲁棒性不足,而NDT在稳定性上表现更好但速度较慢。重点讨论了两者在不同场景下的优缺点,并提供了参数调整建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接调用pcl库的icp和ndt算法,对比帧间匹配的效果: (数据帧采用kitti数据集,64线束velo,随便截取了一帧保存为pcd文件,需要pcd文件的,自取git@github.com:qqngwzlb/pcl_registration.git)

粗配准: 在两幅点云之间的变换完全未知的情况下进行配准,主要是为精配准提供较好的变换初值;

精配准: 给定一个初始变换,进一步优化得到更精确的变换。

实验1:目标点云和源点云完全相同

fd55ec9645cd4a31940c6d0dc75fbf45.png

点云效果: 左边ndt,右边icp

5aa998e0fc39483a8a73487e95ea892f.png

同帧匹配,icp精度高,而且快

 

实验2:源点云是在目标点云的基础上单方向移动0.5m

57ce213810184a4485243cbecc905796.png

点云效果:

f3d8531ea80147818b1aeba2ea8374c3.png

明显icp匹配的点云(右)已经配准不上了

icp:我就是快,准不准我不管!!!!

缩小icp的esp之后(0.05-->0.001),匹配效果好些:

7d37a8b0a0ab4e738f61e9d8468cfb17.png

实验3:源点云是在目标点云的基础上xy方向移动(0.5m ,0.5m)f34fb8962b87482184eec81309739813.png

实验4:源点云是在目标点云的基础上xy方向移动(0.5m ,0.3m),旋转

c746704eb5324665a899686111da8480.png

总结: (偶滴pc很拉胯的,所以时间对比相当明显),测试代码我放在github了。

icp速度很快,点云不是单方向变化(有旋转),匹配效果很拉胯,但它依旧很快,很快,很快(😁😁)。目前我觉得,单纯的icp适合拿来做做SLAM的回环匹配,因为他快啊!!!而且,回环集中在直线上效果也不会那么差。

icp匹配就是算对应点间的最小二乘误差,误差最小化输出最优的变换矩阵。icp算法鲁棒性不够,建议实际,还是使用icp变种算法: 如通常2D激光匹配用PL-ICP算法比较好,3D激光匹配推荐GICP算法等。

ndt较于icp会慢不少,目标点云如果庞大,运算效率更大大下降,稳定性方面是不错的。需要做点云稀疏化。

ndt匹配时,算法内部将目标点云化为很多个cell,计算每个方格的pdf,移动源点云落入每个cell,用之前的pdf计算概率,所有cell概率之和最大时,输出最优的变换矩阵。

参数调节:

1)icp的setMaxCorrespondenceDistance:点对之间的最大距离,只有对应点之间的距离小于该设置值的对应点才作为ICP计算的点对;越大计算的点对越多;icp收敛条件esp一定要设置苛刻一些,比1小于3个数量级;

2)ndt大数据量,匹配速度极其慢(比icp慢十几倍),对目标点云滤波轻一点,对源点云滤波重一点;若目标点云滤波太重,ndt算法无法进行匹配,但是目标点云滤波重一点,对速度提升显著;ndt的setResolution,网格设置大小很重要,体素设置完,设置setTransformationEpsilon,差异值设置越大,速度越快(精度down);

 

另外: 本次测试没有给初值,帧间匹配若是有良好的初值,匹配效果和效率应该是很好的!提供预测的目前一般是imu或者利用系统运动模型估计,后续应该涉及这方面。

 

 

### NDT 点云的实现方法 NDT(Normal Distributions Transform)是一种用于点云的有效算法,其核心思想是通过将点云转换为正态分布的概率密度函数来计算两个点云之间的相似性。以下是关于该算法的具体说明及其代码实现。 #### 1. **NDT 的基本概念** NDT 将目标点云划分为多个空间单元格(voxel),并假设每个单元格内的点服从高斯分布。源点云则通过对这些高斯分布进行采样来进行匹[^1]。这种方法相较于 ICP 更加鲁棒,尤其是在点云稀疏或者存在噪声的情况下表现更好。 #### 2. **NDT 的目标函数** NDT 的目标是最小化源点云目标点云之间概率分布的距离。具体而言,目标函数定义如下: \[ E(T) = \sum_{i=1}^{N_s} w_i \log p(x'_i | T, C) \] 其中 \(w_i\) 是权重因子,\(p(x'_i | T, C)\) 表示在当前变换矩阵 \(T\) 下,源点 \(x'_i\) 落入某个高斯分布中的概率[^3]。 为了简化目标函数,可以通过泰勒展开近似求解最优变换矩阵 \(T\)。 --- #### 3. **NDT 的基本步骤** - **Step 1**: 划分网格 将目标点云划分成固定大小的空间单元格,并估计每个单元格内点集的均值协方差矩阵。 - **Step 2**: 计算概率密度函数 (PDF) 基于每个单元格的统计特性构建 PDF 函数。 - **Step 3**: 变换与评估 使用初始猜测的刚体变换矩阵 \(T_0\) 对齐源点云到目标点云坐标系下,并计算误差项。 - **Step 4**: 更新变换矩阵 应用梯度下降或其他数值优化技术更新变换矩阵直到收敛。 --- #### 4. **NDT 在 PCL 中的实现** Point Cloud Library (PCL) 提供了一个高效的 NDT 实现方式。下面是一个简单的 MATLAB Python 示例代码展示如何使用 NDT 完成点云。 ##### (1)MATLAB 示例代码 ```matlab % 加载点云数据 sourceCloud = pcread('bunny_source.ply'); targetCloud = pcread('bunny_target.ply'); % 创建 NDT 对象 ndt = pcfitndt(sourceCloud, targetCloud); % 设置参数 gridSize = 1; maxIterations = 50; minChangeRatio = 1e-4; set(ndt,'GridSize', gridSize); set(ndt,'MaxIterationCount', maxIterations); set(ndt,'MinChangeRatio', minChangeRatio); % 执行 [tform, registeredCloud] = pctransform(targetCloud, ndt); % 显示结果 figure; pcshowpair(sourceCloud, registeredCloud); title('NDT Registration Result'); ``` ##### (2)Python 示例代码 ```python import open3d as o3d from pyntcloud import PyntCloud import numpy as np # 加载点云文件 source_cloud = o3d.io.read_point_cloud("bunny_source.pcd") target_cloud = o3d.io.read_point_cloud("bunny_target.pcd") # 初始化 NDT 并设置参数 trans_init = np.eye(4) # 单位初始化变换矩阵 threshold = 0.02 # 对应点间的最大距离阈值 evaluation_result = o3d.registration.evaluate_registration( source_cloud, target_cloud, threshold, trans_init) print(f"Initial alignment:\n{evaluation_result}") # 开始 NDT 注册 reg_ndt = o3d.registration.registration_normal_distributed_transformation( source_cloud, target_cloud, threshold, trans_init, o3d.registration.TransformationEstimationPointToPlane()) print(f"Transformation matrix is:\n{reg_ndt.transformation}") o3d.visualization.draw_geometries([source_cloud.transform(reg_ndt.transformation), target_cloud]) ``` 上述代码展示了如何利用 Open3D 或者 MATLAB 来完成 NDT 点云的过程。注意,在实际应用中可能需要调整 `grid_size`、`max_iterations` 等超参数以适应不同的场景需求[^4]。 --- #### 5. **Colored-NDT 的扩展** 除了传统的 NDT 方法外,还有一种改进版本称为 Colored-NDT,它能够充分利用 RGB-D 数据的颜色信息提高精度。相比于原始算法仅依赖几何特征,Colored-NDT 引入了颜色维度作为额外约束条件[^2]。 例如,对于每一点 \(x\),其对应的三维向量由位置矢量加上色彩通道组成: \[ y = [x_r, x_g, x_b]^T \] 这使得即使是在缺乏显著几何结构的地方也能有效工作。 --- ###
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值