SLAM系列(一):入門介紹

磨蹭了好久終于開始寫本行SLAM系列了。鄙人目前水平一般谓着,但接下來的幾年也都會在這個方向繼續(xù)深入下去泼诱,所以打算盡我所能地寫一個完整的SLAM從入門到精(fang)通(qi)的系列。文章的內容大概會分為三個大部分
1:2維平面的SLAM系統(tǒng)
2: 視覺SLAM
3:視覺慣性SLAM
每一個大部分都會分為代碼和理論兩個小部分赊锚,以幫助大家理解如何實現(xiàn)治筒。
絕大多數的代碼會在ROS的幫助下完成,這也方便大家在學習完ROS入門系列之后看看利用ROS寫稍微大一點的程序是什么樣子舷蒲。
2維平面的SLAM系統(tǒng)主要參考<probabilistic robotics>
視覺SLAM會主要參考<multiple view geometry>, 一些關于非線性最小二乘優(yōu)化的書籍以及<視覺SLAM十四講>耸袜。代碼參考ORBSLAM2等。視覺SLAM的教學代碼有高翔博士的<一起來做RGB-D SLAM>牲平,但是也有一些年份了堤框,可以用更新的了。
視覺慣性SLAM主要參考一些論文了,比如和VINS-Fusion,OKVIS以及預積分相關的論文胰锌,我們會在以后說到骗绕。
可能好多人會直接想搞視覺SLAM部分而不想從2d部分學起,但是對于入門者來說资昧,2d的理論和代碼都會更簡單一些酬土,方便看懂為后面進階鋪路。
最后說一下作者是興趣使然的更新格带,看心情更新撤缴,更新時間很長,也說不定斷更叽唱。

基本要求

理論上你需要有一些基本的高數知識屈呕,比如怎么求積分怎么求偏導數什么的,基本線性代數知識棺亭,比如矩陣的初級操作虎眨,求逆什么的,以及概率論的基本知識镶摘,高斯分布嗽桩,多變量高斯分布,全概率公式凄敢,貝葉斯法則什么的碌冶,編程上你需要對C++有基本的了解,知道并能編寫簡單的函數涝缝,類扑庞。不了解也不用擔心,稍微深入的地方我都會講到拒逮。

基本概念

