博客專欄

EEPW首頁 > 博客 > 一文詳解點(diǎn)云庫PCL

一文詳解點(diǎn)云庫PCL

發(fā)布人:計(jì)算機(jī)視覺工坊 時間:2021-04-19 來源:工程師 發(fā)布文章

3D is here: Point Cloud Library (PCL)

摘要:

隨著新型,低成本的3D傳感器硬件的出現(xiàn)(例如Kinect),以及科研人員在高級點(diǎn)云處理研究上的不斷努力,3D感知在機(jī)器人技術(shù)以及其他領(lǐng)域顯得愈發(fā)重要。

本文,我們將介紹在點(diǎn)云感知領(lǐng)域的一項(xiàng)最新舉措:PCL(點(diǎn)云庫– http://pointclouds.org)。PCL為3D感知領(lǐng)域提供了一種先進(jìn)且廣泛的方法,旨在為常見的需要用到3D功能的需求提供支持。該庫包含用于以下方面的最新算法:濾波,特征估計(jì),表面重建,配準(zhǔn),模型擬合和分段。PCL得到了國際機(jī)器人技術(shù)和感知研究人員的支持。我們簡要介紹下PCL,包括其算法功能和實(shí)現(xiàn)策略。

一、介紹

為了使機(jī)器人在非結(jié)構(gòu)化環(huán)境中工作,他們需要能夠感知世界。在過去的20年中,我們走過了一段很長的路。從簡單的距離傳感器(基于聲納或紅外線),提供幾個字節(jié)的信息;到無處不在的相機(jī);再到激光掃描儀。在過去的幾年中,像DARPA Urban Challenge上用的Velodyne旋轉(zhuǎn)激光雷達(dá),和傾斜激光PR2上使用的掃描儀為我們提供了高質(zhì)量的3D世界的表示形式-點(diǎn)云。但是很遺憾,這些系統(tǒng)都很昂貴,要花費(fèi)數(shù)千甚至數(shù)十萬美元數(shù)千美元,因此很多機(jī)器人項(xiàng)目都無法承擔(dān)這樣的開支。

但是最近幾年,3D傳感器變得很容易獲得,這改變了游戲規(guī)則。比如,用于微軟XBox 360游戲系統(tǒng)的Kinect傳感器,基于PrimeSense技術(shù)。只要150美元以下的價格就能買到。它像2D一樣提供實(shí)時的點(diǎn)云圖。因此, 我們可以預(yù)見,未來大部分機(jī)器人都能以三維的視角看這個世界。所有這些需要的,就是一種有效處理點(diǎn)云的機(jī)制,這就是我們介紹的開源點(diǎn)云庫-PCL,圖1是Logo.

1.png

PCL是一個完全免費(fèi)的,BSD許可的庫,用于n維點(diǎn)云和3D幾何處理。此外,PCL完全集成在ROS中——機(jī)器人操作系統(tǒng)(請參閱http://ros.org),并且已經(jīng)被廣泛應(yīng)用于機(jī)器人社區(qū)中的各種項(xiàng)目。

二、架構(gòu)和實(shí)施

PCL完全是一個模塊化的現(xiàn)代C++3D點(diǎn)云處理庫??紤]到當(dāng)今CPU的效率和性能,PCL中的底層數(shù)據(jù)結(jié)構(gòu)大量使用了SSE優(yōu)化。其大部分?jǐn)?shù)學(xué)運(yùn)算的實(shí)現(xiàn)是基于Eigen(一個開源的線性代數(shù)代數(shù)庫)。此外,PCL還提供了對OpenMP(請參閱http://openmp.org)和Intel線程構(gòu)建模塊(TBB)庫的支持,以實(shí)現(xiàn)多核并行化??焖賙最近鄰搜索算法的主干是由FLANN提供(一個執(zhí)行快速近似最近鄰搜索的庫) 。PCL中的所有模塊和算法均通過使用Boost共享指針的傳遞數(shù)據(jù)(參見圖2),因此避免重新復(fù)制系統(tǒng)中已經(jīng)存在的數(shù)據(jù)。從0.6版開始,PCL已被移植到Windows,MacOS和Linux,并且Android端正在開發(fā)中。

2.png從算法角度,PCL旨在集成多種3D處理算法來處理點(diǎn)云數(shù)據(jù),包括:濾波,特征估計(jì),表面重建,模型擬合,分割,配準(zhǔn)等。每組算法都是通過基類定義的,這些基類試圖集成整個流程中所有通用功能,從而使實(shí)際算法的實(shí)現(xiàn)緊湊而簡潔。PCL中處理這種流程的基本接口是:

創(chuàng)建處理對象(例如,濾波器,特征估計(jì)器,分割);

使用setInputCloud傳遞輸入點(diǎn)云數(shù)據(jù)集到處理模塊;

設(shè)置一些參數(shù);

調(diào)用計(jì)算(或?yàn)V波,分割等)得到輸出。

