天天看點

初識視覺SLAM:用相機解決定位和建圖問題

引言:視覺slam 是指用相機解決定位和建圖問題。本文以一個小機器人為例形象地介紹了視覺slam的功能及特點。 本文選自《視覺slam十四講:從理論到實踐》。

  slam 是simultaneous localization and mapping 的縮寫,中文譯作“同時定位與地圖建構”。它是指搭載特定傳感器的主體,在沒有環境先驗資訊的情況下,于運動過程中建立環境的模型,同時估計自己的運動。如果這裡的傳感器主要為相機,那就稱為“視覺slam”。

  假設我們組裝了一台叫作“小蘿蔔”的機器人,大概的樣子如所示。

           

初識視覺SLAM:用相機解決定位和建圖問題

        小蘿蔔設計圖。左邊:正視圖;右邊:側視圖。裝置有相機、輪子、筆記本,手是裝飾品。

  

  雖然有點像“安卓”,但它并不是靠安卓系統來計算的。我們把一台筆記本塞進了它的後備箱内(友善我們随時拿出來調試程式)。它能做點什麼呢?

  我們希望小蘿蔔具有自主運動能力。雖然世界上也有放在桌面像擺件一樣的機器人,能夠和人說話或播放音樂,不過一台平闆電腦完全可以勝任這些事情。作為機器人,我們希望小蘿蔔能夠在房間裡自由移動。不管我們在哪裡招呼一聲,它都會滴溜溜地走過來。

  要移動首先得有輪子和電機,是以我們在小蘿蔔的下方安裝了輪子(足式機器人步态很複雜,我們暫時不考慮)。有了輪子,機器人就能夠四處行動了,但不加控制的話,小蘿蔔不知道行動的目标,就隻能四處亂走,更糟糕的情況下會撞上牆造成損毀。為了避免這種情況的發生,我們在它的腦袋上安裝了一個相機。安裝相機的主要動機,是考慮到這樣一個機器人和人類非常相似——從畫面上一眼就能看出。有眼睛、大腦和四肢的人類,能夠在任意環境裡輕松自在地行走、探索,我們(天真地)覺得機器人也能夠完成這件事。為了使小蘿蔔能夠探索一個房間,它至少需要知道兩件事:

我在什麼地方?——定位。

周圍環境是什麼樣?——建圖。

“定位”和“建圖”,可以看成感覺的“内外之分”。作為一個“内外兼修”的小蘿蔔,一方面要明白自身的狀态(即位置),另一方面也要了解外在的環境(即地圖)。當然,解決這兩個問題的方法非常多。比方說,我們可以在房間地闆上鋪設導引線,在牆壁上貼識别二維碼,在桌子上放置無線電定位裝置。如果在室外,還可以在小蘿蔔腦袋上安裝定位裝置(像手機或汽車一樣)。有了這些東西之後,定位問題是否已經解決了呢?我們不妨把這些傳感器(見)分為兩類。

  一類傳感器是攜帶于機器人本體上的,例如機器人的輪式編碼器、相機、雷射傳感器,等等。另一類是安裝于環境中的,例如前面講的導軌、二維碼标志,等等。安裝于環境中的傳感裝置,通常能夠直接測量到機器人的位置資訊,簡單有效地解決定位問題。然而,由于它們必須在環境中設定,在一定程度上限制了機器人的使用範圍。比方說,有些地方沒有gps信号,有些地方無法鋪設導軌,這時該怎麼做定位呢?

         