SLAM全稱Simultaneous Localization and Mapping罐氨,即同時定位與制圖。定位的概念很好理解消恍,如果一個機器人來到陌生的環(huán)境岂昭,它需要知道自己在哪兒,數學上來說就是知道自己的坐標狠怨,機器人如果在移動,就需要時刻的坐標更新邑遏。制圖的意思是指對周圍環(huán)境的了解佣赖,對周圍環(huán)境的了解能幫助你更好地定位自己。制圖分為稀疏制圖(sparse mapping)和稠密建圖(dense mapping)记盒。稀疏制圖表示你對周圍的環(huán)境只有部分的了解憎蛤,而稠密建圖則表示你對周圍的環(huán)境的每一個點都清楚。打個比方,你和父母一起出游俩檬,結果走散了萎胰,你給父母打電話,他們問你在哪兒棚辽,這時候你需要定位了(咳咳假設你不能直接發(fā)定位給他們)技竟,你告訴他們:"我在xx路上,后面有一個xx樓屈藐,上面寫著xxx榔组。"你說的內容,提取了當前環(huán)境比較特征的部分联逻,而這些比較特征的部分搓扯,這些就足夠幫住確定你的位置了,這就屬于稀疏建圖包归。如果你告訴父母:"我在xx路上锨推,前面是xx,后面是xx公壤,左邊是xx换可,右邊是xx,斜前方是xx境钟,斜后方是xx....."總之你把你周圍的一切東西都描述了出來锦担,這就就是稠密建圖。稠密建圖當然能幫助你定位慨削,但很顯然洞渔,如果你只是想單純地定位,你給出的信息就太冗余了缚态。所以SLAM中的定位只需要稀疏建圖就可以了磁椒,你了解周圍環(huán)境的一些特征,就足夠能確定你的坐標了玫芦。
實際的稀疏建圖浆熔,是提取環(huán)境中一些比較特征的點桥帆。如果你有一個相機,在獲取一張照片之后老虫,根據特定的算法叶骨,能把照片上一些比較有特色的點找出來,這些比較特色的點就能幫助你定位祈匙『龉簦總的來說SLAM里的地圖不是大家想象中的百度地圖高德地圖google地圖那樣天揖,而是一些從環(huán)境中提取出來的稀疏的比較有特點的點。
關于定位,還得介紹一下室內外的定位方法。在室外的話载城,利用GPS直接定位是很好的選擇蘸吓,不過普通民用GPS精度一般,誤差可以有3米左右,也有高精度的GPS,誤差可以到達厘米級,但是價格很貴赖钞。關于SLAM的室外應用,很多人肯定很感興趣無人車方面的技術聘裁。無人車現(xiàn)在分級是L0~L5相信這個大家很多都聽說過雪营。其中有部分公司達到了L4級的無人車系統(tǒng),這意味著在提供一定的輔助條件下衡便,汽車可以自動駕駛献起。而這個輔助條件,比如說有預先制好的地圖镣陕。再用前面那個你需要給父母提供你位置信息的例子來說谴餐,你的父母如果對當地很熟悉,也就是他們腦海中已經有地圖了呆抑,你打電話的內容就可能更省略:"我在XX樓旁邊“他們就能找到你了岂嗓。回到無人車的例子鹊碍,如果周圍的環(huán)境已經在出發(fā)前就被知道了厌殉,無人車就能省掉一部分計算力并且定位的精度更高。如何預先知道環(huán)境呢侈咕?在現(xiàn)實中公罕,可能專門有一輛車,利用激光雷達(lidar)在一條路上先開一次耀销,獲取到周圍環(huán)境的3D點云楼眷,儲存起來,這樣地圖就預先構建好了熊尉,能省掉很大的計算力(就好像之前的例子你給父母提供位置信息時能少說話)罐柳。所以說嚴格來講目前大多數公司的無人車在室外并不是完全使用SLAM的技術,他們不僅有SLAM的影子(利用激光雷達或者相機等幫助定位并提取路人狰住,車子等特征)硝清,同時也借助了預先制好的地圖和GPS等其他傳感器輔助定位,以達到盡可能好的效果转晰。雖然不是完完全全的自動化,但是L4級的無人駕駛還是很有意義的查邢。比如說應用于公交車或者其他只在限定范圍內運動的車輛,我們完全可以對周圍的道路進行預先制圖從而節(jié)省汽車在真正行駛過程中的計算量扰藕。甚至普通家用車缓苛,你如果大多數時候只在某個城市什么的行駛邓深,也完全可以有專門的公司去預先制圖。
而L5級的無人駕駛芥备,其實才是真正的SLAM應用冬耿。L5級的無人駕駛不限環(huán)境和條件萌壳,意味沒有預先制定的地圖,我們必須真正地同時定位和制圖袱瓮。一般也需要GPS的輔助定位缤骨。當然無人駕駛除了SLAM還需要有很多其他技術,比如控制绊起,決策,利用深度學習提取路人等信息什么的燎斩,要把他們融合起來非常復雜。L5級的無人駕駛據我目前所知沒有公司達到瘫里,室外的SLAM應用也并沒有那么成熟(等一下不要砸自己飯碗啊喂J当巍谨读!)局装,理論雖然很成熟了劳殖,但是面對千奇百怪的實際環(huán)境,那些很fancy的算法也是有些捉襟見肘哆姻。L3,L4級無人駕駛能滿足很多無人駕駛的需求了宣增,他們需要但不完全依賴于SLAM矛缨。至于L5級目前是一個目標帖旨,沖鴨!灵妨!
室內的定位就沒有GPS的用武之地了,完全SLAM的地盤了泌霍。有名的應用領域比如掃地機器人什么的货抄。


