天天看點

解讀《視覺SLAM十四講》,帶你一步一步入門視覺SLAM—— 第 2 講 初識SLAM (上)

近來,實習下班比較早,再加上天氣冷,不用陪女朋友逛街,是以早早回到寝室,繼續寫部落格!

在上一篇部落格中,我解讀了《視覺SLAM十四講》第1講的内容。在第一講中,書中并沒有什麼技術性的問題,主要是作者介紹了一些預備知識。

這篇部落格,我要帶你解讀第2講——初識SLAM。我相信如果你運作了我在上一篇部落格中介紹的ORB-SLAM2,那麼你對SLAM已經有一個很好的認識了。

一、初識SLAM

在這一講中,作者主要介紹了以下内容:

  • 首先通過一個小機器人作為引入,講解了SLAM中最為常用的三種視覺傳感器:單目相機、雙目相機、深度相機;
  • 然後介紹了經典的SLAM架構包含哪些過程,并介紹了每一個過程實作的意義;
  • 又引入了通用的運動方程和觀測方程來通過數學的方式表述了SLAM問題
  • 最後作者介紹了一些實踐行的工作,包括安裝一款Linux系統,如何在Linux系統上編寫一小段代碼、還介紹了管理代碼之間依賴關系的工具CMake,同時也介紹了連結庫,最後介紹了一款IDE。

在這一講中,作者從多個方面,對SLAM做了認識性的介紹,我相信對于初學者來說,這裡面一定有很多的專業術語讓你措手不及,但是這個是不可避免的,任何一門學科為了表述和交流的友善,都形成了自己的一套術語,可能一開始你不習慣,但是很快它就會印在你的腦海裡,請你多一些耐心。這一講你不用每一個字都了解,但是你要做到對大部分内容心中有數。對每一個術語即使不能用專業的語言解釋它,但是要大概知道它是啥。

二、解讀

下面我對書中的難于了解的内容,進行一些解讀,你一定要在閱讀過書中對應章節的内容之後再往下看,隻有那樣你才會有共鳴。

SLAM的傳感器

在書中作者介紹了SLAM常用的傳感器。我在前面說過,隻要是完成同時建圖和定位的任務,那麼我們就把它叫做SLAM,我們可以想到能滿足這個要求的傳感器很多,比方說雷射雷達,相機,輪式裡程計慣性測量單元,我想這其中你最熟悉的傳感器一定是:相機。别的傳感器可能你聽說過,可能沒有聽說過,你不必在他們上面多花時間去了解,因為《視覺SLAM十四講》這本書隻針對相機。

  

單目相機

  作者在書中介紹了單目相機,由于現在是初識階段,是以沒有介紹單目相機的原理,作者不斷地在強調一個問題,那就是單目相機的尺度問題。

  

  我不知道你對單目相機的尺度是否了解,如果你不了解,下面請你跟我一起做一個實驗,閉上你的一隻眼睛,然後将你的雙手掌心朝向你,兩個手掌之間前後方向稍微有一些距離,這個時候你會發現,你根本不可能通過一隻眼睛厘清楚兩個手掌誰在前誰在後。但是你可能會說,我明明知道他們的前後啊,對不起那并不是你的眼睛觀察出來的,而是你通過近大遠小的規律判斷出來的,你知道兩隻手一樣大,看着小的離我們就遠,但是相機不知道啊!你能得到距離感那是因為你通過後天不斷地學習獲得的知識,并不是你的眼睛直接看出來的。

  

  單目相機就相當于我們在用一隻眼睛觀察世界,盡管它看到了這一切,但是它并不知道它所看到的東西,具有多大的真實尺寸。由于還沒有學到單目相機的模型,是以隻能通過一個感性的方法,幫你了解一下單目的尺度問題。

  

  由于沒有尺度,也就是說沒有真實的空間距離,那麼我們後續産生的一切軌迹或者點,都沒有真實機關資訊,有的隻是它們之間的相對關系,也許你還不能了解這句話,但是你可以記住它,留下一個疑問,日後你自會了解。

雙目相機

