所有人的祝福,
我一直在使用点云库(PCL),特别是迭代最近点(ICP)模块为我的机器人构建点云感知管道。我很难从PCL ICP获得正确的转换矩阵。最初,我认为这与我的特定点云或代码有关,但是使用教程代码和点云也是如此。
[作为最小的工作示例,我复制了Interactive ICP code,编译并使用了monkey.ply文件,该文件可以正常工作。但是,当我仅将转换的平移部分从教程中的初始值从[[t = <0.0,0.0,0.4>更改为t = <1.0,1.0,0.0>时,ICP在包括未平移的Z轴的每个轴上,输出变换矩阵的偏移量至少为0.2。
关于云之间的初始翻译,我是否缺少某些内容?云之间是否存在最小转换,才能使ICP正常工作?使用
monkey.ply文件查看下面的输出,我缩短了输出,使输出更易读:
从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 >
的转换翻译>从t = <0.0,0.0,0.4>到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 >
任何帮助都将不胜感激!Mahalo,
克里斯·罗维
返回您的问题。
关于云之间的初始翻译,我是否缺少某些内容?
是,
ICP需要良好的初始转换以] >>。而by transform是指平移和旋转。 ICP(迭代最近点)算法做出的基本假设是: 表面(或点云)处于粗略的初始对齐状态。因此,最接近点对应近似于地面真实对应。云之间是否存在最小转换,以使ICP能够正常工作?
我想没有一个直接的答案。越近越好。
AFAIK它也取决于数据关联方法。 (原始ICP有很多变体。如论文Efficient Variants of the ICP Algorithm中所述)。
ICP通常用作点云注册的最后一步。为了获得良好的初始转换,可以使用一些基于功能的注册方法,例如this。