圖2中展示的偽代碼程序顯示標(biāo)準(zhǔn)特征估算過程分兩步進(jìn)行,首先創(chuàng)建NormalEstimation對象并傳遞輸入數(shù)據(jù)集,然后結(jié)果和原始輸入一起傳遞給FPFH 估計(jì)對象。

為了進(jìn)一步簡化開發(fā),將PCL分為一系列較小的代碼庫,可以單獨(dú)編譯:

libpcl filters:實(shí)現(xiàn)采樣、去除離群點(diǎn)、特征提取、擬合估計(jì)等過濾器;

libpcl features:實(shí)現(xiàn)多種三維特征的篩選,如:曲面法線、曲率、邊界點(diǎn)估計(jì)等;

libpcl I/O:實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出操作;

libpcl surface:實(shí)現(xiàn)表面重建技術(shù),如網(wǎng)格重建,凸包重建;

libpcl registeration:實(shí)現(xiàn)點(diǎn)云配準(zhǔn)方法,如ICP等;

libpcl keypoints:實(shí)現(xiàn)不同的關(guān)鍵點(diǎn)提取方法;

libpcl range image:實(shí)現(xiàn)支持不同點(diǎn)云數(shù)據(jù)集生成的范圍圖像。

為了確保PCL中操作的正確性,上述每個庫中的方法和類包含單元測試和回歸測試。單元測試套件是按需編譯的,并由專門的人員頻繁驗(yàn)證構(gòu)建,以及特定組件的各自作者組件測試失敗時被立即通知。這樣可以確保對代碼中的所有更改進(jìn)行全面測試,并且任何新功能或修改都不會破壞依賴于PCL的現(xiàn)有代碼。

另外,大量的示例和教程可通過C ++源文件或按照PCL Wiki網(wǎng)頁上一步步的操作說明獲得。

三、PCL和ROS

PCL設(shè)計(jì)理念中的基石之一是由感知處理圖(PPG)表示。PPG背后的合理性在于,大多數(shù)點(diǎn)云處理的應(yīng)用程序都可以表述為一組具體的構(gòu)造塊,并對其進(jìn)行參數(shù)化以實(shí)現(xiàn)不同的結(jié)果。例如,墻面檢測算法,門檢測或桌子檢測之間在算法上沒有區(qū)別,它們都共享相同的構(gòu)造塊,即平面約束分割算法。上述提到的案例中,發(fā)生的變化是用于運(yùn)行算法的一系列參數(shù)。

考慮到這一點(diǎn),并基于以前設(shè)計(jì)其他3D處理庫的經(jīng)驗(yàn)。在最近的ROS中,我們決定提供PCL中的每種算法作為一個獨(dú)立的構(gòu)造塊,可以輕松連接其他塊,從而與ROS生態(tài)系統(tǒng)中節(jié)點(diǎn)連接的方式相同。

圖3展示了一個具體的節(jié)點(diǎn)模型PPG示例,該示例用于識別水平面區(qū)域上的一組點(diǎn)集。

3.png

四、可視化

PCL帶有自己的可視化庫,基于VTK 。VTK為渲染3D點(diǎn)云和表面數(shù)據(jù)提供了強(qiáng)大的多平臺支持,包括可視化張量,紋理和體積法。