雙目相機,你就可以了解成像我們的眼睛一樣,兩個眼睛之間的距離,叫做基線。這個是雙目相機出廠就知道的資訊,然後我們想過兩個雙目之間三角關系和相似三角形關系,就可以知道照片上一個點,對應到空間上的真實位置。也許你覺得很神奇,或者匪夷所思,但是當你在後續文章中了解雙目相機模型之後,你就會發現它的測距原理是如此的簡單。

深度相機

深度相機由叫RGB-D相機,其中R、G、B表示的是圖檔的三個通道,D表示的是深度,說明RGB-D相機獲得是一張,彩色的圖檔,并且每一個像素還額外獲得了深度資訊。作為我們對SLAM的應用,你對RGB-D相機的了解到此就足夠了,沒有必要再去深挖它的原理。

經典SLAM的視覺架構

作者介紹了目前視覺SLAM最為常見的流程,初看你一定對這每一部分都沒有什麼認識,也許根據“傳感器資料”、“回環檢測”、“建圖”的字面意思,你能推斷一些資訊,但是這離完全了解架構的流程還很遠。

  

  我覺得沒有什麼比舉例子,然後帶着你感受一遍這個流程來的直接。是以我下面采用一個例子,但是感受一下這個過程:

  • 下面請你把自己想象成一個機器人,你的兩個眼睛就是一個雙目攝像頭,假設你的眼睛不轉,頭也不轉,眼睛的視角隻能通過腳步移動去控制。
  • 現在你在一個超市裡面,你的雙腳開始移動,你一邊走一邊通過眼睛觀察你前方的場景,你每走一步,你就會更深入走進你眼前的場景,而你就能通過眼前場景的變化推斷出你行進的軌迹,然後你就在這個超市裡面不停地走動,那麼你的軌迹越來越長,但是由于你的眼睛觀察有誤差,是以就會導緻你大腦在形成軌迹時産生的誤差越來越大。
  • 走着走着,忽然,你發現自己好像來過這個地方,這時你馬上發現了一個問題,我的腦海中推斷的軌迹是我現在在水産區,實際上我現在在蔬果區,于是你可以斷定自己前面的軌迹産生了多大的誤差,于是你就想采用了一個不算太好,但是也隻能這樣的方法,你将你推斷導緻的誤差,平均分給你前面走過每一步,這樣的話雖然總體誤差沒有降低,但是你最後所在的位置會更接近你真實的位置,這樣做會讓我們看起來更加接近真實的運動軌迹。
  • 最後,你走了很多的路,你也修正了自己在超市運動的軌迹,而超市的整個環境的樣貌也就在你的腦海裡,留下了印象。

其實上面的這一個過程就是一個經典的SLAM架構:

  • 眼睛看到的東西,就對應于架構中的傳感器資料;
  • 我們通過前後兩步看到的場景變換,推斷出軌迹的過程,就是前端,也叫作視覺裡程計;
  • 忽然我們發現自己回到了走過的地方,就對應于回環檢測;
  • 上面例子中我們發現自己實際在蔬果區,但是根據累計的觀察,我們覺得自己是在水産區,然後我們就優化整個誤差,這個就對應于後端,常常采用的方法就是非線性優化;
  • 最後我們記住了整個超市的環境樣貌,這就是建圖。

關于視覺裡程計,我要多說一句:在我們的印象中“XX計”,例如溫度計,都是一種實際的物件,但是視覺裡程計它并不是你可以摸得到的物件,它就是通過代碼完成相鄰時刻運動的計算,由于它的這個效果和我們實際的裡程計一樣,是以把它叫做:視覺裡程計。

我相信你仔細閱讀過上面的例子,親身體會一下,你一定能了解SLAM的整個流程,如果你對上面流程更為細緻的東西有疑惑,也請你不要着急,後面的所有内容都是圍繞着上面的流程進行的,待你學完之後,一定迎刃而解。

出于對内容品質的考慮(主要是我不想熬夜),每篇内容盡量不要太長,是以這一講,我就分成兩部分解讀。下篇部落格解讀這一講的SLAM通用數學模型和一些實踐的内容。

要從容地着手去做一件事,一旦開始,就要堅持到底。——比阿斯【美】