2012-12-30 108 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

如果點雲沒有組織起來,點雲中除了點本身之外沒有關於空間組織的信息,因此您幾乎在每種情況下都必須觸摸每個點其中之一。如果地圖足夠小,則可以在地圖完整時退出,但這不太可能發生。

如果您對概率結果滿意,那麼您可以通過隨機抽取點雲來構建地圖。