PCL可視化庫旨在集成PCL和VTK,通過給 n 維點(diǎn)云結(jié)構(gòu)提供全面的可視化層。其目的是能夠快速原型化并可視化在此類超維數(shù)據(jù)上運(yùn)行的算法的結(jié)果。從0.2版開始,可視化庫提供:

對所有n維點(diǎn)云數(shù)據(jù)集渲染和設(shè)置視覺屬性的方法(顏色,點(diǎn)大小,不透明度等);

用點(diǎn)集或參數(shù)方程式的方法在屏幕上繪制基本3D形狀的方法(例如,圓柱體,球體,線,多邊形等);

用于2D繪制的直方圖可視化模塊(PCLHistogramVisualizer);

大量的幾何和顏色處理程序。在這里,用戶可以指定將什么尺寸用于3D笛卡爾空間中的點(diǎn)位置(見圖4),或者應(yīng)使用什么顏色來渲染點(diǎn)(見圖5);

4.png

深度圖可視化模塊(見圖6)。

5.png

處理程序交互器是描述如何計(jì)算空間中每個點(diǎn)的顏色和3D幾何形狀,在屏幕上顯示以及用戶如何與數(shù)據(jù)進(jìn)行交互。

6.png

該庫還提供了一些通用工具,用于可視化PCD文件以及在ROS中實(shí)時可視化來自傳感器的數(shù)據(jù)流。

五、使用范例

在本節(jié)中,我們提供了兩個代碼段,展示了使用PCL進(jìn)行濾波和分段操作的靈活性和簡便性,隨后是三個使用PCL解決感知問題的應(yīng)用示例:i)導(dǎo)航和映射,ii)目標(biāo)識別, iii)操縱和抓取。

在將任何更高級別的運(yùn)算應(yīng)用于原始數(shù)據(jù)集之前,濾波是任何原始點(diǎn)云數(shù)據(jù)集通常都會經(jīng)過的最重要的運(yùn)算之一。算法2和圖7給出了一個代碼段,以及在該圖左側(cè)部分的點(diǎn)云數(shù)據(jù)集上運(yùn)行該代碼段后獲得的結(jié)果。該濾波器基于估算給定鄰域中的點(diǎn)的一組統(tǒng)計(jì)信息(此處k = 50),并使用它們選擇所有離平均距離μ在距離以內(nèi)的點(diǎn)作為內(nèi)點(diǎn)。

7.png

第二個示例使用RANSAC 模型構(gòu)成平面的分割操作,如算法3所示。輸入和輸出結(jié)果如圖8所示。在此示例中,我們使用RANSAC估計(jì)器隨機(jī)選擇 3個非共線點(diǎn),并根據(jù)整體計(jì)算出最佳模型內(nèi)點(diǎn)數(shù)。內(nèi)部閾值標(biāo)準(zhǔn)設(shè)置為每個點(diǎn)到平面模型的最大距離為1cm。

8.png

圖9的左側(cè)展示了一個更復(fù)雜的導(dǎo)航和地圖應(yīng)用程序的示例,其中PR2機(jī)器人必須自主識別門及其把手,以便探索房間并找到電源插座。在這里,使用的模塊包括受約束的平面分割,區(qū)域增長法,凸包估計(jì)和多邊形棱鏡提取算法。然后將這些算法的結(jié)果用于提取有關(guān)門和把手的形狀和尺寸的某些統(tǒng)計(jì)信息,以便唯一地識別它們并拒絕誤報(bào)。

圖9的右側(cè)部分顯示了一個從復(fù)雜3D場景進(jìn)行實(shí)時目標(biāo)識別的實(shí)驗(yàn)。在這里,在分割和配準(zhǔn)框架中使用了一組復(fù)雜的3D關(guān)鍵點(diǎn)和特征描述符,旨在識別真實(shí)世界中以前見過的物體。

9.png

圖10提供了一個抓取和操控的應(yīng)用程序。首先從水平桌面上分割出對象,將它們聚類成獨(dú)立單元,然后應(yīng)用配準(zhǔn)運(yùn)算,該運(yùn)算將語義信息附加到每個找到的聚類上。

10.png

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: 點(diǎn)云感知

技術(shù)專區(qū)

關(guān)閉