Using ICP in PCL cannot be registered correctly even if a very good initial pose is set

105 views Asked by At

I want to estimate the pose of a workpiece, so I tried to use registration. The source point cloud was captured from the binocular structural light camera(the red one), and the target point cloud was sampled from the 3D drawing of the workpiece(the black one). I know ICP always fall into the locally optimal solution easily, so the initial transformation was set manually. The inital transformation

I only use VoxelGrid as the preprocessing, and the codes related to ICP are as follows

pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.setInputSource(cloud_camera);
icp.setInputTarget(cloud_workpiece);
icp.setTransformationEpsilon(1e-10);
icp.setMaxCorrespondenceDistance(100);
icp.setEuclideanFitnessEpsilon(0.001);
icp.setMaximumIterations(10000);
icp.setUseReciprocalCorrespondences(false);

icp.align(*cloud_icp);
G = icp.getFinalTransformation();

But the registration result is very disappointing. RESULT

I tried adjusting the parameters but it seems to be ineffective. But using cloud compare software, even if the initial pose is not very good, I can still get better registration results. I'm wondering what the problem is here. What is the difference between the implementation of ICP in PCL and CloudCompare, which would lead to such a big gap in results?

0

There are 0 answers