0

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

IterativeClosestPoint从 pcl 库中使用时,当我使用我的 pointCloud作为A源并使用 pointCloudB作为目标时,它可以工作。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* 作为目标。其中* 是x 轴上只有平移Cloud A的副本。Cloud A我做了同样的实验,Cloud B两者都能够成功地在 icp 中收敛。

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

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

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

4

1 回答 1

1

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

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

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

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

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

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

于 2020-03-14T12:04:04.147 回答