一文詳解點云庫PCL
3D is here: Point Cloud Library (PCL)
摘要:
隨著新型,低成本的3D傳感器硬件的出現(例如Kinect),以及科研人員在高級點云處理研究上的不斷努力,3D感知在機器人技術以及其他領域顯得愈發重要。
本文,我們將介紹在點云感知領域的一項最新舉措:PCL(點云庫– http://pointclouds.org)。PCL為3D感知領域提供了一種先進且廣泛的方法,旨在為常見的需要用到3D功能的需求提供支持。該庫包含用于以下方面的最新算法:濾波,特征估計,表面重建,配準,模型擬合和分段。PCL得到了國際機器人技術和感知研究人員的支持。我們簡要介紹下PCL,包括其算法功能和實現策略。
一、介紹
為了使機器人在非結構化環境中工作,他們需要能夠感知世界。在過去的20年中,我們走過了一段很長的路。從簡單的距離傳感器(基于聲納或紅外線),提供幾個字節的信息;到無處不在的相機;再到激光掃描儀。在過去的幾年中,像DARPA Urban Challenge上用的Velodyne旋轉激光雷達,和傾斜激光PR2上使用的掃描儀為我們提供了高質量的3D世界的表示形式-點云。但是很遺憾,這些系統都很昂貴,要花費數千甚至數十萬美元數千美元,因此很多機器人項目都無法承擔這樣的開支。
但是最近幾年,3D傳感器變得很容易獲得,這改變了游戲規則。比如,用于微軟XBox 360游戲系統的Kinect傳感器,基于PrimeSense技術。只要150美元以下的價格就能買到。它像2D一樣提供實時的點云圖。因此, 我們可以預見,未來大部分機器人都能以三維的視角看這個世界。所有這些需要的,就是一種有效處理點云的機制,這就是我們介紹的開源點云庫-PCL,圖1是Logo.
PCL是一個完全免費的,BSD許可的庫,用于n維點云和3D幾何處理。此外,PCL完全集成在ROS中——機器人操作系統(請參閱http://ros.org),并且已經被廣泛應用于機器人社區中的各種項目。
二、架構和實施
PCL完全是一個模塊化的現代C++3D點云處理庫。考慮到當今CPU的效率和性能,PCL中的底層數據結構大量使用了SSE優化。其大部分數學運算的實現是基于Eigen(一個開源的線性代數代數庫)。此外,PCL還提供了對OpenMP(請參閱http://openmp.org)和Intel線程構建模塊(TBB)庫的支持,以實現多核并行化。快速k最近鄰搜索算法的主干是由FLANN提供(一個執行快速近似最近鄰搜索的庫) 。PCL中的所有模塊和算法均通過使用Boost共享指針的傳遞數據(參見圖2),因此避免重新復制系統中已經存在的數據。從0.6版開始,PCL已被移植到Windows,MacOS和Linux,并且Android端正在開發中。
從算法角度,PCL旨在集成多種3D處理算法來處理點云數據,包括:濾波,特征估計,表面重建,模型擬合,分割,配準等。每組算法都是通過基類定義的,這些基類試圖集成整個流程中所有通用功能,從而使實際算法的實現緊湊而簡潔。PCL中處理這種流程的基本接口是:
創建處理對象(例如,濾波器,特征估計器,分割);
使用setInputCloud傳遞輸入點云數據集到處理模塊;
設置一些參數;
調用計算(或濾波,分割等)得到輸出。
圖2中展示的偽代碼程序顯示標準特征估算過程分兩步進行,首先創建NormalEstimation對象并傳遞輸入數據集,然后結果和原始輸入一起傳遞給FPFH 估計對象。
為了進一步簡化開發,將PCL分為一系列較小的代碼庫,可以單獨編譯:
libpcl filters:實現采樣、去除離群點、特征提取、擬合估計等過濾器;
libpcl features:實現多種三維特征的篩選,如:曲面法線、曲率、邊界點估計等;
libpcl I/O:實現數據的輸入和輸出操作;
libpcl surface:實現表面重建技術,如網格重建,凸包重建;
libpcl registeration:實現點云配準方法,如ICP等;
libpcl keypoints:實現不同的關鍵點提取方法;
libpcl range image:實現支持不同點云數據集生成的范圍圖像。
為了確保PCL中操作的正確性,上述每個庫中的方法和類包含單元測試和回歸測試。單元測試套件是按需編譯的,并由專門的人員頻繁驗證構建,以及特定組件的各自作者組件測試失敗時被立即通知。這樣可以確保對代碼中的所有更改進行全面測試,并且任何新功能或修改都不會破壞依賴于PCL的現有代碼。
另外,大量的示例和教程可通過C ++源文件或按照PCL Wiki網頁上一步步的操作說明獲得。
三、PCL和ROS
PCL設計理念中的基石之一是由感知處理圖(PPG)表示。PPG背后的合理性在于,大多數點云處理的應用程序都可以表述為一組具體的構造塊,并對其進行參數化以實現不同的結果。例如,墻面檢測算法,門檢測或桌子檢測之間在算法上沒有區別,它們都共享相同的構造塊,即平面約束分割算法。上述提到的案例中,發生的變化是用于運行算法的一系列參數。
考慮到這一點,并基于以前設計其他3D處理庫的經驗。在最近的ROS中,我們決定提供PCL中的每種算法作為一個獨立的構造塊,可以輕松連接其他塊,從而與ROS生態系統中節點連接的方式相同。
圖3展示了一個具體的節點模型PPG示例,該示例用于識別水平面區域上的一組點集。
四、可視化
PCL帶有自己的可視化庫,基于VTK 。VTK為渲染3D點云和表面數據提供了強大的多平臺支持,包括可視化張量,紋理和體積法。
PCL可視化庫旨在集成PCL和VTK,通過給 n 維點云結構提供全面的可視化層。其目的是能夠快速原型化并可視化在此類超維數據上運行的算法的結果。從0.2版開始,可視化庫提供:
對所有n維點云數據集渲染和設置視覺屬性的方法(顏色,點大小,不透明度等);
用點集或參數方程式的方法在屏幕上繪制基本3D形狀的方法(例如,圓柱體,球體,線,多邊形等);
用于2D繪制的直方圖可視化模塊(PCLHistogramVisualizer);
大量的幾何和顏色處理程序。在這里,用戶可以指定將什么尺寸用于3D笛卡爾空間中的點位置(見圖4),或者應使用什么顏色來渲染點(見圖5);
深度圖可視化模塊(見圖6)。
處理程序交互器是描述如何計算空間中每個點的顏色和3D幾何形狀,在屏幕上顯示以及用戶如何與數據進行交互。
該庫還提供了一些通用工具,用于可視化PCD文件以及在ROS中實時可視化來自傳感器的數據流。
五、使用范例
在本節中,我們提供了兩個代碼段,展示了使用PCL進行濾波和分段操作的靈活性和簡便性,隨后是三個使用PCL解決感知問題的應用示例:i)導航和映射,ii)目標識別, iii)操縱和抓取。
在將任何更高級別的運算應用于原始數據集之前,濾波是任何原始點云數據集通常都會經過的最重要的運算之一。算法2和圖7給出了一個代碼段,以及在該圖左側部分的點云數據集上運行該代碼段后獲得的結果。該濾波器基于估算給定鄰域中的點的一組統計信息(此處k = 50),并使用它們選擇所有離平均距離μ在距離以內的點作為內點。
第二個示例使用RANSAC 模型構成平面的分割操作,如算法3所示。輸入和輸出結果如圖8所示。在此示例中,我們使用RANSAC估計器隨機選擇 3個非共線點,并根據整體計算出最佳模型內點數。內部閾值標準設置為每個點到平面模型的最大距離為1cm。
圖9的左側展示了一個更復雜的導航和地圖應用程序的示例,其中PR2機器人必須自主識別門及其把手,以便探索房間并找到電源插座。在這里,使用的模塊包括受約束的平面分割,區域增長法,凸包估計和多邊形棱鏡提取算法。然后將這些算法的結果用于提取有關門和把手的形狀和尺寸的某些統計信息,以便唯一地識別它們并拒絕誤報。
圖9的右側部分顯示了一個從復雜3D場景進行實時目標識別的實驗。在這里,在分割和配準框架中使用了一組復雜的3D關鍵點和特征描述符,旨在識別真實世界中以前見過的物體。
圖10提供了一個抓取和操控的應用程序。首先從水平桌面上分割出對象,將它們聚類成獨立單元,然后應用配準運算,該運算將語義信息附加到每個找到的聚類上。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。