basic_idea.png

基本原理

這兒我用一個不算非常恰當但非常簡單的例子幫助初學者對同時定位制圖的計算原理有一個直觀的了解朱转。請參考上面basic_idea.png的圖。
假設黑圓圈是一輛小車藤为,方塊A是環(huán)境中一個固定的點怪与。小車從位置B運動到了位置C。小車在位置B時通過某種傳感器測得A的位置是距離|AB|米琼梆,同時通過傳感器和一些小的計算能知道AB和B運動方向之間的夾角即∠ABC。運動到位置C后測得A的位置距離它是|AC|米窿吩,同樣可以知道∠ACB。這時候如果B點的坐標是(0,0)纫雁,那三角形知道兩邊兩角你能不能算第三邊|BC|呢煌往?
其實不僅我們可以通過測A和小車之間的距離最終了解| BC|的長度轧邪,我們當然還有傳感器能測小車的速度之類的,假設小車從B運動到C只經歷了很短的時間\delta t忌愚,我們測得小車在B點的速度延BC方向是v曲管,這很短的時間內我們可以假設小車的速度沒有發(fā)生改變硕糊。那你能不能算邊|BC|的長度呢院水?
可以說這兩個問題都太簡單了简十,但是如果你能完成你就已經完成SLAM即同時定位與制圖了。A屬于環(huán)境中的點螟蝙,你能根據傳感器確定它的位置恢恼,這就是制圖胰默;你根據小車在B的位置和一系列傳感器數據以及小車的運動模型(它沿BC在極短的時間內坐勻速直線運動)推斷出小車在C的位置漓踢,這就是定位。合起來就是Simultaneous Localization and Mapping和簸。
說地這么簡單彭雾,為什么實際想實現(xiàn)一個SLAM系統(tǒng)卻沒那么容易呢锁保?我們來看看如果面臨現(xiàn)實情況會有哪些問題半沽。
Question1:我們說通過測量A相對于B,C的位置構成一個三角形能輔助我們算出|BC|者填,通過測得小車在B的速度以及假設它勻速直線運動我們也能算出|BC|浩村。如果傳感器完美測量沒有任何誤差占哟,運動模型也完美心墅,這兩種方式算出的|BC|應該一樣榨乎。但當然不會完美。假設測得的|AB|長度和真實值差0.01m,測得的|AC|長度和真實值差0.01m蜜暑,那算出的|BC|長度就會和真實值有差距铐姚,我們把這個差距記為e_1肛捍。如果小車在B測得的速度和真實的速度有0.001m/s的差距,小車從B到C也并不是完美的勻速直線運動拙毫,那算出的|BC|長度也會和真實值有差距依许,記為e_2。傳感器不同峭跳,e_1,e_2肯定會不一樣。那么我們該使用哪個|BC|值袍患?
Question2:我們非常完美地假設能直接測得|AB|,|AC|的長度,視覺SLAM中我們有相機作為傳感器诡延,普通的相機拍出的是一張圖片滞欠,即二維平面肆良,A位于這個平面中筛璧,我們怎么能確定這個平面中一個點到自己的具體距離?
Question3:假設我們已經能在小車在B點時算出A的位置夭谤,小車運動到C時算出A距離C的位置棺牧,但我怎么知道這兩個A是一個A??有點繞口朗儒,這么說,小車在B點拍下了當前環(huán)境的照片醉锄,有一棵樹乏悄,在C點拍下了照片,有同樣一顆樹檩小,這兩張照片儲存在電腦中,但是電腦不會知道這是同一棵樹烟勋。圖片作為數字矩陣儲存在電腦中,這兩棵樹在電腦里面都只是一堆不相關數字而已卵惦。
Question4:環(huán)境中不僅有點A阻肿,還有點M,N,L....,假設每一個點我們都能測出到小車的距離冕茅,但是由于傳感器的測量有誤差,并且測出的誤差各不相同蛹找,有的差0.01m有的差0.0095米,有的差0.011米庸疾,環(huán)境中的每一個點都和B,C形成了一個三角形乍楚,每一個三角形都能算出|BC|的長度且由于誤差算出的|BC|各不相同届慈,那么和Question1類似的問題又來了徒溪,我們使用哪一個 |BC|金顿?
Question5:由于我們前面的說的測量的誤差,無論我們選哪個|BC|揍拆,或者用某種方式把這些|BC|整合起來算一個新的|BC|(最簡單的渠概,加起來求個平均什么的),都不會是真實的值播揪,仍然會和真實的值有一定誤差。當我們計算出的C的位置和實際位置差0.01米猪狈,之后小車從C運動到D又算差0.011米箱沦,之后小車從D運動到E又差0.0095米...每一個\delta t是0.1s的話雇庙,如此累積谓形,只需要10s小車的位置誤差就能達到米級状共!誤差的累積是不可避免的。面對這種情況峡继,我們又該怎么辦?
等等還有一系列的問題匈挖,其實最主要的還是來自于測量的不準確性和模型的不準確性(就像小車不是完美勻速直線運動)。現(xiàn)實的SLAM如何處理這些問題儡循,我們會在以后的講解中一一解答

