Ronald
Ronald

Reputation: 754

Configure Iterative Closest Point PCL

I am having trouble configuring ICP in PCL 1.6(I use Android) and I believe that is the cause of an incorrect transformation matrix. What I've tried so far is this; Downsample the point clouds I use in ICP with the following code:

    pcl::VoxelGrid <pcl::PointXYZ> grid; 

    grid.setLeafSize(6, 6, 6); 
    grid.setInputCloud(output); 
    grid.filter(*tgt); 

    grid.setInputCloud(cloud_src); 
    grid.filter(*src); 

Try to align the two point clouds with the following code :

pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp; 
icp.setInputCloud(tgt); 
icp.setInputTarget(src); 
pcl::PointCloud<pcl::PointXYZ> Final; 
pcl::PointCloud<pcl::PointXYZ> transformedCloud; 
icp.setMaxCorrespondenceDistance(0.08); 
icp.setMaximumIterations(500); 
//icp.setTransformationEpsilon (0.000000000000000000001); 
icp.setTransformationEpsilon(1e-12); 
icp.setEuclideanFitnessEpsilon(1e-12); 
icp.setRANSACIterations(2000); 
icp.setRANSACOutlierRejectionThreshold(0.6); 

I have tried all kinds of values in the options of ICP but with no success.

The code I use to create the point cloud:

        int density = 1; 
        for (int y = 0; y < depthFrame.getHeight(); y = y + density) { 
            for (int x = 0; x < depthFrame.getWidth(); x = x + density) { 
                short z = pDepthRow[y * depthVideoMode.getResolutionX() + x]; 
                if (z > 0 && z < depthStream.getMaxPixelValue()) { 
                        cloud_src->points[counter].x = x; 
                        cloud_src->points[counter].y = y; 
                        cloud_src->points[counter].z = z; 
                } 
            } 
        } 

Any chance somebody can help me out configuring ICP?

Upvotes: 0

Views: 1022

Answers (1)

Vtik
Vtik

Reputation: 3140

From what I know, PCL uses meters as a unit of measurement. so, is it intended that leaf size for downsampling is 6*6*6 !? I think it's huge !! Try with some lower values and if it didn't work either, try ICP with the most simple configuration as follows :

 pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp; 
 icp.setInputCloud(tgt); 
 icp.setInputTarget(src); 
 pcl::PointCloud<pcl::PointXYZ> Final; 
 icp.align(Final);

once, you got this working (and it should be), then start tuning the other parameters and it shouldn't be that hard to do.

Hope that helps, Cheers!

Upvotes: 0

Related Questions