先介紹一下演算法本身吧,PCL官方缺這方面的介紹
3D-NDT 演算法是把一個三維體素內的點雲數據集轉換成一個連續可微的概率分佈函數。首先把一個三維點雲數據集劃分成均勻規則的固定大小的三維單元格,然後對包含一定數量的每個三維體素單元,為了以概率密度形式對三維點雲進行分段連續可微描述,通過正態分佈表示體素單元中每個三維點位置測量樣本的概率分佈:
說實話我也是看不懂的(一開始還以為是法線變換來著)
廢話不多說,來看看真正要調的參數吧(PCL==調參)
pcl::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ> ndt; ndt.setTransformationEpsilon (0.01); ndt.setMaximumIterations (35); ndt.setStepSize (0.1); ndt.setResolution (1.0);
好了,以上四個參數,倆屁用沒有,最大迭代要不超了,要不沒搞到,最小精度同理
對配準精度有作用的只有stepSize和Resolution
resolution在追求精度的情況下最好與點密度相等或者低一個數量級
這裡是激光點雲,所以我設了1米
step的話可以先放大後變小,當然只是經驗公式
話說我還是不會三維找特徵點呢
跑出來的結果,綠色為目標點雲 藍色為原點雲 紅色為配準點雲
可以發現,配準的相當不錯(ICP要是沒有粗配矩陣跑這個簡直蛋疼)
照例上傳一點材料,把寫出來的程序和點雲傳上來
https://pan.baidu.com/s/1_ZaL_97wU_rKp3NzqL80jA
以上
歡迎轉載