劉繼忠,王 聰,曾 成
(南昌大學(xué)機電工程學(xué)院,南昌大學(xué)南昌市醫(yī)工結(jié)合技術(shù)研究重點實驗室,江西 南昌 330031)
同時定位與地圖構(gòu)建(Simultaneous Localization and Mapping)作為智能移動機器人自主導(dǎo)航和定位的基礎(chǔ),近年來,已經(jīng)成為移動機器人領(lǐng)域的熱點。根據(jù)采集數(shù)據(jù)的傳感器類型,可以分成激光雷達(dá)[1]和視覺傳感器[2]兩類。在最初的SLAM里,被用來作為傳感器采集數(shù)據(jù)的大多為激光雷達(dá),雖然其具有精度較高的優(yōu)勢,但價格較貴,性價比不高。近年來,視覺傳感器開始應(yīng)用于SLAM并取得較好的效果,與激光雷達(dá)相比較,相機的優(yōu)勢在于成本低廉和較高的性價比,而且可以得到更多的信息。應(yīng)用于SLAM的相機可以大致分為三類:單目相機、雙目相機和RGB-D[3]相機。單目相機不能直接得到物體與相機的距離,需經(jīng)過相機平移后計算深度,但有尺度不確定性的缺點;雙目相機可以通過兩個相機的視差計算深度,但計算視差的運算量較大,消耗計算資源;RGB-D相機,如Kinect等,可同時獲取到RGB(彩色)圖像和相對應(yīng)的深度圖像,因可以直接得到深度信息,且價格低廉,性價比較高。因此,RGB-D相機成為了SLAM的主流視覺傳感器[4-5]。
自SLAM發(fā)展以來,后端誕生了兩種主要的方式:濾波和優(yōu)化。早期的SLAM求解方式大多是基于濾波器的,如卡爾曼濾波等。但當(dāng)構(gòu)建地圖不斷增大,內(nèi)存會被大量占用,且計算量也逐漸增大。而基于圖優(yōu)化方法,在處理SLAM的優(yōu)化問題時,會將其轉(zhuǎn)化為圖的形式,通常會將圖的優(yōu)化表示成非線性最小二乘問題。和基于濾波器的方法相比,圖優(yōu)化的優(yōu)勢在于,在長時間的更大規(guī)模和尺度的地圖上,有優(yōu)良的精度和性能[6]。2014年,Endres等[7]提出了一種較完整的RGB-D SLAM方法,主要包括視覺里程計和后端優(yōu)化,并生成了三維稠密點云地圖。但該方法實時性較差。2016年,Mur-Artal等[8]的ORB-SLAM2方法可以使用雙目相機和RGB-D相機,但是最終只生成了稀疏地圖。張慧娟等[9]于2019年提出一種基于線特征的視覺里程計方法,但線特征的提取相對于點特征較為困難。在2020年,Cheng[10]在Dyna-SLAM基礎(chǔ)上,通過結(jié)合語義信息來構(gòu)建地圖,并提出一種DM-SLAM方法。Cheng[11]在ORB-SLAM2的基礎(chǔ)上,通過YOLO學(xué)習(xí)模型和貝葉斯濾波后驗估計相結(jié)合的方式,從而提出一種改進(jìn)的動態(tài)SLAM。但結(jié)合深度學(xué)習(xí)的視覺SLAM算法會因特征丟失而無法估計位姿?;谏鲜龅难芯楷F(xiàn)狀,本文提出了一種改進(jìn)的RGB-D SLAM算法,對彩色圖像使用SURF特征和FLANN算法完成特征提取和匹配,再使用改進(jìn)的最小距離法和RANSAC相組合的方式將匹配中的誤匹配剔除;在前端,使用PNP求解相鄰幀間的位姿變化。在后端優(yōu)化部分使用G2O進(jìn)行位姿圖優(yōu)化。為了節(jié)省系統(tǒng)的計算資源的占用以增強算法的實時性,設(shè)計了一種關(guān)鍵幀的提取機制。在前端中產(chǎn)生的累計誤差,通過設(shè)計的一種基于局部回環(huán)和隨機回環(huán)結(jié)合的方式來進(jìn)行回環(huán)檢測來消除,并構(gòu)建出了三維稠密點云地圖。
本文提出的基于RGB-D相機數(shù)據(jù)的同時定位與地圖構(gòu)建(SLAM)算法的具體框架如圖1所示,主要包括特征提取與匹配、幀間配準(zhǔn)、后端的優(yōu)化和回環(huán)檢測。
圖1 基于RGB-D相機數(shù)據(jù)的SLAM算法的總體框架
在視覺SLAM中,前端又被稱為視覺里程計(VO)。它使用相鄰幀之間的信息來粗略估計攝像機的運動,并把數(shù)據(jù)傳送給后端進(jìn)行圖優(yōu)化處理。前端根據(jù)是否需要提取圖像的特征點,將其分為特征點法和直接法。直接法不需進(jìn)行特征點提取,不用計算描述子和特征點匹配,故節(jié)省了計算量和運算時間。缺點是非凸優(yōu)化易陷入局部極值;且完全依靠梯度搜索,當(dāng)相機出現(xiàn)較大尺度移動或旋轉(zhuǎn)時,會導(dǎo)致追蹤產(chǎn)生的效果不夠理想。而基于特征點法的前端一直以來是主流方式,故本文采用特征點法作為前端。
特征點的提取主要是特征檢測和描述符提取,特征點提取算法有SIFT[12](Scale Invariant Feature Transform)、SURF[13](Speeded Up Robust Features)、FAST[14](Features From Accelerated Segment Test)等。SIFT即尺度不變特征變換算法,計算量較大,實時性不高,且有時特征點較少。FAST特征點檢測速度較快,但不具備方向性。SURF特征具有更好的旋轉(zhuǎn)和尺度變換魯棒性,實時性也相對較好。因此,本文采用基于SURF特征提取特征點。
特征點匹配方法通常使用兩種匹配方式:暴力匹配(Brute Force)和最近鄰近似匹配[15](Fast Library for Approximate Nearest Neighbors)。暴力匹配始終嘗試所有可能的匹配,來找到最佳的匹配,當(dāng)處理的特征點數(shù)量較大時,該方法的運算量增加,運行時間較長,且有較多誤匹配。FLANN算法是查找相對較好的匹配,但不需要找到最佳匹配,從而大大節(jié)省了匹配時間。因此,本文選用FLANN算法。
進(jìn)行特征匹配后,會有大量的誤匹配存在,這時就需要剔除產(chǎn)生的誤匹配,來提高最終匹配的準(zhǔn)確性。本文采用改進(jìn)的最小距離閾值法與RANSAC共同剔除誤匹配的方法[16]。在進(jìn)行RANSAC剔除時,已經(jīng)進(jìn)行過粗剔除,故這里取原來迭代次數(shù)的一半,即迭代50次,RANSAC過程使用的內(nèi)部閾值取5。具體方法如下:首先根據(jù)提取的特征點個數(shù)進(jìn)行判斷,當(dāng)特征點數(shù)目較少時,即圖片所含的場景信息較少,則采用閾值為5的最小距離,當(dāng)特征點數(shù)目較多時,即圖片所含的場景信息較豐富,則采用閾值為3的最小距離。然后再使用RANSAC算法剔除剩下的誤匹配,來得到最優(yōu)的匹配結(jié)果。
利用SURF特征結(jié)合FLANN進(jìn)行特征檢測與匹配的大致流程如下。
①構(gòu)建高斯金字塔尺度空間
SURF算法主要是通過海森矩陣(Hessian matrix)來構(gòu)建高斯金字塔尺度空間,其中海森矩陣是由函數(shù)的二階偏導(dǎo)數(shù)構(gòu)成,記函數(shù)為f(x,y),具體如式(1)所示。海森矩陣的判別式為式(2):
式中:det(H)為H矩陣的特征值。
在SURF算法中,將函數(shù)值f(x,y)替換為圖像像素l(x,y),濾波器使用二階標(biāo)準(zhǔn)高斯函數(shù),再通過特定核間的卷積來計算二階偏導(dǎo)數(shù)。先計算出H矩陣中的3個元素L xx(x,σ)、L x y(x,σ)和L y y(x,σ),從而得出H矩陣,具體公式如下式(3)、式(4)
式中:g(t)為高斯函數(shù),t為高斯方差,L xx(x,σ)是高斯二階導(dǎo)數(shù)與圖像I在X點處的卷積。L xy(x,σ)和L yy(x,σ)則為高斯二階導(dǎo)數(shù)在對應(yīng)xy和y方向上的卷積。
Bay提出使用近似值代替L(x,t),通過引入權(quán)值的方法來使準(zhǔn)確值與近似值達(dá)到平衡。H矩陣的判別式的近似計算為:
式中:det(Happrox)表示在點x鄰近區(qū)域的濾波響應(yīng)值的近似結(jié)果。這里的0.9為經(jīng)驗值。
在計算機視覺領(lǐng)域里,圖像的尺度空間要反復(fù)對輸入圖像與高斯函數(shù)的計算核卷積,并對其進(jìn)行二次抽樣,這被稱為圖像金字塔。SIFT算法的圖像金字塔使用連續(xù)對圖像降采樣建立的結(jié)構(gòu),并不斷利用高斯模板的方式進(jìn)行平滑處理,以達(dá)到濾除圖像的噪聲效果。而SURF算法則主要是維持圖像的原始尺寸不變,對高斯濾波器的大小進(jìn)行變化。SIFT和SURF的圖像金字塔如圖2所示。
圖2 SIFT和SURF的圖像金字塔
②初步檢測特征點
在檢測過程中,濾波器的大小通常為與該尺度層圖像解析度相對應(yīng)。圖3中是以3×3的濾波器為例,該尺度層圖像中9個像素點中一個特征點,與該層其余8個點和其上下兩個尺度層的9個點,總共26個點進(jìn)行比較。若圖3中“X”標(biāo)志的特征值大于周圍像素,則該點即為該區(qū)域的特征點。
圖3 初步檢測特征點
③精準(zhǔn)定位極值點
在定位極值點時,一般采用三維線性插值法得到亞像素級的特征點,并舍去小于預(yù)設(shè)閾值的點。通過增加極值的方式,減少檢測到的特征點數(shù)量,保證只檢測出特征最強的點。
④確定特征點的主方向
在SURF算法中,主要是統(tǒng)計特征點領(lǐng)域內(nèi)的小波特征點的方式,來確定特征點的主方向。即以特征點為中心,半徑為6 s(這里的s為該點所在的尺度)的圓形區(qū)域內(nèi),計算60°扇形內(nèi)在x和y方向的Haar小波特征總和,Haar小波的尺寸變成4 s,該扇形得到了一個值。旋轉(zhuǎn)遍歷整個區(qū)域后,其中最大值的區(qū)域即為特征點的主方向。
圖4 確定特征點的主方向
⑤生成SURF特征描述子
在SURF算法中,以特征點為中心,按照主方向取20 s×20 s的方框,再將該方框分成4×4個的子區(qū)域,然后計算每個子區(qū)域5 s×5 s內(nèi)的Haar小波特征。該Haar小波特征為對dx,d|x|,dy,d|y|求和,記 為。這樣各個小區(qū)域就有4個值,從而得到一個特征點為4×4×4=64維的向量
具體如圖5所示。
圖5 生成SURF特征描述子
⑥通過FLANN對特征描述子進(jìn)行匹配
FLANN算法模型的特征空間通常是n維的向量空間R n,主要是通過歐式距離尋找實例點的鄰居。將兩幀圖像的特征點集合記為:
則兩特征點的歐式距離為:
式中:D x i、D y i為x i、y i的特征向量。向量空間R n中的全部歐式距離d i j,在經(jīng)過KD-TREE結(jié)構(gòu)存儲后,就能夠搜索與參考點最近距離的點進(jìn)行兩點的匹配。
相機通常采用針孔相機模型,來表達(dá)空間點投影到像素坐標(biāo)系的轉(zhuǎn)換關(guān)系。若空間中一點為P(X w,Yw,Z w),投影到像素坐標(biāo)系的點p(x,y),深度值為d,從世界坐標(biāo)系到像素坐標(biāo)系的變換如下:
式中:f x和f y分別為深度相機在水平和豎直方向上的焦距;cx和c y分別為圖像坐標(biāo)系與像素坐標(biāo)系的平移量;s為深度縮放因子。相機的內(nèi)參K則由f x和f y、c x和c y組成,通常會通過標(biāo)定的方法來獲得準(zhǔn)確的數(shù)值,常用的標(biāo)定法有張正友標(biāo)定法等,這里就不詳細(xì)介紹。
通常情況下f x、f y、cx、c y所定義的內(nèi)參矩陣K形式為
當(dāng)相機處于運動狀態(tài)時,空間點P根據(jù)相機的當(dāng)前位姿變換到相機坐標(biāo)系,可表示為:
式中:K是相機的內(nèi)參矩陣,T代表相機的外參數(shù),由相機位姿的R旋轉(zhuǎn)矩陣和t平移矩陣組成,兩幀圖像之間的運動關(guān)系即為外參。變換矩陣T的表示形式為:
式中:左上角為3×3旋轉(zhuǎn)矩陣R,右上角為3×1的位移向量,左下角為0向量,右下角為1。
在幀間配準(zhǔn)階段,需要計算出兩幀圖像間運動的變換矩陣T,SLAM中一般通過PNP(Perspective-N-Point),迭代最近點(Iterative Closest Point)算法等來實現(xiàn)。ICP算法是3D-3D點之間的變換,需要較好的初值,且算法本身的缺陷,容易使迭代陷入局部最優(yōu)解,因此本文選用PNP算法來求解。PNP算法是通過3D-2D點運動的變換來求解,即當(dāng)已知n個3D空間點和它的投影位置時,來估算獲得相機的位姿。OpenCV自帶有PNP函數(shù)接口,使用時只需調(diào)用即可。
在進(jìn)行相鄰兩幀匹配后,通過計算它們之間的運動變化來求解相機位姿,并送入后端優(yōu)化,從而獲得相機位姿和運動軌跡的全局最優(yōu)解,再經(jīng)點云轉(zhuǎn)換拼接后,構(gòu)建出完整的點云地圖。
一個經(jīng)典SLAM模型可由運動方程和觀測方程[17]表示為:
式中:x k為機器人位姿,u k為運動數(shù)據(jù),z k,j為觀測數(shù)據(jù),y j為路標(biāo)點,ωk和v k,j為噪聲。在SLAM里,一般是通過估計x k來描述機器人定位,估計y j來構(gòu)建地圖。
本文使用G2O[18]優(yōu)化算法進(jìn)行位姿圖優(yōu)化,常用的G2O迭代策略有梯度下降法(DogLog)、高斯牛頓法(Gauss-Newton)和列文伯格-馬夸爾特方法(Levenberg-Marquadt)等。對于前端產(chǎn)生的帶有噪聲的數(shù)據(jù),后端的G2O優(yōu)化算法可以把這些數(shù)據(jù)作為優(yōu)化變量來優(yōu)化。在特征匹配后,通過PNP求解估計兩個相鄰關(guān)鍵幀之間的運動以確定初始值并構(gòu)造姿勢節(jié)點的邊。當(dāng)完成初始估計后,就可以不用優(yōu)化路標(biāo)點的位姿,而主要去關(guān)注所有相機的位姿聯(lián)系。這顯著減少了用于計算特征點的優(yōu)化時間,并且僅保存了關(guān)鍵幀的軌跡。其總體目標(biāo)函數(shù)表示如下:
這即是一個非線性優(yōu)化的問題??梢允褂肎2O來優(yōu)化。將待優(yōu)化問題轉(zhuǎn)變?yōu)閳D的模型表示。本文使用Levenberg-Marquadt(L-M)方法進(jìn)行優(yōu)化,當(dāng)誤差穩(wěn)定后算法收斂,同時獲得相機的最優(yōu)位置和姿態(tài)。
前端根據(jù)相鄰或相近兩幀圖像得到位姿估計,若前端出現(xiàn)誤差并送入后端時,后端根據(jù)已有的結(jié)果進(jìn)行優(yōu)化,這樣基于誤差的估計優(yōu)化會增加不確定性,一段時間后會出現(xiàn)累計誤差,最終使得計算的軌跡出現(xiàn)偏離。而回環(huán)檢測[19]的目的是消除累計誤差。
由于圖像幀數(shù)較多,把每一幀進(jìn)行匹配會徒增計算量,從而降低算法實時性,故可通過初步篩選關(guān)鍵幀以降低算法運算時間,詳細(xì)步驟如下:設(shè)關(guān)鍵幀的序列為Qi(i=0,1…,N),并且Q0是第一幀,然后每次獲得新的圖像幀時,它都會計算它與序列Q i中最后一幀之間的運動變換,并計算它們的變換矩陣T i(i=0,1…,N),通過該運動變換與設(shè)定的閾值比較,其關(guān)鍵幀的閾值為0.2,選擇滿足條件的幀作為關(guān)鍵幀,并將該幀映射到Q i中的最后m個關(guān)鍵幀,形成局部回環(huán)。最后,將從Q i中隨機選擇的n個關(guān)鍵幀映射到一個幀,從而構(gòu)成隨機回環(huán)。匹配成功后,將在Q i的末尾放置一個新幀。
經(jīng)過以上步驟便能夠通過提取出的關(guān)鍵幀的位姿構(gòu)建出三維點云圖。到目前為止,視覺SLAM構(gòu)建的地圖共有3種:第一種是稀疏地圖,這種地圖更傾向于定位;第二種是語義地圖,主要是側(cè)重于交互,即人與地圖之間的互動;第三種是稠密地圖,通常用來導(dǎo)航和定位。文中采用稠密地圖來構(gòu)建地圖。
在構(gòu)造點云圖時,每個圖像幀會創(chuàng)建大量點云,并且640×480像素的圖像將創(chuàng)建超過300000個點云,會使得最終點云地圖過大,且會消耗很大的儲存空間[20]。因此本文將其轉(zhuǎn)化為八叉樹地圖(Octo-Map)。其具有內(nèi)存占用小等優(yōu)點。OctoMap是一種三維柵格地圖,其可以調(diào)整體素大小,來改變該地圖的分辨率。這類地圖可以適用于移動機器人的三維路徑規(guī)劃和導(dǎo)航。
本文實驗采用處理器為一臺inter(R)Core(TM)i5-8300H八核CPU@2.30GHz,8G內(nèi)存,ubuntu 16.04操作系統(tǒng)的筆記本電腦。本文實驗采用NYU Depth Dataset V2數(shù)據(jù)集[21]和TUM公開數(shù)據(jù)集[22]進(jìn)行試驗。
通過對相同圖像提取特征點,統(tǒng)計了SIFT算法和SURF算法的特征點個數(shù)、匹配點數(shù)、匹配成功率和運行時間這4個指標(biāo),其中,特征點的個數(shù)反映了算法提取特征點的能力,若提取的特征點數(shù)量越多,則說明圖像細(xì)節(jié)信息越豐富;匹配點數(shù)和匹配成功率表示兩幀圖像匹配的質(zhì)量,數(shù)值越大,匹配效果越好;運行時間即為算法提取特征點的效率。計算圖像處理時的平均耗時,結(jié)果如表1所示。
表1 特征點檢測結(jié)果對比
從表1中可明顯看出,SURF算法的處理速度和提取特征點個數(shù)都要明顯優(yōu)于SIFT算法。圖6中為特征點提取結(jié)果圖。在特征點提取的結(jié)果圖中,特征點由圓圈表示,圓心表示特征點位于圖像中的位置,圓的直徑表示特征的尺度信息,從圓心發(fā)出的直線表示特征點的方向。表2為本文算法和文獻(xiàn)[23]進(jìn)行對比的結(jié)果,可以看出本文算法在運行時間上有很大的提升,且正確的匹配率與之相當(dāng)。圖7為未經(jīng)處理的匹配結(jié)果。其中,cafe總共篩選了707組匹配,fr1/xyz總共篩選了840組匹配,fr1/desk共篩選595組匹配,其中有很多的誤匹配。
圖6 不同的特征點提取算法結(jié)果圖
圖7 未經(jīng)處理的匹配結(jié)果
表2 剔除誤匹配結(jié)果對比
圖8是經(jīng)過本文方法篩選后的匹配結(jié)果。其中,由于fr1/xyz中所含特征點較多,故采用閾值為3的最小匹配距離,所得結(jié)果為圖8(b);圖8(a)和圖8(c)都采用閾值為5。從圖8中可以清楚地看到,本文中的方法可以更好地消除誤匹配,從而大大提高了匹配特征的準(zhǔn)確性。
圖8 本文方法剔除誤匹配后結(jié)果
通過前端(視覺里程計),即未加入后端優(yōu)化和回環(huán)檢測,生成如圖9(a)所示的地圖??梢钥闯觯瑑?yōu)化前的地圖,即通過前端生成的地圖,中間分布有大量散亂的點云,咖啡臺外輪廓較模糊,中間的桌子也未能很好的構(gòu)建出來。圖9(b)為本文方法實現(xiàn)的三維點云地圖重建。從構(gòu)建的三維地圖各個角度可以發(fā)現(xiàn)墻壁,桌子,臺燈,行人等得到了較好的構(gòu)建。經(jīng)過對比優(yōu)化前后的地圖可以看出,優(yōu)化后的地圖相對更加清晰。在生成三維點云地圖后,轉(zhuǎn)化成分辨率為0.05 m的OctoMap格式,如圖10所示。其中,三維點云地圖占用49 Mbyte左右內(nèi)參存,而OctoMap地圖僅使用了23 kbyte左右,大大減少了內(nèi)存占用。
圖9 三維點云地圖
圖10 八叉樹地圖
回環(huán)檢測時,通過增加幀間的約束,來提高算法的魯棒性,從而提升SLAM的軌跡和建圖質(zhì)量。本文算法在選取關(guān)鍵幀后,通過PNP求解估計兩幀間的運動以確定姿勢節(jié)點的邊,并進(jìn)行回環(huán)檢測。表3中最左列里的數(shù)即為關(guān)鍵幀的序列,右邊的7組數(shù)表示相機的位姿,它的記錄方式是平移向量加旋轉(zhuǎn)四元數(shù):[x,y,z,q x,q y,qz,q w],其中x,y,z表示空間中的三個坐標(biāo)軸的位移,q x,q y,q z表示旋轉(zhuǎn)四元數(shù)的虛部,qw為旋轉(zhuǎn)四元數(shù)的實部。
表3 部分關(guān)鍵幀序列與相機位姿
圖11(a)中位姿圖僅考慮相鄰兩幀的聯(lián)系,若某一幀產(chǎn)生誤差將會不可避免的累積至后面的幀,從而造成整個SLAM出現(xiàn)累積誤差,其中共有700張圖像;圖11(b)為添加回環(huán)檢測后的位姿圖,深藍(lán)部分表示為選取的關(guān)鍵幀,其頂點為相機位姿,邊為兩點之間的相對運動估計,即兩點間的位姿變換,其中提取關(guān)鍵幀62張。局部回環(huán)代表當(dāng)前幀與最后的m幀間的映射,大回環(huán)代表當(dāng)前幀和關(guān)鍵幀序列中隨機n幀的映射。本文中m=5,n=5。圖12為回環(huán)檢測時關(guān)鍵幀的部分變換矩陣T。
圖11 位姿圖
圖12 部分變換矩陣
最后,本文使用公開數(shù)據(jù)集fr1/xyz和fr1/desk進(jìn)行測試,通過從運算效率上與文獻(xiàn)[7]所提出的RGB-D SLAM算法進(jìn)行對比,計算出平均處理每幀所需的時間,如表3所示。
從表4中可以看出,本文所提算法處理每幀的時間明顯優(yōu)于RGB-D SLAM算法,說明本文算法的實時性更好。
表4 本文算法與RGB-D SLAM算法對比
文中提出了一種基于RGB-D相機數(shù)據(jù)的實時性的SLAM方案。該算法使用SURF算法提取特征點,使用FLANN算法進(jìn)行特征匹配,結(jié)合最小距離和RANSAC消除誤匹配,提高了算法的實時性和匹配精度;結(jié)合回環(huán)檢測和G2O優(yōu)化算法,來完成對三維地圖的優(yōu)化,并將三維稠密地圖轉(zhuǎn)化為八叉樹地圖用于后續(xù)導(dǎo)航。實驗結(jié)果表明本文算法具有可行性與有效性。未來將繼續(xù)通過改進(jìn)算法來提高算法的實時性和地圖的精確性。