初識視覺SLAM:用相機解決定位和建圖問題

  一些傳感器。(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:用相機解決定位和建圖問題

                   形形色色的相機:單目、雙目和深度相機。

                   

  我們來分别看一看各種相機用來做slam時有什麼特點。

  隻使用一個攝像頭進行slam的做法稱為單目slam(monocular slam)。這種傳感器結構特别簡單,成本特别低,是以單目slam非常受研究者關注。你肯定見過單目相機的資料:照片。是的,作為一張照片,它有什麼特點呢?

  照片本質上是拍照時的場景(scene)在相機的成像平面上留下的一個投影。它以二維的形式反映了三維的世界。顯然,這個過程丢掉了場景的一個次元,也就是所謂的深度(或距離)。在單目相機中,我們無法通過單張圖檔來計算場景中物體與我們之間的距離(遠近)。之後我們會看到,這個距離将是slam中非常關鍵的資訊。由于我們人類見過大量的圖像,形成了一種天生的直覺,對大部分場景都有一個直覺的距離感(空間感),它可以幫助我們判斷圖像中物體的遠近關系。比如說,我們能夠辨認出圖像中的物體,并且知道其大緻的大小;比如,近處的物體會擋住遠處的物體,而太陽、月亮等天體一般在很遠的地方;再如,物體受光照後會留下影子,等等。這些資訊都可以幫助我們判斷物體的遠近,但也存在一些情況會使這種距離感失效,這時我們就無法判斷物體的遠近及其真實大小了。 所示就是這樣一個例子。在這張圖像中,我們無法僅通過它來判斷後面那些小人是真實的人,還是小型模型。除非我們轉換視角,觀察場景的三維結構。換言之,在單張圖像裡,你無法确定一個物體的真實大小。它可能是一個很大但很遠的物體,也可能是一個很近但很小的物體。由于近大遠小的原因,它們可能在圖像中變成同樣大小的樣子。

              

初識視覺SLAM:用相機解決定位和建圖問題

               單目視覺中的尴尬:不知道深度時,手掌上的人是真人還是模型?

  由于單目相機拍攝的圖像隻是三維空間的二維投影,是以,如果真想恢複三維結構,必須改變相機的視角。在單目slam中也是同樣的原理。我們必須移動相機,才能估計它的運動(motion),同時估計場景中物體的遠近和大小,不妨稱之為結構(structure)。那麼,怎麼估計這些運動和結構呢?從生活經驗中我們知道,如果相機往右移動,那麼圖像裡的東西就會往左邊移動——這就給我們推測運動帶來了資訊。另一方面,我們還知道:近處的物體移動快,遠處的物體則運動緩慢。于是,當相機移動時,這些物體在圖像上的運動就形成了視差。通過視差,我們就能定量地判斷哪些物體離得遠,哪些物體離得近。

  然而,即使我們知道了物體遠近,它們仍然隻是一個相對的值。比如我們在看電影時,雖然能夠知道電影場景中哪些物體比另一些大,但無法确定電影裡那些物體的“真實尺度”:那些大樓是真實的高樓大廈,還是放在桌上的模型?而摧毀大廈的是真實怪獸,還是穿着特攝服裝的演員?直覺地說,如果把相機的運動和場景大小同時放大兩倍,單目相機所看到的像是一樣的。同樣地,把這個大小乘以任意倍數,我們都将看到一樣的景象。這說明,單目slam估計的軌迹和地圖将與真實的軌迹和地圖相差一個因子,也就是所謂的尺度(scale)。由于單目slam無法僅憑圖像确定這個真實尺度,是以又稱為尺度不确定性。

平移之後才能計算深度,以及無法确定真實尺度,這兩件事情給單目slam的應用造成了很大的麻煩。其根本原因是通過單張圖像無法确定深度。是以,為了得到這個深度,人們開始使用雙目和深度相機。

  使用雙目相機和深度相機的目的,在于通過某種手段測量物體與我們之間的距離,克服單目相機無法知道距離的缺點。一旦知道了距離,場景的三維結構就可以通過單個圖像恢複出來,也就消除了尺度不确定性。盡管都是為了測量距離,但雙目相機與深度相機測量深度的原理是不一樣的。雙目相機由兩個單目相機組成,但這兩個相機之間的距離﹝稱為基線(baseline)﹞是已知的。我們通過這個基線來估計每個像素的空間位置——這和人眼非常相似。我們人類可以通過左右眼圖像的差異判斷物體的遠近,在計算機上也是同樣的道理(見)。如果對雙目相機進行拓展,也可以搭建多目相機,不過本質上并沒有什麼不同。

初識視覺SLAM:用相機解決定位和建圖問題

      雙目相機的資料:左眼圖像,右眼圖像。通過左右眼的差異,能夠判斷場景中物體與相機之間的距離。

      

  計算機上的雙目相機需要大量的計算才能(不太可靠地)估計每一個像素點的深度,相比于人類真是非常笨拙。雙目相機測量到的深度範圍與基線相關。基線距離越大,能夠測量到的就越遠,是以無人車上搭載的雙目通常會是個很大的家夥。雙目相機的距離估計是比較左右眼的圖像獲得的,并不依賴其他傳感裝置,是以它既可以應用在室内,亦可應用于室外。雙目或多目相機的缺點是配置與标定均較為複雜,其深度量程和精度受雙目的基線與分辨率所限,而且視差的計算非常消耗計算資源,需要使用gpu和fpga裝置加速後,才能實時輸出整張圖像的距離資訊。是以在現有的條件下,計算量是雙目的主要問題之一。

  深度相機(又稱rgb-d相機,在本書中主要使用rgb-d這個名稱)是2010年左右開始興起的一種相機,它最大的特點是可以通過紅外結構光或time-of-flight(tof)原理,像雷射傳感器那樣,通過主動向物體發射光并接收傳回的光,測出物體與相機之間的距離。這部分并不像雙目相機那樣通過軟體計算來解決,而是通過實體的測量手段,是以相比于雙目相機可節省大量的計算(見)。目前常用的rgb-d相機包括kinect/kinect v2、xtion pro live、realsense等。不過,現在多數rgb-d相機還存在測量範圍窄、噪聲大、視野小、易受日光幹擾、無法測量透射材質等諸多問題,在slam方面,主要用于室内,室外則較難應用。

            

初識視覺SLAM:用相機解決定位和建圖問題

           rgb-d資料:深度相機可以直接測量物體的圖像和距離,進而恢複三維結構。

  我們讨論了幾種常見的相機,相信通過以上的說明,你已經對它們有了直覺的了解。現在,想象相機在場景中運動的過程,我們将得到一系列連續變化的圖像(你可以用手機錄個小視訊試試)。視覺slam的目标,是通過這樣的一些圖像,進行定位和地圖建構。這件事情并沒有我們想象的那麼簡單。它不是某種算法,隻要我們輸入資料,就可以往外不斷地輸出定位和地圖資訊了。slam需要一個完善的算法架構,而經過研究者們長期的努力工作,現有這個架構已經定型了。關于架構我們以後再聊~

                    

初識視覺SLAM:用相機解決定位和建圖問題

  想及時獲得更多精彩文章,可在微信中搜尋“博文視點”或者掃描下方二維碼并關注。

                       

初識視覺SLAM:用相機解決定位和建圖問題
此外,本周正在進行一項熱門活動——《盡在雙11》阿裡專家問答! 更多好問題,期待你來問!

繼續閱讀