引言:視覺SLAM 是指用相機解決定位和建圖問題。本文以一個小機器人爲例形象地介紹了視覺SLAM的功能及特色。
本文選自《視覺SLAM十四講:從理論到實踐》。算法
SLAM 是Simultaneous Localization and Mapping 的縮寫,中文譯做「同時定位與地圖構建」。它是指搭載特定傳感器的主體,在沒有環境先驗信息的狀況下,於運動過程當中創建環境的模型,同時估計本身的運動。若是這裏的傳感器主要爲相機,那就稱爲「視覺SLAM」。微信
假設咱們組裝了一臺叫做「小蘿蔔」的機器人,大概的樣子如所示。
小蘿蔔設計圖。左邊:正視圖;右邊:側視圖。設備有相機、輪子、筆記本,手是裝飾品。
雖然有點像「安卓」,但它並非靠安卓系統來計算的。咱們把一臺筆記本塞進了它的後備箱內(方便咱們隨時拿出來調試程序)。它能作點什麼呢?
咱們但願小蘿蔔具備自主運動能力。雖然世界上也有放在桌面像擺件同樣的機器人,可以和人說話或播放音樂,不過一臺平板電腦徹底能夠勝任這些事情。做爲機器人,咱們但願小蘿蔔可以在房間裏自由移動。無論咱們在哪裏招呼一聲,它都會滴溜溜地走過來。
要移動首先得有輪子和電機,因此咱們在小蘿蔔的下方安裝了輪子(足式機器人步態很複雜,咱們暫時不考慮)。有了輪子,機器人就可以四處行動了,但不加控制的話,小蘿蔔不知道行動的目標,就只能四處亂走,更糟糕的狀況下會撞上牆形成損毀。爲了不這種狀況的發生,咱們在它的腦殼上安裝了一個相機。安裝相機的主要動機,是考慮到這樣一個機器人和人類很是類似——從畫面上一眼就能看出。有眼睛、大腦和四肢的人類,可以在任意環境裏輕鬆自在地行走、探索,咱們(天真地)以爲機器人也可以完成這件事。爲了使小蘿蔔可以探索一個房間,它至少須要知道兩件事:app
我在什麼地方?——定位。框架
周圍環境是什麼樣?——建圖。ide
「定位」和「建圖」,能夠當作感知的「內外之分」。做爲一個「內外兼修」的小蘿蔔,一方面要明白自身的狀態(即位置),另外一方面也要了解外在的環境(即地圖)。固然,解決這兩個問題的方法很是多。比方說,咱們能夠在房間地板上鋪設導引線,在牆壁上貼識別二維碼,在桌子上放置無線電定位設備。若是在室外,還能夠在小蘿蔔腦殼上安裝定位設備(像手機或汽車同樣)。有了這些東西以後,定位問題是否已經解決了呢?咱們不妨把這些傳感器(見)分爲兩類。
一類傳感器是攜帶於機器人本體上的,例如機器人的輪式編碼器、相機、激光傳感器,等等。另外一類是安裝於環境中的,例如前面講的導軌、二維碼標誌,等等。安裝於環境中的傳感設備,一般可以直接測量到機器人的位置信息,簡單有效地解決定位問題。然而,因爲它們必須在環境中設置,在必定程度上限制了機器人的使用範圍。比方說,有些地方沒有GPS信號,有些地方沒法鋪設導軌,這時該怎麼作定位呢?
一些傳感器。(a)利用二維碼進行定位的加強現實軟件;(b)GPS定位裝置;(c)鋪設導軌的小車;(d)激光雷達;(e)IMU單元;(f)雙目相機。
咱們看到,這類傳感器約束了外部環境。只有在這些約束知足時,基於它們的定位方案才能工做。反之,當約束沒法知足時,咱們就無法進行定位了。因此說,雖然這類傳感器簡單可靠,但它們沒法提供一個廣泛的、通用的解決方案。相對地,那些攜帶於機器人本體上的傳感器,好比激光傳感器、相機、輪式編碼器、慣性測量單元(Inertial Measurement Unit,IMU)等,它們測到的一般都是一些間接的物理量而不是直接的位置數據。例如,輪式編碼器會測到輪子轉動的角度,IMU測量運動的角速度和加速度,相機和激光傳感器則讀取外部環境的某種觀測數據。咱們只能經過一些間接的手段,從這些數據推算本身的位置。雖然這聽上去是一種迂迴戰術,但更明顯的好處是,它沒有對環境提出任何要求,從而使得這種定位方案可適用於未知環境。
回顧前面討論過的SLAM定義,咱們在SLAM中很是強調未知環境。在理論上,咱們無法限制小蘿蔔的使用環境,這意味着咱們無法假設像GPS這些外部傳感器都能順利工做。所以,使用攜帶式的傳感器來完成SLAM是咱們重點關心的問題。特別地,當談論視覺SLAM時,咱們主要是指如何用相機解決定位和建圖問題。
視覺SLAM是本書的主題,因此咱們尤爲關心小蘿蔔的眼睛可以作些什麼事。SLAM中使用的相機與咱們平時見到的單反攝像頭並非同一個東西。它每每更加簡單,不攜帶昂貴的鏡頭,而是以必定速率拍攝周圍的環境,造成一個連續的視頻流。普通的攝像頭能以每秒鐘30張圖片的速度採集圖像,高速相機則更快一些。按照工做方式的不一樣,相機能夠分爲單目相機(Monocular)、雙目相機(Stereo)和深度相機(RGB-D)三大類,如所示。直觀看來,單目相機只有一個攝像頭,雙目有兩個,而RGB-D原理較複雜,除了可以採集到彩×××片以外,還能讀出每一個像素與相機之間的距離。深度相機一般攜帶多個攝像頭,工做原理和普通相機不盡相同,在第5講會詳細介紹其工做原理,此處讀者只需有一個直觀概念便可。此外,SLAM中還有全景相機、Event相機等特殊或新興的種類。雖然偶爾能看到它們在SLAM中的應用,不過到目前爲止尚未成爲主流。從樣子上看,小蘿蔔使用的彷佛是雙目相機。
形形×××的相機:單目、雙目和深度相機。
咱們來分別看一看各類相機用來作SLAM時有什麼特色。ui
只使用一個攝像頭進行SLAM的作法稱爲單目SLAM(Monocular SLAM)。這種傳感器結構特別簡單,成本特別低,因此單目SLAM很是受研究者關注。你確定見過單目相機的數據:照片。是的,做爲一張照片,它有什麼特色呢?
照片本質上是拍照時的場景(Scene)在相機的成像平面上留下的一個投影。它以二維的形式反映了三維的世界。顯然,這個過程丟掉了場景的一個維度,也就是所謂的深度(或距離)。在單目相機中,咱們沒法經過單張圖片來計算場景中物體與咱們之間的距離(遠近)。以後咱們會看到,這個距離將是SLAM中很是關鍵的信息。因爲咱們人類見過大量的圖像,造成了一種天生的直覺,對大部分場景都有一個直觀的距離感(空間感),它能夠幫助咱們判斷圖像中物體的遠近關係。好比說,咱們可以辨認出圖像中的物體,而且知道其大體的大小;好比,近處的物體會擋住遠處的物體,而太陽、月亮等天體通常在很遠的地方;再如,物體受光照後會留下影子,等等。這些信息均可以幫助咱們判斷物體的遠近,但也存在一些狀況會使這種距離感失效,這時咱們就沒法判斷物體的遠近及其真實大小了。 所示就是這樣一個例子。在這張圖像中,咱們沒法僅經過它來判斷後面那些小人是真實的人,仍是小型模型。除非咱們轉換視角,觀察場景的三維結構。換言之,在單張圖像裏,你沒法肯定一個物體的真實大小。它多是一個很大但很遠的物體,也多是一個很近但很小的物體。因爲近大遠小的緣由,它們可能在圖像中變成一樣大小的樣子。
單目視覺中的尷尬:不知道深度時,手掌上的人是真人仍是模型?
因爲單目相機拍攝的圖像只是三維空間的二維投影,因此,若是真想恢復三維結構,必須改變相機的視角。在單目SLAM中也是一樣的原理。咱們必須移動相機,才能估計它的運動(Motion),同時估計場景中物體的遠近和大小,不妨稱之爲結構(Structure)。那麼,怎麼估計這些運動和結構呢?從生活經驗中咱們知道,若是相機往右移動,那麼圖像裏的東西就會往左邊移動——這就給咱們推測運動帶來了信息。另外一方面,咱們還知道:近處的物體移動快,遠處的物體則運動緩慢。因而,當相機移動時,這些物體在圖像上的運動就造成了視差。經過視差,咱們就能定量地判斷哪些物體離得遠,哪些物體離得近。
然而,即便咱們知道了物體遠近,它們仍然只是一個相對的值。好比咱們在看電影時,雖然可以知道電影場景中哪些物體比另外一些大,但沒法肯定電影裏那些物體的「真實尺度」:那些大樓是真實的高樓大廈,仍是放在桌上的模型?而摧毀大廈的是真實怪獸,仍是穿着特攝服裝的演員?直觀地說,若是把相機的運動和場景大小同時放大兩倍,單目相機所看到的像是同樣的。一樣地,把這個大小乘以任意倍數,咱們都將看到同樣的景象。這說明,單目SLAM估計的軌跡和地圖將與真實的軌跡和地圖相差一個因子,也就是所謂的尺度(Scale)。因爲單目SLAM沒法僅憑圖像肯定這個真實尺度,因此又稱爲尺度不肯定性。
平移以後才能計算深度,以及沒法肯定真實尺度,這兩件事情給單目SLAM的應用形成了很大的麻煩。其根本緣由是經過單張圖像沒法肯定深度。因此,爲了獲得這個深度,人們開始使用雙目和深度相機。編碼
使用雙目相機和深度相機的目的,在於經過某種手段測量物體與咱們之間的距離,克服單目相機沒法知道距離的缺點。一旦知道了距離,場景的三維結構就能夠經過單個圖像恢復出來,也就消除了尺度不肯定性。儘管都是爲了測量距離,但雙目相機與深度相機測量深度的原理是不同的。雙目相機由兩個單目相機組成,但這兩個相機之間的距離﹝稱爲基線(Baseline)﹞是已知的。咱們經過這個基線來估計每一個像素的空間位置——這和人眼很是類似。咱們人類能夠經過左右眼圖像的差別判斷物體的遠近,在計算機上也是一樣的道理(見)。若是對雙目相機進行拓展,也能夠搭建多目相機,不過本質上並無什麼不一樣。
雙目相機的數據:左眼圖像,右眼圖像。經過左右眼的差別,可以判斷場景中物體與相機之間的距離。
計算機上的雙目相機須要大量的計算才能(不太可靠地)估計每個像素點的深度,相比於人類真是很是笨拙。雙目相機測量到的深度範圍與基線相關。基線距離越大,可以測量到的就越遠,因此無人車上搭載的雙目一般會是個很大的傢伙。雙目相機的距離估計是比較左右眼的圖像得到的,並不依賴其餘傳感設備,因此它既能夠應用在室內,亦可應用於室外。雙目或多目相機的缺點是配置與標定均較爲複雜,其深度量程和精度受雙目的基線與分辨率所限,並且視差的計算很是消耗計算資源,須要使用GPU和FPGA設備加速後,才能實時輸出整張圖像的距離信息。所以在現有的條件下,計算量是雙目的主要問題之一。
深度相機(又稱RGB-D相機,在本書中主要使用RGB-D這個名稱)是2010年左右開始興起的一種相機,它最大的特色是能夠經過紅外結構光或Time-of-Flight(ToF)原理,像激光傳感器那樣,經過主動向物體發射光並接收返回的光,測出物體與相機之間的距離。這部分並不像雙目相機那樣經過軟件計算來解決,而是經過物理的測量手段,因此相比於雙目相機可節省大量的計算(見)。目前經常使用的RGB-D相機包括Kinect/Kinect V二、Xtion Pro Live、RealSense等。不過,如今多數RGB-D相機還存在測量範圍窄、噪聲大、視野小、易受日光干擾、沒法測量透射材質等諸多問題,在SLAM方面,主要用於室內,室外則較難應用。
RGB-D數據:深度相機能夠直接測量物體的圖像和距離,從而恢復三維結構。
咱們討論了幾種常見的相機,相信經過以上的說明,你已經對它們有了直觀的瞭解。如今,想象相機在場景中運動的過程,咱們將獲得一系列連續變化的圖像(你能夠用手機錄個小視頻試試)。視覺SLAM的目標,是經過這樣的一些圖像,進行定位和地圖構建。這件事情並無咱們想象的那麼簡單。它不是某種算法,只要咱們輸入數據,就能夠往外不斷地輸出定位和地圖信息了。SLAM須要一個完善的算法框架,而通過研究者們長期的努力工做,現有這個框架已經定型了。關於框架咱們之後再聊~spa
本文選自《視覺SLAM十四講:從理論到實踐》一書,點此連接可在博文視點官網查看此書。
想及時得到更多精彩文章,可在微信中搜索「博文視點」或者掃描下方二維碼並關注。
.net
此外,本週正在進行一項熱門活動——《盡在雙11》阿里專家問答!
《盡在雙11》的做者樂田、仁重正經過開源問答來答覆讀者有關《盡在雙11》這本書的疑問~
更多好問題,期待你來問!設計