PCL(Point Cloud Library),又叫做點云庫,是一個BSD授權方式,可以免費進行商業和學術應用的大型跨平臺開源C++編程庫,其最早是以斯坦福大學Radu博士為首進行維護與開發的開源項目,主要用于機器人領域。PCL涵蓋處理點云數據的多種通用算法和數據結構,其具體實現基于第三方庫Boost、Eigen、FLANN、VTK、CUDA、OpenNI和Qhull,能夠支持Windows、Linux、Mac OS、Android以及部分嵌入式實時系統等多種操作系統平臺。PCL包括點云獲取、分割、特征描述與提取、可視化、曲面重建、配準、濾波和輸入/輸出等功能模塊以及動作跟蹤識別等應用,并且在不斷更新的PCL版本中會加入新的算法與應用。截止至2022年,PCL已被廣泛應用在立體3D影像、激光遙感測繪學、虛擬現實/人機交互、機器人和逆向工程等領域。
PCL中各功能的實現依賴于多個第三方庫,分別為Boost庫、Eigen庫、FLANN庫、VTK庫、CUDA庫、OpenNI、Qhull。PCL的部分主要功能模塊如下:I/O,輸入/輸出模塊。該模塊能夠實現點云數據/文件的獲取、讀入與存儲等操作,通過封裝OpenNI兼容的設備原始數據獲取接口實現直接讀取點云相關信息;kd-tree,空間索引模塊。該模塊通過類與函數實現利用kd-tree數據結構建立點云的空間拓撲關系,實現基于FLANN第三方庫的快速最近鄰搜索;?octree,空間索引模塊。該模塊通過類與函數實現利用octree數據結構建立點云的空間拓撲關系,實現基于FLANN第三方庫的快速最近鄰搜索;?可視化,可視化模塊。該模塊包含了大量與可視化相關的數據結構與組件,依賴于第三方庫VTK,能夠對其他模塊的處理結果進行直觀的展示。
PCL自2011年正式推出以來,在各行業得到廣泛應用,隨著算法模塊的不斷優化與完善,截止至2022年PCL庫已經發布到1.9.1版本,并完全集成到ROS中。
內容
PCL的結構和內容
如圖PCL架構圖所示,對于3D點云處理來說,PCL完全是一個的模塊化的現代C++模板庫。其基于以下第三方庫:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,實現點云相關的獲取、濾波、分割、配準、檢索、特征提取、識別、追蹤、曲面重建、可視化等。
PCL利用OpenMP、GPU、CUDA等先進高性能計算技術,通過并行化提高程序實時性。K近鄰搜索操作的構架是基于FLANN (Fast Library for Approximate Nearest Neighbors)所實現的,速度也是目前技術中最快的。PCL中的所有模塊和算法都是通過Boost共享指針來傳送數據的,因而避免了多次復制系統中已存在的數據的需要,從0.6版本開始,PCL就已經被移入到Windows,Mac OS和Linux,并且在Android系統也已經開始投入使用,這使得PCL的應用容易移植與多方發布。
從算法的角度,PCL是指納入了多種操作點云數據的三維處理算法,其中包括:過濾,特征估計,表面重建,模型擬合和分割,定位搜索等。每一套算法都是通過基類進行劃分的,試圖把貫穿整個流水線處理技術的所有常見功能整合在一起,從而保持了整個算法實現過程中的緊湊和結構清晰,提高代碼的重用性、簡潔可讀。在PCL中一個處理管道的基本接口程序是:
創建處理對象:(例如過濾、特征估計、分割等);
使用setInputCloud通過輸入點云數據,處理模塊;
設置算法相關參數;
調用計算(或過濾、分割等)得到輸出。
為了進一步簡化和開發,PCL被分成一系列較小的代碼庫,使其模塊化,以便能夠單獨編譯使用提高可配置性,特別適用于嵌入式處理中:
libpcl filters:如采樣、去除離群點、特征提取、擬合估計等數據實現過濾器;
libpcl features:實現多種三維特征,如曲面法線、曲率、邊界點估計、矩不變量、主曲率,PFH和FPFH特征,旋轉圖像、積分圖像,NARF描述子,RIFT,相對標準差,數據強度的篩選等等;
libpcl I/O:實現數據的輸入和輸出操作,例如點云數據文件(PCD)的讀寫;
libpcl segmentation:實現聚類提取,如通過采樣一致性方法對一系列參數模型(如平面、柱面、球面、直線等)進行模型擬合點云分割提取,提取多邊形棱鏡內部點云等等;
??libpcl surface:實現表面重建技術,如網格重建、凸包重建、移動最小二乘法平滑等;
libpcl register:實現點云配準方法,如ICP等;
libpclkeypoints:實現不同的關鍵點的提取方法,這可以用來作為預處理步驟,決定在哪兒提取特征描述符;
libpcl range :實現支持不同點云數據集生成的范圍圖像。
為了保證PCL中操作的正確性,上述提到的庫中的方法和類包含了單位和回歸測試。這套單元測試通常都是由專門的構建部門按需求編譯和驗證的。當某一部分測試失敗時,這些特定部分的各自作者就會立即被告知。這徹底地保證了代碼測試過程出現的任何變故,以及新功能或修改都不會破壞PCL中已經存在的代碼。
參考資料 >