我有两点云。为了匹配他们,我尝试向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 A
*作为目标的代码。其中Cloud A
*是Cloud A
的副本,在x轴上只有一个平移。我对Cloud B
做了相同的实验,并且都能够成功地在icp中收敛。
但是,一旦我将Cloud B
用作源并将Cloud A
用作目标,它仅在移动了一点点云(甚至错误的方向)之后就不再起作用,并且会收敛。我检查了收敛准则,发现它是CONVERGENCE_CRITERIA_REL_MSE
(当transfromationEpslion几乎为零时)。我尝试减少相对MSE
icp.getConvergeCriteria()->setRelativeMSE(1e-15)
,但没有成功。在收敛后检查relativeMSE的值时,我得到的是这样的内容:-124034642
对我来说毫无意义。
Update2 :我首先在没有ICP的情况下将云移动的距离非常近。这样做时,ICP可以正常工作。
更新3:我正在做FPFH,以便进行首次估算,然后进行ICP。这样做也可以。
答案 0 :(得分:1)
这个问题很旧,OP已经找到了解决方案,但是我只是在万一OP有人觉得有用的情况下进行解释。
首先,ICP的工作原理是迭代估算两朵云之间的对应关系,然后最小化它们之间的总距离。 ICP使用最接近点数据关联(因此称为“迭代最接近点”)来估计对应关系。
您可能已经知道,最接近的neigbor图是有向的。就是说,如果点A以B为最接近的邻居,则点B可能没有A为最接近的邻居,因为C比A更靠近B!
现在ICP使用最近点数据关联来估计两个云之间的对应关系, 将A指定为源将得到与指定B 不同的对应集。这就解释了您观察到的差异。
通常,两者之间的差异很小,因此在ICP之后您可能不会注意到。但是在您的情况下,我发现您提供的两个云太不同了(一个云很大而另一个云很小),并且关系变得太不对称。
如果要确保结果对称,则只需更改数据关联步骤(PCL可能提供这样做的选项),以使最接近的点对应关系来自两个云(这只是经典方法的一种变体) ICP。有关更多信息,请参见我的other answer)。