版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、即時定位與地圖構建(SLAM)的相關研究即時定位與地圖構建(SimultaneousLocalization AndMapping)指的是機器人在自身位置不確定的條件下,在完全未知環(huán)境中創(chuàng)建地圖,同時利用地圖進行自主定位和導航。SLAM問題可以描述為:機器人在未知環(huán)境中從一個未知位置開始移動,在移動過程中根據(jù)位置估計和傳感器數(shù)據(jù)進行自身定位,同時建造增量式地圖。(1)定位(localization):機器人必須知道自己在環(huán)境中位置。(2)建圖(mapping):機器人必須記錄環(huán)境中特征的位置(如果知道自己的位置)(3)SLAM:機器人在定位的同時建立環(huán)境地圖。其基本原理是運過概率統(tǒng)計的方法,通
2、過多特征匹配來達到定位和減少定位誤差的。圖 SLAM的基本過程移動機器人自定位與環(huán)境建模問題是緊密相關的。環(huán)境模型的準確性依賴于定位精度,而定位的實現(xiàn)又離不開環(huán)境模型。在未知環(huán)境中,機器人沒有什么參照物,只能依靠自己并不十分準確的傳感器來獲取外界信息,如同一個盲人在一個陌生環(huán)境中摸索的情況。這種情況下,定位是比較困難的。有地圖的定位和有定位的地圖創(chuàng)建都是容易解決的,但無地圖的定位和未解決定位的地圖創(chuàng)建如同"雞-蛋"問題,無從下手。已有的研究中對這類問題的解決方法可分為兩類:一類利用自身攜帶的多種內部傳感器(包括里程儀、羅盤、加速度計等),通過多種傳感信息的融合減少
3、定位的誤差,使用的融合算法多為基于卡爾曼濾波的方法。這類方法由于沒有參考外部信息,在長時間的漫游后誤差的積累會比較大。另一類方法在依靠內部傳感器估計自身運動的同時,使用外部傳感器(如激光測距儀、視覺等)感知環(huán)境,對獲得的信息進行分析提取環(huán)境特征并保存,在下一步通過對環(huán)境特征的比較對自身位置進行校正。但這種方法依賴于能夠取得環(huán)境特征。SLAM的三個基本問題Leonard和Durrant-Whyte將移動機器人完成任務定義為三個問題“Wheream I?”、“Wheream I going?”和“Howdo I getthere”,就是定位、目標識別和路徑規(guī)劃,為了能實現(xiàn)導航,移動機器人需要靠本體
4、感受傳感器和環(huán)境感知傳感器來實現(xiàn)對本體位姿估計和外部環(huán)境位姿的定位。依據(jù)環(huán)境空間的描述方法,Desouza等將視覺導航的方法化為三類:(1)已知地圖的導航(Map-BasedNavigation):表示地圖的方法幾何特征(GeometricPrimitives)、拓撲特征(TopologicalFeatures)或占據(jù)柵格(OccupancyGrids)移動機器人依據(jù)這些已知的環(huán)境地圖進行導航。(2)地圖建立的導航(Map-Building-BasedNavigation):在沒有已知環(huán)境地圖的情況下,移動機器人通過自身的導航運動和傳感器的不斷感知更新來進行導航。(3)未知環(huán)境的導航(Mapl
5、essNavigation):相對于上面兩種方法,在實時的動態(tài)環(huán)境中無法建立明確的地圖表達形式,更多的是通過傳感器獲得的觀測信息用來識別或者跟蹤環(huán)境中的物體來導航。但是由于感知信息的不確定性,移動機器人很難實現(xiàn)定位的準確,因而,在未知環(huán)境中的定位成為最關鍵的問題定位(Wheream I?)是實現(xiàn)自主能力的最基本問題,是為了確定機器人在運行環(huán)境中相對于世界坐標系的位置及其本身的位姿。移動機器人的定位與其它領域研究課題的關系如圖所示:圖 SLAM與各領域關系圖現(xiàn)有的移動機器人自主定位方法主要是局部定位和全局定位。局部是通過測量相對于機器人初始位姿的距離和方向來確定當前的位姿,但隨著時間的
6、累計造成定位的誤差較大,無法精確定位。全局定位則通過測機器人的絕對位置來定位,定位的精度較高,并且可以用來修正局部定位的定位誤差。現(xiàn)在移動機器人定位的方法大致可分為三類(1)相對定位(RelativePositionMeasurements):主要依靠內部本體感受傳感器如里程計(Odometry)、陀螺儀(Gyroscopes)等,通過給定初始位姿,來測量相對于機器人初始位姿的距離和方向來確定當前機器人的位姿,也叫做航跡推測(DeadReckoning, DR)。(2)絕對定位(AbsolutePosition Measurements):主要采用主動或被動標識(Activeor Passiv
7、e Beacons)、地圖匹配(MapMatching)、全球定位系統(tǒng)(GlobalPositioning System,GPS)、或導航信標(LandmarkNavigation)進行定位。位置的計算方法包括有三角測量法(Triangulation)、三邊測量法(Trilateration)和模型匹配算法(ModelMatching)等。(3)組合定位(CombinedPositionMethod):雖然相對定位這種方法能夠根據(jù)運動學模型的自我推算移動機器人的位姿和軌跡而且具有自包含的有點。但是不可避免地會存在隨時間的增加和距離的增加而增加的累積航跡誤差。在絕對定位中,地圖匹配技術處理數(shù)據(jù)速
8、度較慢,而信標或標識牌的建設和維護成本太高,GPS又只能在室外使用。由于單一定位的方法的缺陷,移動機器人定位仍然是基于航跡的推算與絕對位姿和軌跡矯正相結合起來。-我已在Github Pages 上搭建了個人博客,歡迎訪問:http:/xiongxiaoxx.github.io/視覺SLAM漫談(一)1. 前言開始做SLAM(機器人同時定位與建圖)研究已經(jīng)近一年了。從一年級開始對這個方向產(chǎn)生興趣,到現(xiàn)在為止,也算是對這個領域有了大致的了解。然而越了解,越覺得這個方向難度很大。總體來講有以下幾個原因:· 入門資料很少。雖然國內也有不少人在做,
9、但這方面現(xiàn)在沒有太好的入門教程。SLAM for dummies可以算是一篇。中文資料幾乎沒有。· SLAM研究已進行了三十多年,從上世紀的九十年代開始。其中又有若干歷史分枝和爭論,要把握它的走向就很費工夫。· 難以實現(xiàn)。SLAM是一個完整的系統(tǒng),由許多個分支模塊組成。現(xiàn)在經(jīng)典的方案是“圖像前端,優(yōu)化后端,閉環(huán)檢測”的三部曲,很多文獻看完了自己實現(xiàn)不出來。· 自己動手編程需要學習大量的先決知識。首先你要會C和C+,網(wǎng)上很多代碼還用了11標準的C+。第二要會用Linux。第三要會cmake,vim/emacs及一些編程工具。第四要會用openCV, PCL, Eig
10、en等第三方庫。只有學會了這些東西之后,你才能真正上手編一個SLAM系統(tǒng)。如果你要跑實際機器人,還要會ROS。當然,困難多意味著收獲也多,坎坷的道路才能鍛煉人(比如說走著走著才發(fā)現(xiàn)Linux和C+才是我的真愛之類的。)鑒于目前網(wǎng)上關于視覺SLAM的資料極少,我于是想把自己這一年多的經(jīng)驗與大家分享一下。說的不對的地方請大家批評指正。這篇文章關注視覺SLAM,專指用攝像機,Kinect等深度像機來做導航和探索,且主要關心室內部分。到目前為止,室內的視覺SLAM仍處于研究階段,遠未到實際應用的程度。一方面,編寫和使用視覺SLAM需要大量的專業(yè)知識,算法的實時性未達到實用要求;另一方面,視覺SLAM生
11、成的地圖(多數(shù)是點云)還不能用來做機器人的路徑規(guī)劃,需要科研人員進一步的探索和研究。以下,我會介紹SLAM的歷史、理論以及實現(xiàn)的方式,且主要介紹視覺(Kinect)的實現(xiàn)方式。2. SLAM問題SLAM,全稱叫做Simultaneous Localization and Mapping,中文叫做同時定位與建圖。啊不行,這么講下去,這篇文章肯定沒有人讀,所以我們換一個講法。3. 小蘿卜的故事從前,有一個機器人叫“小蘿卜”。它長著一雙烏黑發(fā)亮的大眼睛,叫做Kinect。有一天,它被邪惡的科學家關進了一間空屋
12、子,里面放滿了雜七雜八的東西。 小蘿卜感到很害怕,因為這個地方他從來沒來過,一點兒也不了解。讓他感到害怕的主要是三個問題:1. 自己在哪里?2. 這是什么地方?3. 怎么離開這個地方?在SLAM理論中,第一個問題稱為定位 (L
13、ocalization),第二個稱為建圖 (Mapping),第三個則是隨后的路徑規(guī)劃。我們希望借助Kinect工具,幫小蘿卜解決這個難題。各位同學有什么思路呢?4. Kinect數(shù)據(jù)要打敗敵人,首先要了解你的武器。不錯,我們先介紹一下Kinect。眾所周知這是一款深度相機,你或許還聽說過別的牌子,但Kinect的價格便宜,測量范圍在3m-12m之間,精度約3cm,較適合于小蘿卜這樣的室內機器人。它采到的圖像是這個樣子的(從左往右依次為rgb圖,深度圖與點云圖): Kinect的一大優(yōu)勢在于能比較廉價地獲得每個像素的深度值,不管
14、是從時間上還是從經(jīng)濟上來說。OK,有了這些信息,小蘿卜事實上可以知道它采集到的圖片中,每一個點的3d位置。只要我們事先標定了Kinect,或者采用出廠的標定值。我們把坐標系設成這個樣子,這也是OpenCV中采用的默認坐標系。 o-uv是圖片坐標系,o-xyz是Kinect的坐標系。假設圖片中的點為(u,v),對應的三維點位置在(x,y,z),那么它們之間的轉換關系是這樣的: 或者更簡單的: 后一個公式給出了計算三維點的方法。先從深度圖中讀取深度數(shù)據(jù)(Kinect給的是16位無符號整數(shù)),除掉z方向的縮放因子,這樣你就把一個整數(shù)變到了以米為單位的數(shù)據(jù)。然后,x,y用
15、上面的公式算出。一點都不難,就是一個中心點位置和一個焦距而已。f代表焦距,c代表中心。如果你沒有自己標定你的Kinect,也可以采用默認的值:s=5000, cx = 320, cy=240, fx=fy=525。實際值會有一點偏差,但不會太大。5. 定位問題知道了Kinect中每個點的位置后,接下來我們要做的,就是根據(jù)兩幀圖像間的差別計算小蘿卜的位移。比如下面兩張圖,后一張是在前一張之后1秒采集到的: 你肯定可以看出,小蘿卜往右轉過了一定的角度。但究竟轉過多少度呢?這就要靠計算機來求解了。這個問題稱為相機相對姿態(tài)
16、估計,經(jīng)典的算法是ICP(Iterative Closest Point,迭代最近點)。這個算法要求知道這兩個圖像間的一組匹配點,說的通俗點,就是左邊圖像哪些點和右邊是一樣的。你當然看見那塊黑白相間的板子同時出現(xiàn)在兩張圖像中。在小蘿卜看來,這里牽涉到兩個簡單的問題:特征點的提取和匹配。如果你熟悉計算機視覺,那你應該聽說過SIFT, SURF之類的特征。不錯,要解決定位問題,首先要得到兩張圖像的一個匹配。匹配的基礎是圖像的特征,下圖就是SIFT提取的關鍵點與匹配結果: 對實現(xiàn)代碼感興趣的同學請Google“OpenCV 匹配”即可,在opencv的教程上也有很明白
17、的例子。上面的例子可以看出,我們找到了一些匹配,但其中有些是對的(基本平等的匹配線),有些是錯的。這是由于圖像中存在周期性出現(xiàn)的紋理(黑白塊),所以容易搞錯。但這并不是問題,在接下來的處理中我們會將這些影響消去。得到了一組匹配點后,我們就可以計算兩個圖像間的轉換關系,也叫PnP問題。它的模型是這樣的: R為相機的姿態(tài),C為相機的標定矩陣。R是不斷運動的,而C則是隨著相機做死的。ICP的模型稍有不同,但原理上也是計算相機的姿態(tài)矩陣。原則上,只要有四組匹配點,就可以算這個矩陣。你可以調用openCV的SolvePnPRANSAC函數(shù)或者PCL的ICP算法來求解。openCV提供的算法是R
18、ANSAC(Random Sample Consensus,隨機采樣一致性)架構,可以剔除錯誤匹配。所以代碼實際運行時,可以很好地找到匹配點。以下是一個結果的示例。 上面兩張圖轉過了16.63度,位移幾乎沒有。有同學會說,那只要不斷匹配下去,定位問題不就解決了嗎?表面上看來,的確是這樣的,只要我們引入一個關鍵幀的結構(發(fā)現(xiàn)位移超過一個固定值時,定義成一個關鍵幀)。然后,把新的圖像與關鍵幀比較就行了。至于建圖,就是把這些關鍵幀的點云拼起來,看著還有模有樣,煞有介事的: 1200幀的匹配結果然而,如果事情真這么簡單,SLAM理論就不用那么多人研究三十多年了(它是從上世紀90年代
19、開始研究的)(上面講的那些東西簡直隨便哪里找個小碩士就能做出來)。那么,問題難在什么地方呢?6. SLAM端優(yōu)化理論最麻煩的問題,就是“噪聲”。這種漸近式的匹配方式,和那些慣性測量設備一樣,存在著累積噪聲。因為我們在不斷地更新關鍵幀,把新圖像與最近的關鍵幀比較,從而獲得機器人的位移信息。但是你要想到,如果有一個關鍵幀出現(xiàn)了偏移,那么剩下的位移估計都會多出一個誤差。這個誤差還會累積,因為后面的估計都基于前面的機器人位置哇!這后果簡直不堪設想?。ɡ?,你的機器人往右轉了30度,再往左轉了30度回到原來的位置。然而由于誤差,你算成了向右轉29度,再向左轉
20、31度,這樣你構建的地圖中,會出現(xiàn)初始位置的兩個“重影”)。我們能不能想辦法消除這個該死的誤差呢?朋友們,這才是SLAM的研究,前面的可以說是“圖像前端”的處理方法。我們的解決思路是:如果你和最近的關鍵幀相比,會導致累計誤差。那么,我們最好是和更前面的關鍵幀相比,而且多比較幾個幀,不要只比較一次。我們用數(shù)學來描述這個問題。設: 不要怕,只有借助數(shù)學才能把這個問題講清楚。上面的公式中,xp是機器人小蘿卜的位置,我們假定由n個幀組成。xL則是路標,在我們的圖像處理過程中就是指SIFT提出來的關鍵點。如果你做2D SLAM,那么機器人位置就是x, y加一個轉角theta。如果是3D SLA
21、M,就是x,y,z加一個四元數(shù)姿態(tài)(或者rpy姿態(tài))。這個過程叫做參數(shù)化(Parameterization)。不管你用哪種參數(shù),后面兩個方程你都需要知道。前一個叫運動方程,描述機器人怎樣運動。u是機器人的輸入,w是噪聲。這個方程最簡單的形式,就是你能通過什么方式(碼盤等)獲得兩幀間的位移差,那么這個方程就直接是上一幀與u相加即得。另外,你也可以完全不用慣性測量設備,這樣我們就只依靠圖像設備來估計,這也是可以的。后一個方程叫觀測方程,描述那些路標是怎么來的。你在第i幀看到了第j個路標,產(chǎn)生了一個測量值,就是圖像中的橫縱坐標。最后一項是噪聲。偷偷告訴你,這個方程形式上和上一頁的那個方程是一模一樣的
22、。在求解SLAM問題前,我們要看到,我們擁有的數(shù)據(jù)是什么?在上面的模型里,我們知道的是運動信息u以及觀測z。用示意圖表示出來是這樣的: 我們要求解的,就是根據(jù)這些u和z,確定所有的xp和xL。這就是SLAM問題的理論。從SLAM誕生開始科學家們就一直在解決這個問題。最初,我們用Kalman濾波器,所以上面的模型(運動方程和觀測方程)被建成這個樣子。直到21世紀初,卡爾曼濾波器仍在SLAM系統(tǒng)占據(jù)最主要的地位,Davison經(jīng)典的單目SLAM就是用EKF做的。但是后來,出現(xiàn)了基于圖優(yōu)化的SLAM方法,漸漸有取而代之的地位1。我們在這里不介紹卡爾曼濾波器,有興趣的同學可以在wiki上找卡
23、爾曼濾波器,另有一篇中文的卡爾曼濾波器介紹也很棒。由于濾波器方法存儲n個路標要消耗n平方的空間,在計算量上有點對不住大家。盡管08年有人提出分治法的濾波器能把復雜度弄到O(n) 2,但實現(xiàn)手段比較復雜。我們要介紹那種新興的方法: Graph-based SLAM。圖優(yōu)化方法把SLAM問題做成了一個優(yōu)化問題。學過運籌學的同學應該明白,優(yōu)化問題對我們有多么重要。我們不是要求解機器人的位置和路標位置嗎?我們可以先做一個猜測,猜想它們大概在什么地方。這其實是不難的。然后呢,將猜測值與運動模型觀測模型給出的值相比較,可以算出誤差: 通俗一點地講,例如,我猜機器人第一幀在(0,0,0),第二幀在
24、(0,0,1)。但是u1告訴我機器人往z方向(前方)走了0.9米,那么運動方程就出現(xiàn)了0.1m的誤差。同時,第一幀中機器人發(fā)現(xiàn)了路標1,它在該機器人圖像的正中間;第二幀卻發(fā)現(xiàn)它在中間偏右的位置。這時我們猜測機器人只是往前走,也是存在誤差的。至于這個誤差是多少,可以根據(jù)觀測方程算出來。我們得到了一堆誤差,把這些誤差平方后加起來(因為單純的誤差有正有負,然而平方誤差可以改成其他的范數(shù),只是平方更常用),就得到了平方誤差和。我們把這個和記作phi,就是我們優(yōu)化問題的目標函數(shù)。而優(yōu)化變量就是那些個xp, xL。 改變優(yōu)化變量,誤差平方和(目標函數(shù))就會相應地變大或變小,我們可以用數(shù)值方法求它
25、們的梯度和二階梯度矩陣,然后用梯度下降法求最優(yōu)值。這些東西學過優(yōu)化的同學都懂的。 注意到,一次機器人SLAM過程中,往往會有成千上萬幀。而每一幀我們都有幾百個關鍵點,一乘就是幾百萬個優(yōu)化變量。這個規(guī)模的優(yōu)化問題放到小蘿卜的機載小破本上可解嗎?是的,過去的同學都以為,Graph-based SLAM是無法計算的。但就在21世紀06,07年后,有些同學發(fā)現(xiàn)了,這個問題規(guī)模沒有想象的那么大。上面的J和H兩個矩陣是“稀疏矩陣”,于是呢,我們可以用稀疏代數(shù)的方法來解這個問題?!跋∈琛钡脑颍谟诿恳粋€路標,往往不可能出現(xiàn)在所有運動過程中,通常只出現(xiàn)在一小部分圖像里。正是這個稀疏性,使得優(yōu)化思路
26、成為了現(xiàn)實。優(yōu)化方法利用了所有可以用到的信息(稱為full-SLAM, global SLAM),其精確度要比我們一開始講的幀間匹配高很多。當然計算量也要高一些。由于優(yōu)化的稀疏性,人們喜歡用“圖”來表達這個問題。所謂圖,就是由節(jié)點和邊組成的東西。我寫成G=V,E,大家就明白了。V是優(yōu)化變量節(jié)點,E表示運動/觀測方程的約束。什么,更糊涂了嗎?那我就上一張圖,來自3。 圖有點模糊,而且數(shù)學符號和我用的不太一樣,我用它來給大家一個圖優(yōu)化的直觀形象。上圖中,p是機器人位置,l是路標,z是觀測,t是位移。其中呢,p, l是優(yōu)化變量,而z,t是優(yōu)化的約束??雌饋硎遣皇窍褚恍椈蛇B接了一些質點呢?
27、因為每個路標不可能出現(xiàn)在每一幀中,所以這個圖是蠻稀疏的。不過,“圖”優(yōu)化只是優(yōu)化問題的一個表達形式,并不影響優(yōu)化的含義。實際解起來時還是要用數(shù)值法找梯度的。這種思路在計算機視覺里,也叫做Bundle Adjustment。它的具體方法請參見一篇經(jīng)典文章4。不過,BA的實現(xiàn)方法太復雜,不太建議同學們拿C來寫。好在2010年的ICRA上,其他的同學們提供了一個通用的開發(fā)包:g2o 5。它是有圖優(yōu)化通用求解器,很好用,我改天再詳細介紹這個軟件包。總之,我們只要把觀測和運動信息丟到求解器里就行。這個優(yōu)化器會為我們求出機器人的軌跡和路標位置。如下圖,紅點是路標,藍色箭頭是機器人的位置和轉角(2D SLA
28、M)。細心的同學會發(fā)現(xiàn)它往右偏轉了一些。: 7. 閉環(huán)檢測上面提到,僅用幀間匹配最大的問題在于誤差累積,圖優(yōu)化的方法可以有效地減少累計誤差。然而,如果把所有測量都丟進g2o,計算量還是有點兒大的。根據(jù)我自己測試,約10000多條邊,g2o跑起來就有些吃力了。這樣,就有同學說,能把這個圖構造地簡潔一些嗎?我們用不著所有的信息,只需要把有用的拿出來就行了。事實上,小蘿卜在探索房間時,經(jīng)常會左轉一下,右轉一下。如果在某個時刻他回到了以前去過的地方,我們就直接與那時候采集的關鍵幀做比較,可以嗎?我們說,可以,而且那是最好的方法。這個問
29、題叫做閉環(huán)檢測。閉環(huán)檢測是說,新來一張圖像時,如何判斷它以前是否在圖像序列中出現(xiàn)過?有兩種思路:一是根據(jù)我們估計的機器人位置,看是否與以前某個位置鄰近;二是根據(jù)圖像的外觀,看它是否和以前關鍵幀相似。目前主流方法是后一種,因為很多科學家認為前一種依靠有噪聲的位置來減少位置的噪聲,有點循環(huán)論證的意思。后一種方法呢,本質上是個模式識別問題(非監(jiān)督聚類,分類),常用的是Bag-of-Words (BOW)。但是BOW需要事先對字典進行訓練,因此SLAM研究者仍在探討有沒有更合適的方法。在Kinect SLAM經(jīng)典大作中6,作者采用了比較簡單的閉環(huán)方法:在前面n個關鍵幀中隨機采k個,與當前幀兩兩匹配。匹
30、配上后認為出現(xiàn)閉環(huán)。這個真是相當?shù)暮唵螌嵱?,效率也過得去。高效的閉環(huán)檢測是SLAM精確求解的基礎。這方面還有很多工作可以做。8. 小結本文我們介紹了SLAM的基本概念,重點介紹了圖優(yōu)化解決SLAM問題的思路。我最近正在編寫SLAM程序,它是一個Linux下基于cmake的工程。目前仍在開發(fā)當中。歡迎感興趣的同學來交流研究心得,我的郵件是:gaoxiang12。參考文獻1 Visual SLAM: Why filter? Strasdat et. al., Image and Vision Computing, 2012.2 Divide and C
31、onquer: EKF SLAM in O(n), Paz Lina M et al., IEEE Transaction on Robotics, 20083 Relative bundle adjustment, Sibley, Gabe, 20094 Bundle adjustment - a Modern Synthesis. Triggs B et. el., Springer, 20005 g2o: A General Framework for Graph Optimization, Kummerle Rainer, et. al., ICRA, 20116 3-D Mappin
32、g with an RGB-D Camera, IEEE Transaction on Robotics, Endres et al., 2014視覺SLAM漫談(二):圖優(yōu)化理論與g2o的使用1 前言以及回顧 各位朋友,自從上一篇視覺SLAM漫談寫成以來已經(jīng)有一段時間了。我收到幾位熱心讀者的郵件。有的希望我介紹一下當前視覺SLAM程序的實用程度,更多的人希望了解一下前文提到的g2o優(yōu)化庫。因此我另寫一篇小文章來專門介紹這個新玩意。 在開始本篇文章正文以前,我們先來回顧一下圖優(yōu)化SLAM問題的提法。至于SLAM更基礎的內容,例如SLAM是
33、什么東西等等,請參見上一篇文章。我們直接進入較深層次的討論。首先,關于我們要做的事情,你可以這樣想: l 已知的東西:傳感器數(shù)據(jù)(圖像,點云,慣性測量設備等)。我們的傳感器主要是一個Kinect,因此數(shù)據(jù)就是一個視頻序列,說的再詳細點就是一個RGB位圖序列與一個深度圖序列。至于慣性測量設備,可以有也可以沒有。 l 待求的東西:機器人的運動軌跡,地圖的描述。運動軌跡,畫出來應該就像是一條路徑。而地圖的描述,通常是點云的描述。但是點云描述是否可用于導航、規(guī)劃等后續(xù)問題,還有待研究。 這兩個點之間還是有挺長的路要走的。如果
34、我們使用圖優(yōu)化,往往會在整個視頻序列中,定義若干個關鍵幀: 這個圖著實畫的有點丑,請大家不要吐槽不管怎么說,它表達出我想表達的意思。在這張圖中,我們有一個路標點(五角星),并在各個關鍵幀中都看到了這個點。于是,我們就能用PnP或ICP求解相鄰關鍵點的運動方向。這些在上篇文章都介紹過了,包括特征選擇,匹配及計算等等。那么,這個過程中有什么問題呢?2 為什么要用全局優(yōu)化你一定已經(jīng)注意到,理想的計算總和實際有差距的。好比說理想的科研就是“看論文產(chǎn)生想法做實驗發(fā)文章”,那么現(xiàn)實的科研就是“看論文產(chǎn)生想法做實驗發(fā)現(xiàn)該想法在二十年前就有人做過了”,這樣一個過程
35、。實際當中,僅通過幀間運動(ego-motion)來計算機器人軌跡是遠遠不夠的。如下圖所示:如果你只用幀間匹配,那么每一幀的誤差將對后面所有的運動軌跡都要產(chǎn)生影響。例如第二幀往右偏了0.1,那么后面第三、四、五幀都要往右偏0.1,還要加上它們自己的估算誤差。所以結果就是:當程序跑上十幾秒之后早就不知道飛到哪兒去了。這是經(jīng)典的SLAM現(xiàn)象,在EKF實現(xiàn)中,也會發(fā)現(xiàn),當機器人不斷運動時,不確定性會不斷增長。當然不是我們所希望的結果。那么怎么辦才好呢?想象你到了一個陌生的城市,安全地走出了火車站,并在附近游蕩了一會兒。當你走的越遠,看到許多未知的建筑。你就越搞不清楚自己在什么地方。如果是你,你會怎么
36、辦?通常的做法是認準一個標志性建筑物,在它周圍轉上幾圈,弄清楚附近的環(huán)境。然后再一點點兒擴大我們走過的范圍。在這個過程中,我們會時?;氐街耙呀?jīng)見過的場景,因此對它周圍的景象就會很熟悉。機器人的情形也差不多,除了大多數(shù)時候是人在遙控它行走。因而我們希望,機器人不要僅和它上一個幀進行比較,而是和更多先前的幀比較,找出其中的相似之處。這就是所謂的回環(huán)檢測(Loop closure detection)。用下面的示意圖來說明:沒有回環(huán)時,由于誤差對后續(xù)幀產(chǎn)生影響,機器人路徑估計很不穩(wěn)定。加上一些局部回環(huán),幾個相鄰幀就多了一些約束,因而誤差就減少了。你可以把它看成一個由彈簧連起來的鏈條(質點-彈簧模型
37、)。當機器人經(jīng)過若干時間,回到最初地方時,檢測出了大回環(huán)時,整個環(huán)內的結構都會變得穩(wěn)定很多。我們就可以籍此知道一個房間是方的還是圓的,面前這堵墻對應著以前哪一堵墻,等等。相信講到這里,大家對回環(huán)檢測都有了一個感性的認識。那么,這件事情具體是怎么建模,怎么計算,怎么編程呢?下面我們就一步步來介紹。3 圖優(yōu)化的數(shù)學模型SLAM問題的優(yōu)化模型可以有幾種不同的建模方式。我們挑選其中較簡單的一種進行介紹,即FrameSLAM,在2008年提出。它的特點是只用位姿約束而不用特征約束,減少了很多計算量,表達起來也比較直觀。下面我們給出一種6自由度的3D SLAM建模方法。
38、符號:注意到這里的建模與前文有所不同,是一個簡化版的模型。因為我們假設幀間匹配時得到了相鄰幀的變換矩陣,而不是把所有特征也放到優(yōu)化問題里面來。所以這個模型看上去相對簡單。但是它很實用,因為不用引入特征,所以結點和邊的數(shù)量大大減少,要知道在圖像里提特征動輒成百上千的。4 g2o是什么g2o,就是對上述問題的一個求解器。它原理上是一個通用的求解器,并不限定于某些SLAM問題。你可以用它來求SLAM,也可以用ICP, PnP以及其他你能想到的可以用圖來表達的優(yōu)化問題。它的代碼很規(guī)范,就是有一個缺點:文檔太少。唯一的說明文檔還有點太裝叉(個人感覺)了,有點擺弄作者數(shù)學水平的意
39、思,反正那篇文檔很難懂就是了。話說程序文檔不應該是告訴我怎么用才對么言歸正傳。如果你想用g2o,請去它的github上面下載:它的API在:/stable/api/slam/g2o/classg2o_1_1HyperGraph.html4.1 安裝g2o是一個用cmake管理的C+工程,我是用Linux編譯的,所以不要問我怎么在win下面用g2o,因為我也不會不管怎么說,你下載了它的zip包或者用Git拷下來之后,里面有一個README文件。告訴你它的依賴項。在ubuntu下,直接鍵入命令:s
40、udo apt-get install cmake libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-qt4-dev我個人感覺還要 libcsparse-dev和freeglut3這兩個庫,反正多裝了也無所謂。注意libqglviewer-qt4-dev只在ubuntu 12.04庫里有,14.04 里換成另一個庫了。g2o的可視化工具g2o_viewer是依賴這個庫的,所以,如果你在14.04下面編,要么是去把12.04那個deb(以及它的依賴項)找出來裝好,要么用ccmake,把build apps一項給去
41、掉,這樣就不編譯這個工具了。否則編譯過不去。解開zip后,新建一個build文件夾,然后就是:cmake .makesudo make install這樣g2o就裝到了你的/usr/local/lib和/usr/local/include下面。你可以到這兩個地方去看它的庫文件與頭文件。4.2 學習g2o的使用因為g2o的文檔真的很裝叉(不能忍),所以建議你直接看它的源代碼,耐心看,應該比文檔好懂些。它的example文檔夾下有一些示例代碼,其中有一個tutorial_slam2d文件夾下有2d slam仿真的一個程序。值得仔細閱讀。使用g2o來實
42、現(xiàn)圖優(yōu)化還是比較容易的。它幫你把節(jié)點和邊的類型都定義好了,基本上只需使用它內置的類型而不需自己重新定義。要構造一個圖,要做以下幾件事:l 定義一個SparseOptimizer. 編寫方式參見tutorial_slam2d的聲明方式。你還要寫明它使用的算法。通常是Gauss-Newton或LM算法。個人覺得后者更好一些。l 定義你要用到的邊、節(jié)點的類型。例如我們實現(xiàn)一個3D SLAM。那么就要看它的g2o/types/slam3d下面的頭文件。節(jié)點頭文件都以vertex_開頭,而邊則以edge_開頭。在我們上面的模型中,可以選擇vertex_se
43、3作為節(jié)點,edge_se3作為邊。這兩個類型的節(jié)點和邊的數(shù)據(jù)都可以直接來自于Eigen:Isometry,即上面講到過的變換矩陣T。l 編寫一個幀間匹配程序,通過兩張圖像算出變換矩陣。這個用OpenCV, pcl都可以做。l 把你得到的關鍵幀作為節(jié)點,變換矩陣作為邊,加入到optimizer中。同時設定節(jié)點的估計值(如果沒有慣性測量就設成零)與邊的約束(變換矩陣)。此外,每條邊還需設定一個信息矩陣(協(xié)方差矩陣之逆)作為不確定性的度量。例如你覺得幀間匹配精度在0.1m,那么把信息矩陣設成100的對角陣即可。l 在程序運行過
44、程中不斷作幀間檢測,維護你的圖。l 程序結束時調用optimizer.optimize( steps )進行優(yōu)化。優(yōu)化完畢后讀取每個節(jié)點的估計值,此時就是優(yōu)化后的機器人軌跡。代碼這種東西展開來說會變得像字典一樣枯燥,所以具體的東西需要大家自己去看,自己去體會。這里有我自己寫的一個程序,可以供大家參考。不過這個程序需要帶著數(shù)據(jù)集才能跑,學習g2o的同學只需參考里面代碼的寫法即可:5 效果最近我跑了幾個公開數(shù)據(jù)集(http:/vision.in.tum.de/data/datasets/rgbd-dataset)上的例子(fr1_desk, fr2
45、_slam)(,感覺效果還不錯。有些數(shù)據(jù)集還是挺難的。最后一張圖是g2o_viewer,可以看到那些關鍵路徑點與邊的樣子。 視覺SLAM漫談 (三): 研究點介紹1.前言讀者朋友們大家好?。ê芫煤芫茫┲埃覀?yōu)榇蠹医榻B了SLAM的基本概念和方法。相信大家對SLAM,應該有了基本的認識。在忙完一堆寫論文、博士開題的事情之后,我準備回來繼續(xù)填坑:為大家介紹SLAM研究的方方面面。如果前兩篇文章算是"初識",接下來幾篇就是"漸入佳境"了。在第三篇中,我們要談談SLAM中的各個研究點,為研究生們(應該是博客的多數(shù)讀者吧)作一個提綱挈領的摘要。然后,我
46、們再就各個小問題,講講經(jīng)典的算法與分類。我有耐心講,你是否有耐心聽呢?在SLAM for Dummy中,有一句話說的好:"SLAM并不是一種算法,而是一個概念。(SLAM is more like a concept than a single algorithm.)"所以,你可以和導師、師兄弟(以及師妹,如果有的話)說你在研究SLAM,但是,作為同行,我可能更關心:你在研究SLAM中的哪一個問題。有些研究者專注于實現(xiàn)一個具體的SLAM系統(tǒng),而更多的人則是在研究SLAM里某些方法的改進。做應用和做理論的人往往彼此看不起,不過二者對科研都是有貢獻的。作為研究生,我還是建議各位
47、抓住SLAM中一個小問題,看看能否對現(xiàn)有的算法進行改進或者比較。不要覺得這種事情膚淺,它是對研究有實際幫助和意義的。同時,我也有一些朋友,做了一個基于濾波器/圖優(yōu)化的SLAM實現(xiàn)。程序是跑起來了,但他/她不知道自己有哪些貢獻,鉆研了哪個問題,寫論文的時候就很頭疼。所以,作為研究生,我建議你選擇SLAM中的一個問題,改進其中的算法,而不是先找一堆程序跑起來再說。那么問題來了:SLAM方面究竟有哪些可以研究的地方呢?我為大家上一個腦圖。這個圖是從我筆記本上拍下來的(請勿吐槽字和對焦)??梢钥吹剑許LAM為中心,有五個圈連接到它。我稱它為Basic Theory(基礎理論)、Sensor(傳感器)
48、、Mapping(建圖)、Loop Detection(回環(huán)檢測)、Advanced Topic(高級問題)。這可以說是SLAM的研究方向。下面我們"花開五朵,各表一枝"。2.基本理論SLAM的基本理論,是指它的數(shù)學建模。也就是你如何用數(shù)學模型來表達這個問題。為什么說它"基本"呢?因為數(shù)學模型影響著整個系統(tǒng)的性能,決定了其他問題的處理方法。在早先的研究中(86年提出1至21世紀前期2),是使用卡爾曼濾波器的數(shù)學模型的。那里的機器人,就是一個位姿的時間序列;而地圖,就是一堆路標點的集合。什么是路標點的集合?就是用(x,y,z)表示每一個路標,然后在濾波器更
49、新的過程中,讓這三個數(shù)慢慢收斂。那么,請問這樣的模型好不好?好處是可以直接套用濾波器的求解方法。卡爾曼濾波器是很成熟的理論,比較靠譜。缺點呢?首先,濾波器有什么缺點,基于它的SLAM就有什么缺點。所以EKF的線性化假設啊,必須存儲協(xié)方差矩陣帶來的資源消耗啊,都成了缺點(之后的文章里會介紹)。然后呢,最直觀的就是,用(x,y,z)表示路標?萬一路標變了怎么辦?平時我們不就把屋里的桌子椅子挪來挪去的嗎?那時候濾波器就掛了。所以啊,它也不適用于動態(tài)的場合。這種局限性就是數(shù)學模型本身帶來的,和其他的算法無關。如果你希望在動態(tài)環(huán)境中跑SLAM,就要使用其他模型或改進現(xiàn)有的模型了。SLAM的基本理論,向來
50、分為濾波器和優(yōu)化方法兩類。濾波器有擴展卡爾曼濾波(EKF)、粒子濾波(PF),F(xiàn)astSLAM等,較早出現(xiàn)。而優(yōu)化方向用姿態(tài)圖(Pose Graph),其思想在先前的文章中介紹過。近年來用優(yōu)化的逐漸增多,而濾波器方面則在13年出現(xiàn)了基于Random Finite Set的方法3,也是一個新興的浪潮4。關于這些方法的詳細內容,我們在今后的文章中再進行討論。作為SLAM的研究人員,應該對各種基本理論以及優(yōu)缺點有一個大致的了解,盡管它們的實現(xiàn)可能非常復雜。3.傳感器傳感器是機器人感知世界的方式。傳感器的選擇和安裝方式,決定了觀測方程的具體形式,也在很大程度上影響著SLAM問題的難度。早期的SLAM多
51、使用激光傳感器(Laser Range Finder),而現(xiàn)在則多使用視覺相機、深度相機、聲吶(水下)以及傳感器融合。我覺得該方向可供研究點有如下幾個:· 如何使用新興傳感器進行SLAM。 要知道傳感器在不斷發(fā)展,總有新式的東西會出來,所以這方面研究肯定不會斷。· 不同的安裝方式對SLAM的影響。 舉例來說,比如相機,頂視(看天花板)和下視(看地板)的SLAM問題要比平視容易很多。為什么容易呢?因為頂/下視的數(shù)據(jù)非常穩(wěn)定,不像平視,要受各種東西的干擾。當然,你也可以研究其他的安裝方式
52、。· 改進傳統(tǒng)傳感器的數(shù)據(jù)處理。 這部分就有些困難了,因為經(jīng)常傳感器已經(jīng)有很多人在使用,你做的改進,未必比現(xiàn)有的成熟方法更好。4.建圖建圖,顧名思議,就是如何畫地圖唄。其實,如果知道了機器人的真實軌跡,畫地圖是很簡單的一件事。不過,地圖的具體形式也是研究點之一。比如說常見的有以下幾種:· 路標地圖。 地圖由一堆路標點組成。EKF中的地圖就是這樣的。但是,也有人說,這真的是地圖嗎(這些零零碎碎的點都是什
53、么啊喂)?所以路標圖盡管很方便,但多數(shù)人對這種地圖是不滿意的,至少看上去不像個地圖啊。于是就有了密集型地圖(Dense map)。· 度量地圖(Metric map) 通常指2D/3D的網(wǎng)格地圖,也就是大家經(jīng)常見的那種黑白的/點云式地圖。點云地圖比較酷炫,很有種高科技的感覺。它的優(yōu)點是精度比較高,比如2D地圖可以用0-1表示某個點是否可通過,對導航很有用。缺點是相當吃存儲空間,特別是3D,把所有空間點都存起來了,然而大多數(shù)角角落落里的點除了好看之外都沒什么意義· 拓撲地圖(Topological map)
54、 拓撲地圖是比度量地圖更緊湊的一種地圖。它將地圖抽象為圖論中的"點"和"邊",使之更符合人類的思維。比如說我要去五道口,不知道路,去問別人。那人肯定不會說,你先往前走621米,向左拐94.2度,再走1035米(這是瘋子吧)。正常人肯定會說,往前走到第二個十字路口,左拐,走到下一個紅綠燈,等等。這就是拓撲地圖。· 混合地圖。 既然有人要分類,就肯定有人想把各類的好處揉到一起。這個就不多說了吧。5.
55、回環(huán)檢測回環(huán)檢測,又稱閉環(huán)檢測(Loop closure detection),是指機器人識別曾到達場景的能力。如果檢測成功,可以顯著地減小累積誤差?;丨h(huán)檢測目前多采用詞袋模型(Bag-of-Word),研究計算機視覺的同學肯定不會陌生。它實質上是一個檢測觀測數(shù)據(jù)相似性的問題。在詞袋模型中,我們提取每張圖像中的特征,把它們的特征向量(descriptor)進行聚類,建立類別數(shù)據(jù)庫。比如說,眼睛、鼻子、耳朵、嘴等等(實際當中沒那么高級,基本上是一些邊緣和角)。假設有10000個類吧。然后,對于每一個圖像,可以分析它含有數(shù)據(jù)庫中哪幾個類。以1表示有,以0表示沒有。那么,這個圖像就可用10000維的一個向量來表達。而不同的圖像,只要比較它們的向量即可?;丨h(huán)檢測也可以建成一個模型識別問題,所以你也可以使用各種機器學習的方法來做,比如什么決策樹/SVM,也可以
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度物流配送外包員工勞動合同標準
- 二零二五年度肉類食品行業(yè)標準化制定合作合同3篇
- 《區(qū)域中國分區(qū)》課件
- 《下冊求平均數(shù)》課件
- 《上市公司股值分析》課件
- 《景觀規(guī)劃設計》課件-景觀設計原則解析
- 適老化閱讀項目的評估與反饋
- 企業(yè)績效的定義與評價標準
- 勞動法與企業(yè)人力資源管理方案
- 《預防焊接觸電》課件
- 項目獎金分配獎勵制度和方案完整版
- 上海中學國際部幼升小面試真題
- 贏在團隊執(zhí)行力課件
- 慢性胰腺炎課件
- 北京理工大學應用光學課件第四章
- 陰道鏡幻燈課件
- PCB行業(yè)安全生產(chǎn)常見隱患及防范措施課件
- DB32∕T 186-2015 建筑消防設施檢測技術規(guī)程
- 2022年福建泉州中考英語真題【含答案】
- 汽車座椅骨架的焊接夾具畢業(yè)設計說明書(共23頁)
- 露天礦山職業(yè)危害預先危險分析表
評論
0/150
提交評論