這是一本介紹視覺SLAM 的書,也很可能是第一本以視覺SLAM 為主題的中文書。那么,SLAM 是什么?
SLAM 是Simultaneous Localization and Mapping 的縮寫,中文譯作“同時定位與地圖構(gòu)建”。它是指搭載特定傳感器的主體,在沒有環(huán)境先驗信息的情況下,于運動過程中建立環(huán)境的模型,同時估計自己的運動。如果這里的傳感器主要為相機,那就稱為“視覺SLAM”。
本書的主題就是視覺SLAM。這里我們刻意把許多個定義放到一句話中,是希望讀者有一個較明確的概念。首先,SLAM 的目的是解決“定位”與“地圖構(gòu)建”這兩個問題。也就是說,一邊要估計傳感器自身的位置,一邊要建立周圍環(huán)境的模型。那么怎么解決呢?這需要用到傳感器的信息。傳感器能以一定形式觀察外部的世界,不過不同傳感器觀察的方式是不同的。而之所以要花一本書的內(nèi)容去討論這個問題,是因為它很難——特別是我們希望實時地、在沒有先驗知識的情況下進(jìn)行SLAM。當(dāng)用相機作為傳感器時,我們要做的就是根據(jù)一張張連續(xù)運動的圖像(它們形成了一段視頻),從中推斷相機的運動,以及周圍環(huán)境的情況。
這似乎是個很直觀的問題。我們自己走進(jìn)陌生的環(huán)境時不就是這么做的嗎?
在計算機視覺(Computer Vision)創(chuàng)立之初,人們就想象著有朝一日計算機將和人一樣,通過眼睛去觀察世界,理解周遭的物體,探索未知的領(lǐng)域——這是一個美妙而又浪漫的夢想,吸引了無數(shù)的科研人員日夜為之奮斗。我們曾經(jīng)以為這件事情并不困難,然而進(jìn)展卻遠(yuǎn)不如預(yù)想的那么順利。我們眼中的花草樹木、蟲魚鳥獸,在計算機中卻是那樣的不同:它們只是一個個由數(shù)字排列而成的矩陣(Matrix)。讓計算機理解圖像的內(nèi)容,就像讓我們自己理解這些數(shù)字一樣困難。我們既不了解自己如何理解圖像,也不知道計算機該如何理解、探索這個世界。于是我們困惑了很久,直到幾十年后的今天,才發(fā)現(xiàn)了一點點成功的跡象:通過人工智能(Artificial Intelligence)和機器學(xué)習(xí)(Machine Learning)技術(shù),計算機漸漸能夠辨別出物體、人臉、聲音、文字——盡管它所用的方式(概率學(xué)建模)與我們是如此不同。另一方面,在SLAM 發(fā)展了將近30 年之后,我們的相機才漸漸開始能夠認(rèn)識到自身的位置,發(fā)覺自己在運動——雖然方式還是和我們?nèi)祟愑芯薮蟮牟町悺2贿^,至少研究者們已經(jīng)成功地搭建出種種實時SLAM系統(tǒng),有的能夠快速跟蹤自身位置,有的甚至能夠進(jìn)行實時的三維重建。
這件事情確實很困難,但我們已經(jīng)有了很大的進(jìn)展。更令人興奮的是,近年來隨著科技的發(fā)展,涌現(xiàn)出了一大批與SLAM 相關(guān)的應(yīng)用點。在許多地方,我們都希望知道自身的位置:室內(nèi)的掃地機和移動機器人需要定位,野外的自動駕駛汽車需要定位,空中的無人機需要定位,虛擬現(xiàn)實和增強現(xiàn)實的設(shè)備也需要定位。SLAM 是那樣重要。沒有它,掃地機就無法在房間自主地移動,只能盲目地游蕩;家用機器人就無法按照指令準(zhǔn)確到達(dá)某個房間;虛擬現(xiàn)實也將永遠(yuǎn)固定在座椅之上——所有這些新奇的事物都無法出現(xiàn)在現(xiàn)實生活中,那將多么令人遺憾。
今天的研究者和應(yīng)用開發(fā)人員,逐漸意識到了SLAM 技術(shù)的重要性。在國際上,SLAM 已經(jīng)有近三十年的研究歷史,也一直是機器人和計算機視覺的研究熱點。21 世紀(jì)以來,以視覺傳感器為中心的視覺SLAM 技術(shù),在理論和實踐上都經(jīng)歷了明顯的轉(zhuǎn)變與突破,正逐步從實驗室研究邁向市場應(yīng)用。同時,我們又遺憾地發(fā)現(xiàn),至少在國內(nèi),與SLAM 相關(guān)的論文、書籍仍然非常匱乏,讓許多對SLAM 技術(shù)感興趣的初學(xué)者無從一窺門徑。雖然SLAM 的理論框架基本趨于穩(wěn)定,但其編程實現(xiàn)仍然較為復(fù)雜,有著較高的技術(shù)門檻。剛步入SLAM 領(lǐng)域的研究者,不得不花很長的時間,學(xué)習(xí)大量的知識,往往要走過許多彎路才得以接近SLAM 技術(shù)的核心。
本書全面系統(tǒng)地介紹了以視覺傳感器為主體的視覺SLAM 技術(shù),我們希望它能(部分地)填補這方面資料的空白。我們會詳細(xì)地介紹SLAM 的理論背景、系統(tǒng)架構(gòu),以及各個模塊的主流做法。同時,極其重視實踐:本書介紹的所有重要算法,都將給出可以運行的實際代碼,以求加深讀者的理解。之所以這么做,主要是考慮到SLAM 畢竟是一項和實踐緊密相關(guān)的技術(shù)。再漂亮的數(shù)學(xué)理論,如果不能轉(zhuǎn)化為可以運行的代碼,那就仍是可望而不可即的空中樓閣,沒有實際意義。我們相信,實踐出真知,實踐出真愛。只有實際地演算過各種算法之后,你才能真正地認(rèn)識SLAM,真正地喜歡上科研。
自1986 年提出以來,SLAM 一直是機器人領(lǐng)域的熱點問題。關(guān)于它的文獻(xiàn)數(shù)以千計,想要對SLAM 發(fā)展史上的所有算法及變種做一個完整的說明,是十分困難而且沒有必要的。本書中會介紹SLAM 所牽涉的背景知識,例如射影幾何、計算機視覺、狀態(tài)估計理論、李群李代數(shù)等,并在這些背景知識之上,給出SLAM 這棵大樹的主干,而略去一部分形狀奇特、紋理復(fù)雜的枝葉。我們認(rèn)為這種做法是有效的。如果讀者能夠掌握主干的精髓,那么自然會有能力去探索那些邊緣的、細(xì)節(jié)的、錯綜復(fù)雜的前沿知識。所以,我們的目的是,讓SLAM 的初學(xué)者通過閱讀本書快速地成長為能夠探索這個領(lǐng)域邊緣的研究者。另一方面,即便你已經(jīng)是SLAM 領(lǐng)域的研究人員,本書也可能有一些你還覺得陌生的地方,可以讓你產(chǎn)生新的見解。
目前,與SLAM 相關(guān)的書籍主要有《概率機器人》(Probabilistic robotics)、《計算機視覺中的多視圖幾何》(Multiple View Geometry in Computer Vision)、《機器人學(xué)中的狀態(tài)估計》(State Estimation for Robotics: A Matrix-Lie-Group Approach)等。它們內(nèi)容豐富、論述全面、推導(dǎo)嚴(yán)謹(jǐn),是SLAM 研究者中膾炙人口的經(jīng)典教材。然而就目前來看,還存在兩個重要的問題:其一,這些圖書的目的在于介紹基礎(chǔ)理論,SLAM 只是其應(yīng)用之一。因此,它們并不能算是專門講解SLAM 的書籍。其二,它們的內(nèi)容偏重于數(shù)學(xué)理論,基本不涉及編程實現(xiàn),導(dǎo)致讀者經(jīng)常出現(xiàn)“書能看懂卻不會編程”的情況。而我們認(rèn)為,只有讀者親自實現(xiàn)了算法,調(diào)試了各個參數(shù),才能談得上真正理解了問題本身。
我們會提及SLAM 的歷史、理論、算法、現(xiàn)狀,并把完整的SLAM 系統(tǒng)分成幾個模塊:視覺里程計、后端優(yōu)化、建圖,以及回環(huán)檢測。我們將陪著讀者一點點實現(xiàn)這些模塊中的核心部分,探討它們在什么情況下有效,什么情況下會出問題,并指導(dǎo)大家在自己的機器上運行這些代碼。你會接觸到一些必要的數(shù)學(xué)理論和許多編程知識,會用到Eigen、OpenCV、PCL、g2o、Ceres 等庫à,掌握它們在Linux 操作系統(tǒng)中的使用方法。
從寫作風(fēng)格上,我們不想把本書寫成枯燥的理論書籍。技術(shù)類圖書應(yīng)該是嚴(yán)謹(jǐn)可靠的,但嚴(yán)謹(jǐn)不意味著刻板。一本優(yōu)秀的技術(shù)書應(yīng)該是生動有趣而易于理解的。如果你覺得“這個作者怎么這么不正經(jīng)”,敬請原諒,因為我并不是一個非常嚴(yán)肅的人。無論如何,有一件事是可以肯定的:只要你對這門新技術(shù)感興趣,在學(xué)習(xí)本書的過程中肯定會有所收獲!您會掌握與SLAM 相關(guān)的理論知識,你的編程能力也將有明顯的進(jìn)步。在很多時候,您會有一種“我在陪你一起做科研”的感覺,這正是我所希望的。但愿您能在此過程中發(fā)現(xiàn)研究的樂趣,喜歡這種“通過一番努力,看到事情順利運行”的成就感。
好了,話不多說,祝你旅行愉快!
如何使用本書
本書名為“視覺SLAM 十四講”。顧名思義,我們會像在學(xué)校里講課那樣,以“講”作為本書的基本單元。每一講都對應(yīng)一個固定的主題,其中會穿插“理論部分”和“實踐”。如果你完全沒有聽說過它們,那么應(yīng)該感到興奮,這說明你會從本書中收獲很多知識。你會經(jīng)常在腳注中發(fā)現(xiàn)一些神奇的東西。
“實踐部分”兩種內(nèi)容。通常是理論部分在前,實踐部分在后。在理論部分中,我們將介紹理解算法所必需的數(shù)學(xué)知識,并且大多數(shù)時候以敘述的方式,而不是像數(shù)學(xué)教科書那樣用“定義—定理—推論”的方式,因為我們覺得這樣的方式閱讀起來更容易一些,盡管有時候顯得不那么嚴(yán)謹(jǐn)。實踐部分主要是編程實現(xiàn),討論程序里各部分的含義及實驗結(jié)果。看到標(biāo)題中帶有“實踐”兩個字的章節(jié),你就應(yīng)該(興致勃勃地)打開電腦,和我們一起愉快地編寫代碼了。
值得一提的是,我們只會把與解決問題相關(guān)的數(shù)學(xué)知識放在書里,并盡量保持淺顯。雖然我們是工科生,但也要承認(rèn),某些做法只要經(jīng)驗上夠用,沒必要非得在數(shù)學(xué)上追求完備。只要我們知道這些算法能夠工作,并且數(shù)學(xué)家們告訴了我們在什么情況下可能不工作,那么我們就表示滿意,而不追究那些看似完美但實際復(fù)雜冗長的證明(當(dāng)然它們固有自己的價值)。由于SLAM 牽涉到了太多數(shù)學(xué)背景,為了防止使本書變成數(shù)學(xué)教科書,我們把一些細(xì)節(jié)上的推導(dǎo)和證明留作習(xí)題和補充閱讀材料,方便感興趣的讀者進(jìn)一步閱讀參考文獻(xiàn),更深入地掌握相關(guān)細(xì)節(jié)。
每一講正文之后,我們設(shè)計了一些習(xí)題。其中,帶* 號的習(xí)題是具有一定難度的。我們強烈建議讀者把習(xí)題都練習(xí)一遍,這對你掌握這些知識很有幫助。
全書內(nèi)容主要分為兩個部分。
第一部分為數(shù)學(xué)基礎(chǔ)篇,我們會以淺顯易懂的方式,鋪墊與視覺SLAM 相關(guān)的數(shù)學(xué)知識,包括:
第1 講是前言,介紹這本書的基本信息,習(xí)題部分主要包括一些自測題。
第2 講為SLAM 系統(tǒng)概述,介紹一個SLAM 系統(tǒng)由哪些模塊組成,各模塊的
具體工作是什么。實踐部分介紹編程環(huán)境的搭建過程以及IDE 的使用。
第3 講介紹三維空間運動,你將接觸到旋轉(zhuǎn)矩陣、四元數(shù)、歐拉角的相關(guān)知識,并且在Eigen 當(dāng)中使用它們。
第4 講為李群和李代數(shù)。即便你現(xiàn)在不懂李代數(shù)為何物,也沒有關(guān)系。你將學(xué)到李代數(shù)的定義和使用方式,然后通過Sophus 操作它們。
第5 講介紹針孔相機模型以及圖像在計算機中的表達(dá)。你將用OpenCV 來調(diào)取相機的內(nèi)外參數(shù)。
第6 講介紹非線性優(yōu)化,包括狀態(tài)估計理論基礎(chǔ)、最小二乘問題、梯度下降方法。你會完成一個使用Ceres 和g2o 進(jìn)行曲線擬合的實驗。
這些就是我們要用到的所有數(shù)學(xué)知識了,當(dāng)然,其中還隱含了你以前學(xué)過的高等數(shù)學(xué)和線性代數(shù)。我們保證它們看起來都不會很難。當(dāng)然,若你想進(jìn)一步深入挖掘,我們會提供一些參考資料供你閱讀,那些材料可能會比正文里講的知識難一些。 它們也可能成為今后相關(guān)行業(yè)的面試題,或許還能幫你在找工作時留個好印象。
第二部分為SLAM 技術(shù)篇。我們會使用第一部分所介紹的理論,講述視覺SLAM中各個模塊的工作原理。
第7 講為特征點法的視覺里程計。該講內(nèi)容比較多,包括特征點的提取與匹配、對極幾何約束的計算、PnP 和ICP 等。在實踐中,你將用這些方法去估計兩個圖像之間的運動。
第8 講為直接法的視覺里程計。你將學(xué)習(xí)光流和直接法的原理,然后利用g2o 實現(xiàn)一個簡單的RGB-D 直接法。
第9 講為視覺里程計的實踐章,你將搭建一個視覺里程計框架,綜合運用先前學(xué)過的知識,實現(xiàn)它的基本功能。這個過程中,你會碰到一些問題,例如優(yōu)化的必要性、關(guān)鍵幀的選擇等。
第10 講為后端優(yōu)化,主要為對Bundle Adjustment 的深入討論,包括基本的BA,以及如何利用稀疏性加速求解過程。你將用Ceres 和g2o 分別書寫一個BA 程序。
第11 講主要講后端優(yōu)化中的位姿圖。位姿圖是表達(dá)關(guān)鍵幀之間約束的一種更緊湊的形式。你將用g2o 和gtsam 對一個位姿球進(jìn)行優(yōu)化。
第12 講為回環(huán)檢測,主要介紹以詞袋方法為主的回環(huán)檢測。你將使用dbow3書寫字典訓(xùn)練程序和回環(huán)檢測程序。
第13 講為地圖構(gòu)建。我們會討論如何使用單目進(jìn)行稠密深度圖的估計(以及這是多么不可靠),然后討論RGB-D 的稠密地圖構(gòu)建過程。你會書寫極線搜索與塊匹配的程序,然后在RGB-D 中遇到點云地圖和八叉樹地圖的構(gòu)建問題。
第14 講主要介紹當(dāng)前的開源SLAM 項目以及未來的發(fā)展方向。相信在閱讀了前面的知識之后,你會更容易理解它們的原理,實現(xiàn)自己的新想法。
最后,如果你完全看不懂上面在說什么,那么恭喜你!這本書很適合你!加油!
代碼。本書所有源代碼均托管在github 上:https://github.com/gaoxiang12/slambook
強烈建議讀者下載它們以供隨時查看。代碼是按章節(jié)劃分的,比如,第7 講的內(nèi)容就會放在ch7 文件夾中。此外,對于書中用到的一些小型庫,會以壓縮包的形式放在3rdparty 文件夾下。對于像OpenCV 那種大中型庫,我們會在它們第一次出現(xiàn)時介紹其安裝方法。如果你對代碼有任何疑問,請單擊GitHub 上的Issues 按鈕,提交問題。如果確實是代碼出現(xiàn)問題,我們會及時進(jìn)行修改;即使是你的理解有偏差,我們也會盡可能回復(fù)。如果你不習(xí)慣使用Git,那么單擊右側(cè)包含download 字樣的按鈕將代碼下載至本地即可。
面向的讀者。本書面向?qū)LAM 感興趣的學(xué)生和研究人員。閱讀本書需要一定的基礎(chǔ),我們假設(shè)你具備以下知識:
高等數(shù)學(xué)、線性代數(shù)、概率論。這些是大部分讀者應(yīng)該在大學(xué)本科階段接觸過的基本數(shù)學(xué)知識。你應(yīng)當(dāng)明白矩陣和向量是什么,或者做微分和積分是什么意思。對于SLAM 中用到的專業(yè)知識,我們會額外加以介紹。
C++ 語言基礎(chǔ)。由于我們采用C++ 作為編碼語言,所以建議讀者至少熟悉這門語言的語法。比如,你應(yīng)該知道類是什么,如何使用C++ 標(biāo)準(zhǔn)庫,模板類如何使用,等等。我們會避免過多地使用技巧,但有些地方確實無法避免。此外,我們還使用了一些C++ 11 標(biāo)準(zhǔn)的內(nèi)容,不過,我們會在用到的地方加以解釋。
Linux 基礎(chǔ)。我們的開發(fā)環(huán)境是Linux 而非Windows,并且只提供Linux 下的源程序,不會再提供Windows 下的開發(fā)方法介紹。我們認(rèn)為,掌握Linux 是一個SLAM 研究人員所必需的,請初學(xué)者暫時不要問為什么,把本書的知識學(xué)好之后相信你會和我們有同樣的想法。各種程序庫在Linux 下的配置都非常便捷,
你也會在此過程中體會到Linux 的便利。如果讀者此前從未使用過Linux,那么最好找一本Linux 的教材稍加學(xué)習(xí)(掌握基本知識即可,一般就是相關(guān)圖書的前面幾章內(nèi)容)。我們不要求讀者具備高超的Linux 操作技能,但希望讀者至少知道“打開終端,進(jìn)入代碼目錄”是如何操作的。本講的習(xí)題里有一些Linux 知識自測題,如果你清楚自測題的答案,那么閱讀本書代碼不會有任何問題。
對SLAM 感興趣但不具備上述知識的讀者,可能在閱讀本書時會感到困難。如果你不了解C++ 的基本知識,可以讀一點C++ Primer Plus 之類的圖書入門;如果你缺少相關(guān)的數(shù)學(xué)知識,也可以先閱讀一些相關(guān)數(shù)學(xué)教材補充知識,不過我們認(rèn)為,對大多數(shù)大學(xué)本科水平的朋友,讀懂本書所需的數(shù)學(xué)背景肯定是具備了。代碼方面,你最好花點時間親自輸入一遍,再調(diào)節(jié)里面的參數(shù),看看效果會發(fā)生怎樣的改變。這會對學(xué)習(xí)很有幫助。
本書可作為SLAM 相關(guān)課程的教材,亦可作為課外自學(xué)材料使用。
致謝和聲明
在本書漫長的寫作過程中,我們得到了許多人的幫助,包括但不限于:
中科院的賀一家博士為第5講的相機模型部分提供了材料。
顏沁睿提供了第7講的公式推導(dǎo)材料。
華中科大的劉毅博士為本書第6講和第10講提供了材料。
眾多的老師、同學(xué)為本書提供了修改意見:肖錫臻、謝曉佳、耿欣、李帥杰、劉富強、袁夢、孫志明、陳昊升、王京、朱晏辰、丁文東、范帝楷、衡昱帆、高揚、李少朋、吳博、閆雪嬌、張騰、鄭帆、盧美奇、楊楠,等等。在此向他們表示感謝。
此外,感謝我的導(dǎo)師張濤教授一直以來對我的支持和幫助。感謝電子工業(yè)出版社鄭柳潔編輯的支持。沒有他們的幫助,本書不可能以現(xiàn)在的面貌來到讀者面前。本書的成書與出版是所有人共同努力的結(jié)晶,盡管我沒法把他們都列在作者列表中,但是它的出版離不開他們的工作。
本書寫作過程中參考了大量文獻(xiàn)和論文。其中大部分?jǐn)?shù)學(xué)理論知識是前人研究的成果,并非我的原創(chuàng)。一小部分實驗設(shè)計亦來自各開源代碼的演示程序,不過大部分是我自己編寫的。此外,也有一些圖片摘自公開發(fā)表的期刊或會議論文,文中均已注明。
未做說明的圖像,或為原創(chuàng),或來自網(wǎng)絡(luò),恕不一一列舉。如有問題,請與我們聯(lián)系,我們會在第一時間加以修正。
本書涉及知識點眾多,錯漏在所難免。如有疑問,歡迎通過電子郵件與我聯(lián)系。
感謝我的愛人劉麗蓮女士長期的理解和支持。這本書是獻(xiàn)給她的。
第1 講預(yù)備知識 1
1.1 本書講什么1
1.2 如何使用本書3
1.2.1 組織方式3
1.2.2 代碼5
1.2.3 面向的讀者6
1.3 風(fēng)格約定6
1.4 致謝和聲明7
第2 講初識SLAM 9
2.1 引子:小蘿卜的例子11
2.2 經(jīng)典視覺SLAM 框架17
2.2.1 視覺里程計17
2.2.2 后端優(yōu)化19
2.2.3 回環(huán)檢測20
2.2.4 建圖21
2.3 SLAM 問題的數(shù)學(xué)表述22
2.4 實踐:編程基礎(chǔ) 25
2.4.1 安裝Linux 操作系統(tǒng)25
2.4.2 Hello SLAM27
2.4.3 使用cmake28
2.4.4 使用庫30
2.4.5 使用IDE32
第3 講三維空間剛體運動37
3.1 旋轉(zhuǎn)矩陣39
3.1.1 點和向量,坐標(biāo)系39
3.1.2 坐標(biāo)系間的歐氏變換40
3.1.3 變換矩陣與齊次坐標(biāo)42
3.2 實踐:Eigen 44
3.3 旋轉(zhuǎn)向量和歐拉角48
3.3.1 旋轉(zhuǎn)向量48
3.3.2 歐拉角50
3.4 四元數(shù)51
3.4.1 四元數(shù)的定義51
3.4.2 四元數(shù)的運算53
3.4.3 用四元數(shù)表示旋轉(zhuǎn)55
3.4.4 四元數(shù)到旋轉(zhuǎn)矩陣的轉(zhuǎn)換55
3.5 * 相似、仿射、射影變換56
3.6 實踐:Eigen 幾何模塊57
3.7 可視化演示60
第4 講李群與李代數(shù)62
4.1 李群與李代數(shù)基礎(chǔ) 64
4.1.1 群64
4.1.2 李代數(shù)的引出65
4.1.3 李代數(shù)的定義 67
4.1.4 李代數(shù)so(3) 67
4.1.5 李代數(shù)se(3)68
4.2 指數(shù)與對數(shù)映射69
4.2.1 SO(3) 上的指數(shù)映射69
4.2.2 SE(3) 上的指數(shù)映射.70
4.3 李代數(shù)求導(dǎo)與擾動模型72
4.3.1 BCH 公式與近似形式72
4.3.2 SO(3) 李代數(shù)上的求導(dǎo)73
4.3.3 李代數(shù)求導(dǎo)74
4.3.4 擾動模型(左乘)75
4.3.5 SE(3) 上的李代數(shù)求導(dǎo)76
4.4 實踐:Sophus76
4.5 * 相似變換群與李代數(shù).79
4.6 小結(jié)81
第5 講相機與圖像82
5.1 相機模型 84
5.1.1 針孔相機模型84
5.1.2 畸變87
5.1.3 雙目相機模型 90
5.1.4 RGB-D 相機模型92
5.2 圖像93
5.3 實踐:圖像的存取與訪問95
5.3.1 安裝OpenCV95
5.3.2 操作OpenCV 圖像96
5.4 實踐:拼接點云99
第6 講非線性優(yōu)化104
6.1 狀態(tài)估計問題106
6.1.1 最大后驗與最大似然106
6.1.2 最小二乘的引出 108
6.2 非線性最小二乘109
6.2.1 一階和二階梯度法110
6.2.2 高斯牛頓法111
6.2.3 列文伯格—馬夸爾特方法113
6.2.4 小結(jié)114
6.3 實踐:Ceres115
6.3.1 Ceres 簡介 116
6.3.2 安裝Ceres116
6.3.3 使用Ceres 擬合曲線 117
6.4 實踐:g2o121
6.4.1 圖優(yōu)化理論簡介121
6.4.2 g2o 的編譯與安裝122
6.4.3 使用g2o 擬合曲線123
6.5 小結(jié)128
第7 講視覺里程計1130
7.1 特征點法132
7.1.1 特征點132
7.1.2 ORB 特征134
7.1.3 特征匹配137
7.2 實踐:特征提取和匹配138
7.3 2D?2D: 對極幾何141
7.3.1 對極約束141
7.3.2 本質(zhì)矩陣143
7.3.3 單應(yīng)矩陣146
7.4 實踐:對極約束求解相機運動148
7.5 三角測量153
7.6 實踐:三角測量154
7.6.1 三角測量代碼154
7.6.2 討論156
7.7 3D?2D:PnP157
7.7.1 直接線性變換158
7.7.2 P3P159
7.7.3 Bundle Adjustment 161
7.8 實踐:求解PnP165
7.8.1 使用EPnP 求解位姿165
7.8.2 使用BA 優(yōu)化166
7.9 3D?3D:ICP172
7.9.1 SVD 方法173
7.9.2 非線性優(yōu)化方法 175
7.10 實踐:求解ICP176
7.10.1 SVD 方法176
7.10.2 非線性優(yōu)化方法178
7.11 小結(jié)180
第8 講視覺里程計2182
8.1 直接法的引出184
8.2 光流(Optical Flow)185
8.3 實踐:LK 光流187
8.3.1 使用TUM 公開數(shù)據(jù)集187
8.3.2 使用LK 光流188
8.4 直接法(Direct Method)192
8.4.1 直接法的推導(dǎo) 192
8.4.2 直接法的討論195
8.5 實踐:RGB-D 的直接法196
8.5.1 稀疏直接法196
8.5.2 定義直接法的邊197
8.5.3 使用直接法估計相機運動 199
8.5.4 半稠密直接法200
8.5.5 直接法的討論 202
8.5.6 直接法優(yōu)缺點總結(jié) 203
第9 講實踐:設(shè)計前端205
9.1 搭建VO 框架 206
9.1.1 確定程序框架207
9.1.2 確定基本數(shù)據(jù)結(jié)構(gòu)208
9.1.3 Camera 類210
9.1.4 Frame 類212
9.1.5 MapPoint 類 213
9.1.6 Map 類 213
9.1.7 Config 類 214
9.2 基本的VO:特征提取和匹配216
9.2.1 兩兩幀的視覺里程計216
9.2.2 討論224
9.3 改進(jìn):優(yōu)化PnP 的結(jié)果 224
9.4 改進(jìn):局部地圖 227
9.5 小結(jié)233
第10 講后端1 235
10.1 概述237
10.1.1 狀態(tài)估計的概率解釋237
10.1.2 線性系統(tǒng)和KF239
10.1.3 非線性系統(tǒng)和EKF242
10.1.4 EKF 的討論243
10.2 BA 與圖優(yōu)化245
10.2.1 投影模型和BA 代價函數(shù) 245
10.2.2 BA 的求解247
10.2.3 稀疏性和邊緣化248
10.2.4 魯棒核函數(shù)255
10.2.5 小結(jié)256
10.3 實踐:g2o257
10.3.1 BA 數(shù)據(jù)集257
10.3.2 g2o 求解BA258
10.3.3 求解262
10.4 實踐:Ceres 264
10.4.1 Ceres 求解BA 265
10.4.2 求解267
10.5 小結(jié)269
第11 講后端2 270
11.1 位姿圖(Pose Graph)271
11.1.1 Pose Graph 的意義271
11.1.2 Pose Graph 的優(yōu)化272
11.2 實踐:位姿圖優(yōu)化274
11.2.1 g2o 原生位姿圖 274
11.2.2 李代數(shù)上的位姿圖優(yōu)化278
11.2.3 小結(jié)284
11.3 * 因子圖優(yōu)化初步285
11.3.1 貝葉斯網(wǎng)絡(luò)285
11.3.2 因子圖286
11.3.3 增量特性288
11.4 * 實踐:gtsam 289
11.4.1 安裝gtsam 4.0289
11.4.2 位姿圖優(yōu)化290
第12 講回環(huán)檢測297
12.1 回環(huán)檢測概述299
12.1.1 回環(huán)檢測的意義299
12.1.2 方法 300
12.1.3 準(zhǔn)確率和召回率301
12.2 詞袋模型303
12.3 字典 305
12.3.1 字典的結(jié)構(gòu)305
12.3.2 實踐:創(chuàng)建字典306
12.4 相似度計算309
12.4.1 理論部分309
12.4.2 實踐:相似度的計算310
12.5 實驗分析與評述314
12.5.1 增加字典規(guī)模314
12.5.2 相似性評分的處理316
12.5.3 關(guān)鍵幀的處理316
12.5.4 檢測之后的驗證317
12.5.5 與機器學(xué)習(xí)的關(guān)系317
第13 講建圖319
13.1 概述320
13.2 單目稠密重建322
13.2.1 立體視覺322
13.2.2 極線搜索與塊匹配323
13.2.3 高斯分布的深度濾波器325
13.3 實踐:單目稠密重建328
13.4 實驗分析與討論339
13.4.1 像素梯度的問題339
13.4.2 逆深度340
13.4.3 圖像間的變換 341
13.4.4 并行化:效率的問題342
13.4.5 其他的改進(jìn)343
13.5 RGB-D 稠密建圖343
13.5.1 實踐:點云地圖344
13.5.2 八叉樹地圖347
13.5.3 實踐:八叉樹地圖350
13.6 *TSDF 地圖和Fusion 系列352
13.7 小結(jié)356
第14 講SLAM:現(xiàn)在與未來357
14.1 當(dāng)前的開源方案358
14.1.1 MonoSLAM358
14.1.2 PTAM359
14.1.3 ORB-SLAM361
14.1.4 LSD-SLAM363
14.1.5 SVO 364
14.1.6 RTAB-MAP366
14.1.7 其他367
14.2 未來的SLAM 話題367
14.2.1 視覺+ 慣性導(dǎo)航SLAM367
14.2.2 語義SLAM369
14.2.3 SLAM 的未來 370
附錄A 高斯分布的性質(zhì)371
A.1 高斯分布371
A.2 高斯分布的運算371
A.2.1 線性運算371
A.2.2 乘積372
A.2.3 復(fù)合運算372
A.3 復(fù)合的例子372
附錄B ROS 入門374
B.1 ROS 是什么374
B.2 ROS 的特點375
B.3 如何快速上手ROS375
參考文獻(xiàn)377