參考:使用正態分佈變換(Normal Distributions Transform)進行點雲配準

所謂NDT匹配,就是通過2幀相鄰的點雲,用正態分佈最優化原理,把位姿變換的變換矩陣算出來。

這裡講解了PCL官網上的一個例子,使用NDT配準演算法將兩塊激光描數據點雲匹配到一起。

英文地址: Point Cloud Library (PCL)

具體做法是:

步驟1:安裝好pcl1.8.1,注意安裝的時候要帶有-DBUILD_visualization=ON,否則常式序無法編譯。

步驟2:按照官網上所說,把代碼複製下來,然後做一個CMakeLists.txt,編譯一下。

步驟3:把官網上的room_scan1.pcd room_scan2.pcd下載下來。

步驟4:運行代碼,匹配哪一步估計要跑2分鐘,結果會出現一個room_scan2_transformed.pcd。

解釋一下,代碼所做的事情就是,

讀room_scan1.pcd作為目標點雲。意思就是,這裡是一個點雲地圖。

讀room_scan2.pcd作為輸入點雲。意思就是,這裡是一個當前測量幀。

那麼,當前幀到地圖,肯定存在一個旋轉平移的變換。

代碼用ndt.align(),推測出這個變換矩陣。

再用這個變換矩陣,把room_scan2.pcd變換為room_scan2_transformed.pcd。

可以把這3個pcd文件,放到CloudeCompare中查看比對,也可以直接用pcl_viewer來查看。方法是:

pcl_viewer room_scan1.pcd room_scan2.pcd

關於代碼中幾個重要的參數的調參,可以參考 PCL入門-配準好用之NDT

ndt.setTransformationEpsilon (0.01); // 用處不大的參數。最小精度。一旦增量變化低於此閾值,對齊就會終止。

ndt.setMaximumIterations (35); // 用處不大的參數。最大迭代次數。

ndt.setStepSize (0.1); // 需要調。允許的最大步長。搜索演算法確定低於此最大值的最佳步長,在接近最佳解時縮小步長。調的經驗:step的話可以先放大後變小,當然只是經驗公式

ndt.setResolution (1.0); // 需要調。網格的體素解析度。它需要足夠大,每個體素至少包含6個點,但小到足以唯一地描述環境。調的經驗:resolution在追求精度的情況下最好與點密度相等或者低一個數量級,這裡是激光點雲,所以我設了1米


推薦閱讀:
相關文章