我有两个点云。为了匹配它们,我尝试使用 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 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。这样做也可以。