1. 程式人生 > >初識視覺SLAM:用相機解決定位和建圖問題

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

視覺slam

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

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

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

        小蘿蔔設計圖。左邊:正視圖;右邊:側視圖。設備有相機、輪子、筆記本,手是裝飾品。
  
  雖然有點像“安卓”,但它並不是靠安卓系統來計算的。我們把一臺筆記本塞進了它的後備箱內(方便我們隨時拿出來調試程序)。它能做點什麽呢?
  我們希望小蘿蔔具有自主運動能力。雖然世界上也有放在桌面像擺件一樣的機器人,能夠和人說話或播放音樂,不過一臺平板電腦完全可以勝任這些事情。作為機器人,我們希望小蘿蔔能夠在房間裏自由移動。不管我們在哪裏招呼一聲,它都會滴溜溜地走過來。
  要移動首先得有輪子和電機,所以我們在小蘿蔔的下方安裝了輪子(足式機器人步態很復雜,我們暫時不考慮)。有了輪子,機器人就能夠四處行動了,但不加控制的話,小蘿蔔不知道行動的目標,就只能四處亂走,更糟糕的情況下會撞上墻造成損毀。為了避免這種情況的發生,我們在它的腦袋上安裝了一個相機。安裝相機的主要動機,是考慮到這樣一個機器人和人類非常相似——從畫面上一眼就能看出。有眼睛、大腦和四肢的人類,能夠在任意環境裏輕松自在地行走、探索,我們(天真地)覺得機器人也能夠完成這件事。為了使小蘿蔔能夠探索一個房間,它至少需要知道兩件事:

  • 我在什麽地方?——定位。

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

“定位”和“建圖”,可以看成感知的“內外之分”。作為一個“內外兼修”的小蘿蔔,一方面要明白自身的狀態(即位置),另一方面也要了解外在的環境(即地圖)。當然,解決這兩個問題的方法非常多。比方說,我們可以在房間地板上鋪設導引線,在墻壁上貼識別二維碼,在桌子上放置無線電定位設備。如果在室外,還可以在小蘿蔔腦袋上安裝定位設備(像手機或汽車一樣)。有了這些東西之後,定位問題是否已經解決了呢?我們不妨把這些傳感器(見)分為兩類。
  一類傳感器是攜帶於機器人本體上的,例如機器人的輪式編碼器、相機、激光傳感器,等等。另一類是安裝於環境中的,例如前面講的導軌、二維碼標誌,等等。安裝於環境中的傳感設備,通常能夠直接測量到機器人的位置信息,簡單有效地解決定位問題。然而,由於它們必須在環境中設置,在一定程度上限制了機器人的使用範圍。比方說,有些地方沒有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時有什麽特點。

單目相機

  只使用一個攝像頭進行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 V2、Xtion Pro Live、RealSense等。不過,現在多數RGB-D相機還存在測量範圍窄、噪聲大、視野小、易受日光幹擾、無法測量透射材質等諸多問題,在SLAM方面,主要用於室內,室外則較難應用。
            技術分享
           RGB-D數據:深度相機可以直接測量物體的圖像和距離,從而恢復三維結構。
           
  我們討論了幾種常見的相機,相信通過以上的說明,你已經對它們有了直觀的了解。現在,想象相機在場景中運動的過程,我們將得到一系列連續變化的圖像(你可以用手機錄個小視頻試試)。視覺SLAM的目標,是通過這樣的一些圖像,進行定位和地圖構建。這件事情並沒有我們想象的那麽簡單。它不是某種算法,只要我們輸入數據,就可以往外不斷地輸出定位和地圖信息了。SLAM需要一個完善的算法框架,而經過研究者們長期的努力工作,現有這個框架已經定型了。關於框架我們以後再聊~

  本文選自《視覺SLAM十四講:從理論到實踐》一書,點此鏈接可在博文視點官網查看此書。
                    技術分享
  想及時獲得更多精彩文章,可在微信中搜索“博文視點”或者掃描下方二維碼並關註。
                       技術分享

此外,本周正在進行一項熱門活動——《盡在雙11》阿裏專家問答!
《盡在雙11》的作者樂田、仁重正通過開源問答來答復讀者有關《盡在雙11》這本書的疑問~
更多好問題,期待你來問!


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