2012-12-30 110 views
0

设置

我有PointXYZ类型的PCL点云。我需要将其转换为vector<vector<bool> >类型的网格地图,其中map[x][y]应该是true,如果至少有一个点它。地图应代表点云的特定区域(比如20×细胞覆盖的点云维度x = [ - 10,10],Y = [ - 15,15]转换PCL XYZ云到XY(3D到2D)

我现在有什么

目前我有两个途径:

  1. 扫描通过所有点,在地图的相应单元格设置为true
  2. 项目点,以平面,创建一个KD树,然后在每个单元格。该地图查询树的最近点,并将单元格设置为真,如果它落入单元格中。

现在,第一种方法适用于小点云:O(n),其中n是点云中的点数。

第二种方法对大型云有好处,我认为。最后的查询只有O(m),其中m是地图的大小。但是,构建Kd树并将云投影到飞机上应该都是O(n)左右。

我在想第二种方法总是更糟糕,但我会运行测试看看。

问题

有没有更好的方法?也许是八叉树或Voxel-Grid(二维)的东西?方法一的问题是,我不必要地查看感兴趣区域之外的点。

在我看来,我不能成为第一个有这个问题的人吧?

回答

1

如果点云已经“有组织”(例如,如果它是直接来自RGBD传感器的话会发生),您可以巧妙地遍历2D阵列,以最好的情况击败O(N)。有关组织点云的信息,请参阅http://pointclouds.org/documentation/tutorials/basic_structures.php

如果点云没有组织起来,点云中除了点本身之外没有关于空间组织的信息,因此您几乎在每种情况下都必须触摸每个点其中之一。如果地图足够小,则可以在地图完整时退出,但这不太可能发生。

如果您对概率结果满意,那么您可以通过随机抽取点云来构建地图。