【问题标题】:IterativeClosestPoint with pcl does not give expected results带有 pcl 的 IterativeClosestPoint 没有给出预期的结果
【发布时间】:2019-12-13 11:17:45
【问题描述】:

我有两个点云。为了匹配它们,我尝试使用 ICP 进行注册。点云不是超级相似,但我想至少让它们非常接近。

当使用 pcl 库中的 IterativeClosestPoint 时,当我使用我的 pointCloud A 作为源和 pointCloud B 作为目标时,此方法有效。但是当我使用B 作为源和A 作为目标时它不起作用。在后一种情况下,它甚至会增加我两朵云之间的距离。

有谁知道我做错了什么?为什么更改源/目标时性能会有差异?

这是我的代码:

pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;  
icp.setInputSource(A);
icp.setInputTarget(B);
icp.setMaximumIterations(50);
icp.setTransformationEpsilon(1e-8);
icp.setEuclideanFitnessEpsilon(1);
icp.setMaxCorrespondenceDistance(0.5); // 50cm
icp.setRANSACOutlierRejectionThreshold(0.03);
icp.align(aligned_model_cloud);

我很高兴有任何想法和意见。

编辑:这是两朵云 Cloud A Cloud B

更新: 我尝试使用Cloud A 作为源代码和Cloud A* 作为目标代码。其中Cloud A* 是Cloud A 的副本,只有x 轴上的平移。我用Cloud B做了同样的实验,两者都能够成功收敛于icp。

但是一旦我使用Cloud B 作为源和Cloud A 作为目标,它就不再起作用并且在移动云只一点点(即使是错误的方向)后收敛。我检查了收敛标准,发现它是CONVERGENCE_CRITERIA_REL_MSE(当transfromationEpslion 几乎为零时)。我尝试减少相对MSE icp.getConvergeCriteria()-&gt;setRelativeMSE(1e-15) 但这没有成功。在收敛后检查 relativeMSE 的值时,我得到如下信息:-124034642 这对我来说根本没有任何意义。

更新 2:我首先在没有 ICP 的情况下将云移得很近。当做这个 ICP 工作正常。

Update3:我正在做一个 FPFH 进行第一次估计,然后是 ICP。这样做也可以。

【问题讨论】:

  • 如果可能,添加两个云链接
  • 两朵云的密度相似吗?
  • @MarkLoyman 我不这么认为。其中一朵云来自 3d 对象文件。另一个来自 rgbd 传感器。
  • @progNewbie 我认为添加指向两个云的链接很重要。
  • @MarkLoyman 我添加了两个云 :)

标签: point-cloud-library image-registration


【解决方案1】:

这个问题很老,OP 已经找到了解决方案,但我会解释一下,以防 OP 和有人觉得它有用。

首先,ICP 通过迭代估计两个云之间的对应关系,然后最小化它们之间的总距离来工作。 ICP 使用最近点数据关联(因此称为迭代最近点)来估计对应关系。

您可能知道,最近邻图是有向图。也就是说,如果 A 点有 B 作为其最近邻,则 B 点可能没有 A 作为其最近邻,因为 C 比 A 更靠近 B!


现在 ICP 使用最近点数据关联来估计两个云之间的对应关系,指定 A 作为源将得到与指定 B 不同的对应关系集。这解释了您观察到的差异。

通常差异很小,在 ICP 之后您可能不会注意到。但在你的情况下,我发现你提供的两朵云太不同了(一个特别大,另一个小),关系变得太不对称。

如果您想确保结果是对称的,您只需更改数据关联步骤(PCL 可能会提供这样做的选项)以使最近点对应来自两个云(这只是经典的变体ICP。更多信息可以看我的other answer)。

【讨论】:

    猜你喜欢
    • 2014-04-13
    • 2020-05-29
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    相关资源
    最近更新 更多