使用迭代最近点(ICP)时如何在点云库(PCL)中标记NULL数据

Nic*_*lai 3 c++ iteration 3d point-clouds point-cloud-library

我正在尝试使用集成在点云库(PCL)中的迭代最近点(ICP)算法来对齐2组点云.我得到一个错误报告,说它找不到足够的通信点.我已经放宽了参数的条件:setEuclideanFitnessEpsilon(-1.797e + 5),setMaximumIterations(40)和setRANSACIterations(2000)并且仍然有同样的问题..(我还没有找到关于这些条件值应该是哪个或如何应该有多少信息为了适当的对齐,所以在这方面的任何帮助也将非常感激)

我怀疑这个问题与我的云中有很多NULL数据点的事实有关,我的数据点标记为NULL(0).使用PCL时是否正确完成?PCL有任何NULL标准值吗?我显然不希望算法在尝试对齐数据集时考虑那些NULL点.

谢谢你的帮助

Kou*_*osh 6

如果您使用的是PCL,则无效数据的默认值不是NULL,而是NaN.因此,如果要将某个点标记为无效,则应首先包含<limits>文件,然后将位置设置为"std :: numeric_limits :: quiet_NaN()".通常这样做

const float bad_point = std::numeric_limits<float>::quiet_NaN();
if( is_invalid_point )
    p.x = p.y = p.z = bad_point;
Run Code Online (Sandbox Code Playgroud)

但无论如何,配置ICP可能会很痛苦.您可能需要根据数据进行更多参数调整.

  • 谢谢@Kourosh.它与pcl :: visualization :: CloudViewer一起使用,现在可视化时不显示NULL点.然而,对齐在kdtree模块中明显崩溃:断言失败:point_representation _-> isValid(point)&&"给予nearestKSearch的无效(NaN,Inf)点坐标!",file:C:\ BuildAgent\work\... .\ tags\pcl-1.6.0\kdtree\include\pcl/kdtreee/impl/kdtree_flann.hpp,第83行.任何想法为什么? (2认同)
  • 似乎Kd-Tree不希望你的pointclouds有无效点.尝试使用pcl :: removeNaNFromPointCloud过滤pointcloud,并将结果的pointcloud发送给ICP.告诉我它是否有效. (2认同)