譚凱元,朱嘉林,鄧 君,王荔薔,楊家源
(東莞理工學(xué)院機(jī)械工程學(xué)院,廣東東莞 523000)
近年來(lái),隨著人民生活質(zhì)量的提高,機(jī)器人的應(yīng)用也越來(lái)越廣泛,其在不同的領(lǐng)域發(fā)揮著重要的作用。而且在許多地方,機(jī)器人已經(jīng)可以代替人類去完成一些工作,特別是可以幫助人類完成復(fù)雜的計(jì)算工作,或者在一些對(duì)人類來(lái)說(shuō)具有安全隱患的工作環(huán)境,機(jī)器人更是取代人類去完成這些危險(xiǎn)的工作。而在諸如此類的工作環(huán)境中,機(jī)器人需要強(qiáng)大的同步定位和自動(dòng)建圖能力,這能夠讓機(jī)器人在未知的環(huán)境下對(duì)周邊的環(huán)境進(jìn)行實(shí)時(shí)的地圖構(gòu)建,以便機(jī)器人在之后的進(jìn)行自主導(dǎo)航和路徑規(guī)劃。
為了進(jìn)行實(shí)時(shí)地圖的構(gòu)建,所選擇的載體機(jī)器人應(yīng)該為較為靈活機(jī)動(dòng)的,所以現(xiàn)在市面上的傳統(tǒng)選擇為小車。但是這種SLAM 小車最大的缺點(diǎn)是對(duì)地形的環(huán)境、地貌有很多要求,會(huì)使地圖的構(gòu)建產(chǎn)生相當(dāng)多的缺陷,有許多地方無(wú)法建圖,大幅度會(huì)受限于地形地貌[1]。而運(yùn)用無(wú)人機(jī)搭載攝像頭進(jìn)行建圖可以克服如此眾多缺點(diǎn),突破地形限制,更加靈活方便,同時(shí)構(gòu)建的地圖也會(huì)更加立體完全。
無(wú)人機(jī)又稱無(wú)人機(jī)駕駛飛行器,是近年來(lái)發(fā)展起來(lái)的一個(gè)集空氣動(dòng)力學(xué)、材料力學(xué)、自動(dòng)控制技術(shù)、軟件技術(shù)為一體的高科技產(chǎn)品。無(wú)人機(jī)廣泛用于空中偵察、監(jiān)視、通信、反潛、電子干擾等領(lǐng)域。目前世界上有30余個(gè)國(guó)家和地區(qū)研制出了50多種無(wú)人機(jī),無(wú)人機(jī)型號(hào)超過(guò)300余種,有55個(gè)國(guó)家裝備了無(wú)人機(jī)[2]。
本文所設(shè)計(jì)的雙目SLAM 無(wú)人機(jī)是一種應(yīng)用于復(fù)雜地形地貌下建模的機(jī)器人[3],其上面搭載了雙目攝像頭,進(jìn)行對(duì)周邊環(huán)境的信息進(jìn)行采集,并裝載了樹(shù)莓派將雙目攝像頭采集到的信息篩選處理并轉(zhuǎn)化成點(diǎn)云圖和輸出,同時(shí)樹(shù)莓派還進(jìn)行與飛控板之間的信息交流,實(shí)時(shí)控制無(wú)人機(jī)位姿、運(yùn)動(dòng)位移。最終將地圖完整地構(gòu)建之后,再通過(guò)不同的算法規(guī)劃和篩選出無(wú)人機(jī)從起點(diǎn)到終點(diǎn)的最優(yōu)路徑解[4],從而實(shí)現(xiàn)雙目SLAM 無(wú)人機(jī)的自主導(dǎo)航功能。
無(wú)人機(jī)的控制部分是一塊樹(shù)莓派4B 主控板,樹(shù)莓派4B 主控板相當(dāng)于一個(gè)微處理器,具有獨(dú)立的CPU芯片,可以實(shí)現(xiàn)本項(xiàng)目所需的建圖功能。通過(guò)在樹(shù)莓派中燒錄一個(gè)Ubuntu16.04系統(tǒng),并安裝ROS 系統(tǒng),將ORB-SLAM 建圖,定位避障,自主導(dǎo)航各種算法集成在一起,無(wú)人機(jī)能夠?qū)崿F(xiàn)自動(dòng)建圖,自主導(dǎo)航的目標(biāo)。
無(wú)人機(jī)的信息采集部分主要是采用USB 雙目攝像頭,USB雙目攝像頭是一款集雙目圖像及IMU 為一體的高清圖像傳感器,該設(shè)備支持Windows、Linux、Android 等多種平臺(tái),且支持C/C++、Python 等各種編程語(yǔ)言,不僅支持PC 桌面操作系統(tǒng),還支持嵌入式系統(tǒng),如樹(shù)莓派開(kāi)發(fā)板。適合應(yīng)用于ORBSLAM建圖。
其主體外觀如圖1所示。
圖1 雙目無(wú)人機(jī)主體外觀
在無(wú)人機(jī)自動(dòng)導(dǎo)航中必需的點(diǎn)云圖基于深度圖,在室內(nèi),自主機(jī)器人一般使用深度RGB-D 相機(jī)獲得深度圖;而在室外,雙目相機(jī)沒(méi)有尺度問(wèn)題,安裝在無(wú)人機(jī)上來(lái)計(jì)算深度圖正合適。
在使用攝像頭之前,首先要進(jìn)行相機(jī)標(biāo)定[5],在各種圖像測(cè)量的過(guò)程中以及機(jī)器視覺(jué)應(yīng)用中,為了重建和識(shí)別物體,需要確定空間物體表面任意點(diǎn)的三維幾何位置與其在圖像中的對(duì)應(yīng)點(diǎn)之間的相互關(guān)系,進(jìn)而建立相機(jī)成像的幾何模型,而這些幾何模型參數(shù)就是攝像頭的相機(jī)參數(shù)。這些參數(shù)分別是相機(jī)的內(nèi)、外參和畸變參數(shù),攝像機(jī)內(nèi)參反映的是攝像機(jī)從三維空間到二維圖像的投影關(guān)系,即坐標(biāo)系到圖像坐標(biāo)系之間的投影關(guān)系;攝像機(jī)外參決定了攝像機(jī)坐標(biāo)系和世界坐標(biāo)系之間相對(duì)位置關(guān)系,即其旋轉(zhuǎn)R和平移T關(guān)系。
攝像機(jī)標(biāo)定就是從世界坐標(biāo)系轉(zhuǎn)換為攝像機(jī)坐標(biāo)系,再由攝像機(jī)坐標(biāo)系轉(zhuǎn)換為圖像坐標(biāo)系的過(guò)程,也就是求得最終投影矩陣的過(guò)程。
(1)從世界坐標(biāo)系到攝像機(jī)坐標(biāo)系:是三維點(diǎn)到三維點(diǎn)的轉(zhuǎn)換,包括旋轉(zhuǎn)R和平移T(相機(jī)外參)等參數(shù)。如圖2所示。
圖2 世界坐標(biāo)系到攝像機(jī)坐標(biāo)系的變換
(2)相機(jī)坐標(biāo)系轉(zhuǎn)換為圖像坐標(biāo)系:這是三維點(diǎn)到二維點(diǎn)的轉(zhuǎn)換,包括焦距f(相機(jī)內(nèi)參)等參數(shù)。如圖3所示。
圖3 相機(jī)坐標(biāo)系到圖像坐標(biāo)系的變換
為了得到深度圖需要使用立體匹配算法,利用了雙目立體匹配原理。圖4所示為雙目圖像立體匹配的具體流程。
圖4 雙目立體匹配原理流程
利用雙目相機(jī)計(jì)算稠密的深度需要經(jīng)過(guò)兩個(gè)步驟,為圖像矯正和視差計(jì)算,具體如下。
步驟1:圖像矯正分為圖像去畸變矯正和圖像立體匹配[6]。圖像畸變指的是圖像邊緣的直線由于相機(jī)的畸變導(dǎo)致在成像的時(shí)候變成了曲線。圖像去畸變則是利用圖像的畸變參數(shù)對(duì)圖像畸變進(jìn)行校正,檢測(cè)方法是將原本畸變的圖像在通過(guò)畸變校正后,變回直線,如圖5 所示。這個(gè)也稱作相機(jī)的內(nèi)參數(shù)校準(zhǔn)(焦距為fx、fy;相機(jī)中心為cx、cy),通常調(diào)用ROS 里面的包就可以實(shí)現(xiàn)了。
圖5 圖像去畸變
步驟2:立體畸變校正。立體匹配是指把左右圖像旋轉(zhuǎn)到同一個(gè)平面(這里說(shuō)同一個(gè)平面不太準(zhǔn)確,應(yīng)該是兩個(gè)平行的平面),使得左右兩幅圖片的光軸平行,檢測(cè)方法是判斷左右目圖像中的同一個(gè)像素點(diǎn)是否在同一水平線上面,是立體視覺(jué)研究中的關(guān)鍵部分,其目標(biāo)是在兩個(gè)或多個(gè)視點(diǎn)中匹配相應(yīng)像素點(diǎn),計(jì)算視差。通過(guò)建立一個(gè)能量代價(jià)函數(shù),對(duì)其最小化來(lái)估計(jì)像素點(diǎn)的視差,求得深度。
立體矯正是校準(zhǔn)相機(jī)的外參數(shù)實(shí)現(xiàn)的,這個(gè)也可以通過(guò)ROS 下的相機(jī)校準(zhǔn)包實(shí)現(xiàn),只需要輸入棋盤格的size 即可。校準(zhǔn)的參數(shù)包括基線fx、相機(jī)的R矩陣、投影矩陣P矩陣。
一般來(lái)說(shuō)epi<0.2就已經(jīng)可以進(jìn)行建圖了,epi<0.15算是很好了,如圖6所示。
圖6 立體矯正
在獲得相機(jī)的內(nèi)參數(shù)和外參數(shù)以后,可以調(diào)用opencv的函數(shù)對(duì)雙目的圖像進(jìn)行矯正,如下所示[7]:
本項(xiàng)目采用(9×7)的黑白格棋盤,如圖8 所示。未標(biāo)定前雙目相機(jī)的左右視角畫面如圖7 所示,黑白格以及環(huán)境有明顯的扭曲變形,且從棋盤可以看出左右視角畫面不在同一平面上。標(biāo)定校準(zhǔn)之后的黑白格如圖8所示。
圖7 未標(biāo)定前雙目相機(jī)
圖8 標(biāo)定校準(zhǔn)后雙目攝像機(jī)
ORB-SLAM 算法是一種基于ORB 特征的三維定位與地圖構(gòu)建算法(SLAM),具有地圖初始化和回環(huán)檢測(cè)的功能,并優(yōu)化了關(guān)鍵幀選取和地圖構(gòu)建的方法[8]。
ORB-SLAM 共有3 個(gè)線程,分別是跟蹤線程(Tracking)、地圖構(gòu)建線程(Local Mapping)和回環(huán)檢測(cè)線程(Loop Closing)。
跟蹤線程運(yùn)用ORB(Oriented Fast and Rotated Brief)算法對(duì)圖像中的關(guān)鍵點(diǎn)快速創(chuàng)建特征向量。第一步是使用的是FAST 算法查找圖像中的關(guān)鍵點(diǎn),提取出ORB 特征;第二步是初始姿態(tài)估計(jì),根據(jù)相鄰幀之間的信息估計(jì)出相機(jī)的初始位姿,并通過(guò)全局重定位來(lái)初始化位姿;第三步是姿態(tài)優(yōu)化,利用相鄰幀尋找更多的特征匹配,優(yōu)化當(dāng)前幀的位姿;第四步是選取關(guān)鍵幀,通過(guò)篩選冗余關(guān)鍵幀來(lái)決定當(dāng)前幀是否可以作為關(guān)鍵幀。
地圖構(gòu)建線程ORB-SLAM 關(guān)鍵步驟,即建立點(diǎn)云地圖。第一步是加入跟蹤線程中篩選出的關(guān)鍵幀;第二步是驗(yàn)證最近加入的地圖點(diǎn)(去除異常);第三步是生成新的地圖點(diǎn),利用三角法生成新的地圖云點(diǎn),三角化的云點(diǎn)必須經(jīng)過(guò)地圖點(diǎn)云篩選測(cè)試,保證留下的點(diǎn)云都是能被跟蹤的;第四步是局部束調(diào)整(Local Bundle Adjustment),添加待優(yōu)化的位姿頂點(diǎn),進(jìn)行優(yōu)化迭代,檢測(cè)和排除誤差較大的異常;第五步是驗(yàn)證關(guān)鍵幀,構(gòu)建局部地圖時(shí)檢測(cè)并刪除重復(fù)幀。
回環(huán)檢測(cè)可以解決累計(jì)漂移,校正整個(gè)軌跡的形狀[9]。第一步是選取相似幀,在相似幀提取關(guān)鍵點(diǎn)和局部特征,判斷是否先前已經(jīng)構(gòu)建過(guò)地圖的位置;第二步是檢測(cè)閉環(huán),獲得回環(huán)的累積誤差;第三步是融合三維點(diǎn),融合重復(fù)的點(diǎn)云,并且在Covisibility Graph 中插入新的邊以連接閉環(huán);第四步是圖優(yōu)化(傳導(dǎo)變換矩陣),用本質(zhì)圖(Essential Graph)去優(yōu)化位姿圖,將閉環(huán)的誤差分散到整個(gè)圖中。
首先進(jìn)行位姿的初始化和優(yōu)化,通過(guò)提取圖像中的特征點(diǎn),根據(jù)相鄰幀之間的信息,將其各自的特征點(diǎn)進(jìn)行匹配,從而估計(jì)出相機(jī)的初始位姿,并通過(guò)全局重定位來(lái)初始化位姿。
得出相機(jī)的位姿后,可以通過(guò)計(jì)算得出視覺(jué)里程計(jì)。圖10 中相機(jī)圖像上的綠色小方塊為當(dāng)前提取的圖像特征點(diǎn),即ORB特征。圖中的黑點(diǎn)和紅點(diǎn)代表環(huán)境的稀疏地圖(紅色為局部地圖點(diǎn),表示當(dāng)前路標(biāo);黑色為全局地圖點(diǎn),代表歷史路標(biāo))。圖中的綠線為相機(jī)的運(yùn)動(dòng)軌跡,綠色方框代表相機(jī)的實(shí)時(shí)位姿;藍(lán)色方框?yàn)橄鄼C(jī)的歷史位姿,代表相機(jī)運(yùn)動(dòng)過(guò)程中的空間位置(即關(guān)鍵幀)[10]。最后將生成的ORB-SLAM2 文件修改,基于ROS系統(tǒng),將相機(jī)的位姿和視覺(jué)里程計(jì)生成為節(jié)點(diǎn)并發(fā)布,用于后面的稠密點(diǎn)云地圖、八叉樹(shù)地圖及代價(jià)地圖建圖。
圖10 實(shí)驗(yàn)室稀疏點(diǎn)云圖
稠密點(diǎn)云地圖的建圖系統(tǒng)分為了3 個(gè)節(jié)點(diǎn),如圖11 所示。第一個(gè)節(jié)點(diǎn)作為驅(qū)動(dòng)節(jié)點(diǎn),負(fù)責(zé)采集圖像的數(shù)據(jù);第二個(gè)節(jié)點(diǎn)為姿態(tài)節(jié)點(diǎn),主要運(yùn)行ORB-SLAM 做姿態(tài)估計(jì);第三個(gè)節(jié)點(diǎn)作為建圖節(jié)點(diǎn),是系統(tǒng)核心,收集第一和第二節(jié)點(diǎn)的建圖節(jié)點(diǎn)并接收攝像頭傳回的數(shù)據(jù)和實(shí)時(shí)位姿,最后進(jìn)行點(diǎn)云拼接。
圖11 稠密點(diǎn)云地圖建圖步驟
相較于各種點(diǎn)云圖,八叉樹(shù)地圖更加靈活且易于壓縮,并且還可以隨時(shí)更新[11]。如圖12 所示,每個(gè)立方體都會(huì)不斷地均勻分成8 塊,直到變成最小的方塊為止,而整個(gè)最大的方塊,可以看成是一個(gè)根節(jié)點(diǎn),而最小的方塊就是末端的“葉子節(jié)點(diǎn)”。于是在八叉樹(shù)地圖中,當(dāng)從下一層的節(jié)點(diǎn)往上走時(shí),這個(gè)地圖的體積每經(jīng)過(guò)一層就可以擴(kuò)大8倍。如圖12所示?;诎瞬鏄?shù)地圖的特性,八叉樹(shù)地圖有以下4個(gè)優(yōu)點(diǎn)。
圖12 八叉樹(shù)地圖
(1)八叉樹(shù)地圖可以描述所建地圖中的任意位置的狀態(tài),可以用樹(shù)中的節(jié)點(diǎn)來(lái)表示空間中的任意位置。
(2)同時(shí),八叉樹(shù)地圖更易于更新和維護(hù),他將各個(gè)位置的狀態(tài)信息保存于節(jié)點(diǎn),當(dāng)需要修改這些位置的狀態(tài)時(shí),則只需要修改節(jié)點(diǎn)中的變量即可。
(3)八叉樹(shù)地圖還可以根據(jù)所需要得到地圖的精度而隨時(shí)調(diào)整。
(4)八叉樹(shù)地圖需要的內(nèi)存相較于點(diǎn)云地圖而言小很多,當(dāng)對(duì)地圖的精度要求不高時(shí),可以用低分辨率的構(gòu)建方式來(lái)節(jié)省空間。這更加有利于用在機(jī)器人的導(dǎo)航上。
路徑規(guī)劃是雙目SLAM 無(wú)人機(jī)能夠?qū)崿F(xiàn)自主導(dǎo)航的重要過(guò)程,主要功能是讓無(wú)人機(jī)在地圖內(nèi)自主規(guī)劃出一條從起點(diǎn)到終點(diǎn)的無(wú)碰撞的最優(yōu)路徑解。路徑規(guī)劃由兩部分組成,分別是全局路徑規(guī)劃和局部路徑規(guī)劃。全局路徑規(guī)劃是當(dāng)已經(jīng)知道了起點(diǎn)、終點(diǎn)的位置和無(wú)人機(jī)所處的地圖時(shí),通過(guò)一系列算法計(jì)算出一條從起點(diǎn)到終點(diǎn)的最優(yōu)路徑解,更加適用于靜態(tài)的環(huán)境;而局部路徑規(guī)劃則是依靠攝像頭等傳感器模塊感知實(shí)時(shí)的信息,通過(guò)一系列算法實(shí)現(xiàn)對(duì)不斷變化的障礙物和突發(fā)事件進(jìn)行及時(shí)的避險(xiǎn),更具實(shí)時(shí)性和實(shí)用性,更加適用于動(dòng)態(tài)的環(huán)境[12]。全局路徑規(guī)劃和局部路徑規(guī)劃這兩種路徑規(guī)劃方法的組成了無(wú)人機(jī)完備的路徑規(guī)劃系統(tǒng)。
傳統(tǒng)使用的全局路徑規(guī)劃算法有4 種,分別是Dijkstra 算法、RRT 算法、BFS 算法和A*算法。Dijkstra 算法的特點(diǎn)是其支持的搜索地圖面積較大,該算法從起點(diǎn)向外擴(kuò)散,生成最優(yōu)路徑解,但是其缺點(diǎn)明顯,開(kāi)始建圖之前會(huì)將整張地圖全部搜索完,所以效率相較于其他3 種算法比較低,但仍然可以生成最優(yōu)路徑;RRT算法是一種基于樹(shù)狀結(jié)構(gòu)的路徑規(guī)劃算法,從起點(diǎn)開(kāi)始向外擴(kuò)散出一個(gè)個(gè)的樹(shù)狀結(jié)構(gòu),但這種算法最大的缺點(diǎn)是無(wú)法對(duì)規(guī)劃的結(jié)果進(jìn)行預(yù)判,并且每次規(guī)劃的結(jié)果可能都不一樣;BFS 算法的特點(diǎn)是搜索空間小,但是效率高,不能保證找到一條最優(yōu)路徑解;A*算法在Dijkstra 算法的基礎(chǔ)上加入了啟發(fā)函數(shù),用于引導(dǎo)其搜索方向;并且結(jié)合了BFS算法的優(yōu)點(diǎn),相較于其他路徑規(guī)劃算法,使用更加普遍,因此本項(xiàng)目中使用A*算法作為無(wú)人機(jī)的全局路徑規(guī)劃。
當(dāng)無(wú)人機(jī)在建立好了所需地圖后,通過(guò)A*算法可以規(guī)劃出一條大致可行的路線,但面對(duì)實(shí)際環(huán)境中各種突發(fā)的狀況,例如突然出現(xiàn)了動(dòng)態(tài)障礙或者建圖時(shí)未被檢測(cè)到的障礙,就需要通過(guò)局部的路徑規(guī)劃來(lái)進(jìn)行路徑的調(diào)整。于是本項(xiàng)目采用DWA 算法進(jìn)行局部路徑規(guī)劃。DWA 算法會(huì)先建立機(jī)器人的速度運(yùn)動(dòng)模型,建立之后對(duì)機(jī)器人的速度進(jìn)行采樣,最后使用評(píng)估函數(shù)完成局部規(guī)劃。
無(wú)人機(jī)以ROS 系統(tǒng)為載體,將ORB-SLAM 建圖,定位避障,自主導(dǎo)航各種算法集成在一起。在ROS系統(tǒng)中,最小的進(jìn)程單元就是節(jié)點(diǎn),一個(gè)軟件包里可以有多個(gè)可執(zhí)行文件,可執(zhí)行文件在運(yùn)行之后就成了一個(gè)進(jìn)程,這個(gè)進(jìn)程在ROS中就叫做節(jié)點(diǎn)[13]。在無(wú)人機(jī)中建圖、定位、循跡等就是不同的節(jié)點(diǎn)。ROS系統(tǒng)將節(jié)點(diǎn)聲明為話題,然后以發(fā)布話題的形式將數(shù)據(jù)傳輸,最后使用不同的ROS通信機(jī)制實(shí)現(xiàn)數(shù)據(jù)的交互。本項(xiàng)目采用雙目攝像頭,以雙目坐標(biāo)系作為點(diǎn)云地圖的基礎(chǔ)坐標(biāo)系,圖13所示為本項(xiàng)目的雙目SLAM無(wú)人機(jī)。
圖13 雙目SLAM無(wú)人機(jī)
雙目攝像頭的標(biāo)定與使用在第2節(jié)已敘述,圖14所示為標(biāo)定后的拍攝效果。
圖14 攝像頭標(biāo)定后的拍攝效果
實(shí)驗(yàn)室稀疏點(diǎn)云地圖構(gòu)建如圖15 所示。圖中相機(jī)圖像上的綠色小方塊為當(dāng)前提取的圖像特征點(diǎn),即ORB 特征。圖中的黑點(diǎn)和紅點(diǎn)代表環(huán)境的稀疏地圖(紅色為局部地圖點(diǎn),表示當(dāng)前路標(biāo);黑色為全局地圖點(diǎn),代表歷史路標(biāo))。綠色方框代表相機(jī)的實(shí)時(shí)位姿;藍(lán)色方框?yàn)橄鄼C(jī)的歷史位姿,代表相機(jī)運(yùn)動(dòng)過(guò)程中的空間位置(即關(guān)鍵幀)[10]。
圖15 實(shí)驗(yàn)室稀疏點(diǎn)云地圖
本文設(shè)計(jì)了一種基于雙目視覺(jué)的SLAM 四旋翼無(wú)人機(jī),可以在未知的環(huán)境下對(duì)周邊的環(huán)境進(jìn)行實(shí)時(shí)的地圖構(gòu)建,并且完成自主定位導(dǎo)航。并且由于無(wú)人機(jī)靈活機(jī)動(dòng)的特性,可以不受限于地形,在許多傳統(tǒng)SLAM 小車去不了的地方,也能進(jìn)行建圖。在設(shè)計(jì)的過(guò)程中通過(guò)各種渠道查閱關(guān)于ORB-SLAM、無(wú)人機(jī)的知識(shí);對(duì)雙目攝像頭的標(biāo)定匹配,以及矯正;通過(guò)使用樹(shù)莓派將雙目攝像頭采集到的信息進(jìn)行篩選處理后,轉(zhuǎn)化成點(diǎn)云圖再輸出,同時(shí)樹(shù)莓派還進(jìn)行與飛控板之間的信息交流,實(shí)時(shí)控制無(wú)人機(jī)位移;將ORB-SLAM 算法融入到ROS 系統(tǒng)與建圖當(dāng)中,最終實(shí)現(xiàn)實(shí)時(shí)點(diǎn)云地圖的建立。