0
votes

Good day to all,

I've been building a point cloud perception pipeline for my robot in simulation using Point Cloud Library (PCL) and specifically the Iterative Closest Point (ICP) module. I'm having difficulty getting the correct transformation matrix from PCL ICP. I initially thought it was something with my particular point clouds or my code, but the same happens using the tutorial code and point cloud.

For a minimum working example, I copied the Interactive ICP code, compiled and used the monkey.ply file and it works as expected. However, when I change only the translational component of the transformation from the initial value in the tutorial of t = < 0.0, 0.0, 0.4 > to t = < 1.0, 1.0, 0.0 >, the ICP output transformation matrix is off by at least 0.2 in each axis including the untranslated Z axis.

Is there something I'm missing when it comes to the initial translation between the clouds? Is there a minimum translation between clouds for ICP to work?

See the output below using the monkey.ply file, I shortened the output so its more readable:

CODE COPIED FROM interactive_icp.cpp

Applying this rigid transformation to: cloud_in -> cloud_icp
Rotation matrix :
     |  0.924 -0.383  0.000 | 
R =  |  0.383  0.924  0.000 | 
     |  0.000  0.000  1.000 | 
Translation vector :
t = <  0.000,  0.000,  0.400 >

Applied 1 ICP iteration(s) in 11 ms

ICP has converged, score is 0.0256485
ICP has converged, score is +2e-02
~
~
ICP has converged, score is +8e-06-> cloud_in
ICP has converged, score is +3e-12-> cloud_in
ICP transformation 14 : cloud_icp -> cloud_in
ICP transformation 15 : cloud_icp -> cloud_in
Rotation matrix :81 -0.036 |
     |  0.924  0.381 -0.036 |
R =  | -0.381  0.924  0.012 |
     |  0.037  0.003  0.999 |
Translation vector :, -0.402
t = <  0.016, -0.006, -0.402 >

CHANGED TRANSLATION FROM t = < 0.0, 0.0, 0.4 > to t = < 1.0, 1.0, 0.0 >

Rotation matrix :
     |  0.924 -0.383  0.000 | 
R =  |  0.383  0.924  0.000 | 
     |  0.000  0.000  1.000 | 
Translation vector :
t = <  1.000,  1.000,  0.000 >

Applied 1 ICP iteration(s) in 11 ms

ICP has converged, score is 0.157621
ICP has converged, score is +2e-01
~
~
ICP has converged, score is +8e-09-> cloud_in
ICP has converged, score is +5e-12-> cloud_in
ICP transformation 24 : cloud_icp -> cloud_in
ICP transformation 25 : cloud_icp -> cloud_in
Rotation matrix :75 -0.025 |
     |  0.927  0.375 -0.025 |
R =  | -0.375  0.927  0.029 |
     |  0.034 -0.017  0.999 |
Translation vector :,  0.265
t = < -1.391, -0.471,  0.265 >

Any help at all would be appreciated!

Mahalo,

Chris Rowe

1

1 Answers

1
votes

If you're new to ICP and point cloud registration, I recommend you to read the first chapter of the siggraph tutorial Modern Techniques and Applications for Real-Time Non-rigid Registration. It's very short but contains good information.

Back to your question.

Is there something I'm missing when it comes to the initial translation between the clouds?

Yes, ICP needs a good initial transformation to start with. And by transformation I mean both translation and rotation.

The fundamental assumption made by ICP (Iterative Closest Point) algorithm is:
The surfaces (or point clouds) are in rough initial alignment. Therefore closest point correspondences approximate ground truth correspondences.

Is there a minimum translation between clouds for ICP to work?

I suppose there isn't a straight answer. The closer, the better.

AFAIK it also depends on the data association method. (There are many variants to the original ICP. As described in the paper Efficient Variants of the ICP Algorithm ).

ICP is usually used as a last step in point cloud registration. To obtain a good initial transformation, you can use some feature based registration method such as this.