描述
本書特色
SLAM視覺屬於電腦視覺和機器人研究的交叉領域,本書系統介紹SLAM視覺(同時定位與地圖構置)所需的基本知識與核心演算法,既包括數學理論基礎,如三維空間的剛體運動、非線性優化;又涵蓋電腦視覺的演算法實現,例如多視圖幾何、回環檢測等。書中提供大量的實例程式碼供讀者學習,從而更深入地掌握內容。
► 更多的實例 增加一些實驗程式來介紹演算法的原理。本書中的許多程式,除了呼叫函數庫函數,還提供底層的實現。
► 更深入的內容 主要是從第7講至第12講的部分,重新定義那些容易引起誤解的內容。
► 更完整的專案項目 在介紹所有必要知識之後,向讀者展現一個完整的SLAM 系統是如何工作的。以精簡的程式實現完整的功能,讀者會獲得一個由幾百行程式實現、有完整前後端的SLAM 系統。
► 更通俗、簡潔的表達 這是一本好書的標準,作者重新製作部分插圖,清晰簡明的讓讀者更清楚易懂。
內容簡介
這是一本介紹視覺SLAM 的書。
SLAM 是Simultaneous Localization and Mapping 的縮寫,中文譯作「同時定位與地圖型建置」。它是指搭載特定感測器的主體,在沒有環境先驗資訊的情況下,於運動過程中建立環境的模型,同時估計自己的運動。
本書的主題就是SLAM視覺, SLAM 的目的是解決「定位」與「地圖型建置」這兩個問題。也就是說,一邊要估計感測器本身的位置,一邊要建立周圍環境的模型。近年來隨著科技的發展,湧現出了一大批與SLAM 相關的應用點。
本書全面系統地介紹了以視覺感測器為主體的視覺SLAM 技術,詳細地介紹SLAM 的理論背景、系統架構,以及各個模組的主流做法。同時,極其重視實作:本書介紹的所有重要演算法,都將列出可以執行的實際程式,以求加深讀者的了解。並把完整的SLAM 系統分成幾個模組:視覺里程計、後端最佳化、建圖,以及回路檢測。我們將陪著讀者一點點實現這些模組中的核心部分,探討它們在什麼情況下有效,什麼情況下會出問題,並指導大家在自己的機器上執行這些程式。你會接觸到一些必要的數學理論和許多程式設計知識,會用到Eigen、OpenCV、PCL、g2o、Ceres 等函數庫,掌握它們在Linux 作業系統中的使用方法。
全書分為三大部分:
「數學基礎篇」
第1 講 是預備知識,介紹本書的基本資訊,習題部分主要包含一些自測題。
第2 講 為SLAM 系統概述,介紹一個SLAM 系統由哪些模組成,各模組的實際工作是什麼。實作部分介紹程式設計環境的架設過程及IDE 的使用。
第3 講 介紹3D 空間剛體運動,你將接觸到旋轉矩陣、尤拉角、四元數的相關知識,並且在Eigen 中使用它們。
第4 講介紹李群與李代數。即使你現在不懂李代數為何物,也沒有關係。你將學到李代數的定義和使用方式,然後透過Sophus 操作它們。
第5 講 介紹針孔相機模型及影像在電腦中的表達。你將用OpenCV 調取相機的內外參數。
第6 講 介紹非線性最佳化,包含狀態估計理論基礎、最小平方問題、梯度下降方法。你會完成一個使用Ceres 和g2o 進行曲線擬合的實驗。
「實作應用篇」
第7 講 為特徵點法的視覺里程計。該講內容比較多,包含特徵分析與比對、對極幾何約束的計算、PnP 和ICP 等。在實作中,你將用這些方法估計兩個影像之間的運動。
第8 講 為直接法的視覺里程計。你將學習光流和直接法的原理,然後實現一個簡單的直接法運動估計。
第9 講 為後端最佳化,主要為對Bundle Adjustment(BA)的深入討論,包含基本的BA,以及如何利用稀疏性加速求解過程。你將用Ceres 和g2o 分別撰寫一個BA 程式。
第10 講 主要介紹後端最佳化中的位姿圖。位姿圖是表達關鍵頁框之間約束的一種更緊湊的形式。我們會介紹SE(3)和Sim(3)的位姿圖,同時你將使用g2o 對一個位姿球進行最佳化。
第11 講 為回路檢測,主要介紹以詞袋方法為主的回路檢測。你將使用DBoW3 撰寫字典訓練程式和回路檢測程式。
第12 講 為地圖型建置。我們會討論如何使用一元進行稠密深度圖的估計(以及這是多麼不可靠),然後討論RGB-D 的稠密地圖型建置過程。你會撰寫極線搜索與塊符合的程式,然後在RGB-D 中遇到點雲地圖和八叉樹地圖的建置問題。
第13 講 是專案實作,你將架設一個二元視覺里程計架構,綜合運用先前學過的知識,實現它的基本功能。在這個過程中,你會碰到一些問題,例如最佳化的必要性、關鍵頁框的選擇等。我們會在Kitti 資料集上測試它的效能,討論一些改進的方法。
第14 講 主要介紹目前的開放原始碼SLAM 方案及未來的發展方向。相信在閱讀了前面的知識之後,你會更容易了解它們的原理,實現自己的新想法。
適合讀者群 機器人技術工程師、對 SLAM 有興趣者,或 SLAM 相關課程科系師生作為教材或自學參考。
作者簡介
高翔
清華大學自動化系博士,慕尼克工業大學博士後。專注於電腦視覺、定位與建圖、機器學習等,著、譯作有《視覺SLAM十四講:從理論到實踐》、《機器人學中的狀態估計》,在RAS、Auto Robotics、IROS等期刊會議上發表論文。現從事自動駕駛車輛研發工作。
張濤
清華大學自動化系教授。1999年獲清華大學自動化系檢測技術與自動化裝置專業博士學位,2002年獲日本國立佐賀大學工學系研究科系統控制專業博士學位。研究課題包括機器人、航空航太、電腦視覺等。
劉毅
華中科技大學圖像與人工智慧研究所博士。專注於影像處理、三維重建、視覺SLAM,以及感測器融合研究和應用,曾在深圳市大疆創新公司,英特爾中國研究院等單位實習。
顏沁睿
比利時荷語魯汶大學人工智慧碩士,電子工程學士(GroupT)。長期致力於研究人工智慧技術在機器人領域的應用,包括電腦視覺、機器學習和SLAM。現擔任地平線機器人公司智慧駕駛部演算法工程師。
序
《視覺SLAM 十四講:從理論到實作》出版已經兩年多。兩年來,這本書經歷了13 次重印,在GitHub 上擁有2500 個星星,也在業界引起了廣泛的關注和討論。大多數讀者評價是正面的,當然,書中也有些地方不夠令人滿意。例如,這本書針對初學者,有些應該深入的地方講得不夠深入;書中的數學符號不夠統一,有些地方容易令讀者產生誤解;專案實作章節內容不夠豐富,介紹較淺,等等。實際上,我在2016 年中期開始創作第1 版,所有文字、圖片和程式都是從零開始準備的,再加上當時在讀博士,也是第一次寫這麼厚的書,錯漏在所難免。2018 年,我在慕尼黑工大給學生講SLAM 課程,期間又累積了一些材料,所以本書從內容上更豐富、更合理。在第1 版的基礎上做了以下改動:
- 更多的實例。增加了一些實驗程式來介紹演算法的原理。在第1 版中,多數實作程式呼叫了各種函數庫中的內建函數,現在我認為更深入地介紹底層計算會更好,所以本書中的許多程式,除了呼叫函數庫函數,還提供了底層的實現。
- 更深入的內容。主要是從第7 講至第12 講的部分,同時刪除了一些泛泛而談的邊角料(例如GTSAM 相關內容1)。對第1 版大部分數學公式進行了審查,重新定義了那些容易引起誤解的內容。
1 因數圖最佳化現在已有完整的書籍《機器人感知:因數圖在SLAM 中的應用》,用一小節很難介紹清楚。
- 更完整的專案項目。將第1 版的第9 講移至第13 講。於是,我們可以在介紹了所有必要知識之後,向大家展現一個完整的SLAM 系統是如何工作的。
相比於第1 版,我在本書的專案中將追求以精簡的程式實現完整的功能,你會獲得一個由幾百行程式實現的、有完整前後端的SLAM 系統。
- 更通俗、簡潔的表達。我覺得這是一本好書的標準,特別是當介紹一些看起來高深莫測的數學知識時。我重新製作了部分插圖,使它們即使在黑白印刷條件下也能看起來很清楚。
當然,每講前的簡筆劃我是不會改的!
總之,我儘量做到深入淺出,也希望本書能夠給你帶來更加舒適的閱讀體驗。
目錄
前言
01 | 預備知識
1.1 本書講什麼
1.2 如何使用本書
1.3 風格約定
1.4 致謝和宣告
1.5 習題(基礎自測題)
第一部分 數學基礎
02 | 初識SLAM
2.1 引子:小蘿蔔的實例
2.2 經典視覺SLAM 架構
2.3 SLAM 問題的數學表述
2.4 實作:程式設計基礎
2.5 習題
03 | 3D 空間剛體運動
3.1 旋轉矩陣
3.2 實作:Eigen
3.3 旋轉向量和尤拉角
3.4 四元數
3.5 相似、仿射、射影轉換
3.6 實作:Eigen 幾何模組
3.7 視覺化示範
3.8 習題
04 | 李群與李代數
4.1 李群與李代數基礎
4.2 指數與對數對映
4.3 李代數求導與擾動模型
4.4 實作:Sophus
4.5 相似轉換群與李代數
4.6 小結
4.7 習題
05 | 相機與影像
5.1 相機模型
5.2 影像
5.3 實作:電腦中的影像
5.4 實作:3D 視覺
5.5 習題
06 | 非線性最佳化
6.1 狀態估計問題
6.2 非線性最小平方
6.3 實作:曲線擬合問題
6.4 小結
6.5 習題
第二部分 實踐應用
07 | 視覺里程計1
7.1 特徵點法
7.2 實作:特徵分析和比對
7.3 2D−2D:對極幾何
7.4 實作:對極約束求解相機運動
7.5 三角測量
7.6 實作:三角測量
7.7 3D−2D:PnP
7.8 實作:求解PnP
7.9 3D−3D:ICP
7.10 實作:求解ICP
7.11 小結
7.12 習題
08 | 視覺里程計2
8.1 直接法的引出
8.2 2D光流
8.3 實作:LK 光流
8.4 直接法
8.5 實作:直接法
8.6 習題
09 | 後端1
9.1 概述
9.2 BA與圖最佳化
9.3 實作:Ceres BA
9.4 實作:g2o 求解BA
9.5 小結
9.6 習題
10 | 後端2
10.1 滑動視窗濾波和最佳化
10.2 位姿圖
10.3 實作:位姿圖最佳化
10.4 習題
11 | 回路檢測
11.1 概述
11.2 詞袋模型
11.3 字典
11.4 相似度計算
11.5 實驗分析與評述
11.6 習題
12 | 建圖
12.1 概述
12.2 一元稠密重建
12.3 實作:一元稠密重建
12.4 RGB-D 稠密建圖
12.5 TSDF 地圖和Fusion 系列
12.6 小結
12.7 習題
13 | 實作:設計SLAM 系統
13.1 為什麼要單獨列專案章節
13.2 專案架構
13.3 實現
13.4 實驗效果
13.5 習題
14 | SLAM:現在與未來
14.1 目前的開放原始碼方案
14.2 未來的SLAM 話題
14.3 習題
A | 高斯分佈的性質
A.1 高斯分佈
A.2 高斯分佈的運算
A.3 複合的實例
B | 矩陣求導
B.1 純量函數對向量求導
B.2 向量函數對向量求導
C | ROS 入門
C.1 ROS 是什麼
C.2 ROS 的特點
C.3 如何快速上手ROS