符號約定

在理論講解時舶吗,會涉及到很多符號描述择膝。符號這個東西誓琼,有些統(tǒng)一了有些沒統(tǒng)一還真是麻煩肴捉。我們講解的符號約定如下,普通沒加粗的希臘字母表示一個數字齿穗,或者英語數學里常說scalar傲隶,比如x,y,z窃页;加粗的小寫字符表示向量\mathbf{x}, \mathbf{y}, \mathbf{z}跺株;大寫加粗表示矩陣\mathbf{X}脖卖,\mathbf{Y},\mathbf{Z}畦木;空心的加粗大寫表示集合袖扛,比如實數集\mathbb{R}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末攻锰,一起剝皮案震驚了整個濱河市晾嘶,隨后出現(xiàn)的幾起案子娶吞,更是在濱河造成了極大的恐慌垒迂,老刑警劉巖妒蛇,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绣夺,居然都是意外死亡吏奸,警方通過查閱死者的電腦和手機陶耍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門奋蔚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烈钞,“玉大人,你說我怎么就攤上這事毯欣÷” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵腹忽,是天一觀的道長。 經常有香客問我砚作,道長,這世上最難降的妖魔是什么偎巢? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任蔼夜,我火速辦了婚禮压昼,結果婚禮上求冷,老公的妹妹穿的比我還像新娘窍霞。我一直安慰自己,他們只是感情好但金,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布韭山。 她就那樣靜靜地躺著,像睡著了一般钱磅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盖淡,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天年柠,我揣著相機與錄音褪迟,去河邊找鬼冗恨。 笑死味赃,一個胖子當著我的面吹牛掀抹,可吹牛的內容都是我干的心俗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼城榛,長吁一口氣:“原來是場噩夢啊……” “哼谱轨!你這毒婦竟也來了吠谢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤工坊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后敢订,有當地人在樹林里發(fā)現(xiàn)了一具尸體王污,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡楚午,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矾柜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱驾。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡怪蔑,死狀恐怖,靈堂內的尸體忽然破棺而出缆瓣,到底是詐尸還是另有隱情喧枷,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布隧甚,位于F島的核電站车荔,受9級特大地震影響戚扳,放射性物質發(fā)生泄漏。R本人自食惡果不足惜咖城,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一茬腿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧切平,春花似錦、人聲如沸辐董。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孤澎,卻和暖如春届氢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背覆旭。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留型将,地道東北人寂祥。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓七兜,卻偏偏與公主長得像丸凭,于是被迫代替她去往敵國和親腕铸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容