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