這是一本介紹視覺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(BAA2 8 9 ; &# 3 0 3 4 0 ; &# 2 8 1 4 5 ; &# 2 0 8 3 7 ; &# 3 5 3 4 2 ; &# 3 5 5 4 2 ; &# 6 5 2 9 2 ; &# 2 1 2 5 3 ; &# 2 1 5 4 7 ; &# 2 2 5 2 2 ; &# 2 6 4 1 2 ; &# 3 0 3 4 0 ; &# 6 6 ; &# 6 5 ; &# 6 5 2 9 2 ; &# 2 0 1 9 7 ; &# 2 1 4 5 0 ; &# 2 2 9 1 4 ; &# 2 0 3 0 9 ; &# 2 1 0 3 3 ; &# 2 9 9 9 2 ; &# 3 1 2 3 2 ; &# 3 0 0 9 5 ; &# 2 4 6 1 5 ; &# 2 1 1 5 2 ; &# 3 6 8 9 5 ; &# 2 7 7 1 4 ; &# 3 5 2 9 9 ; &# 3 6 9 4 2 ; &# 3 1 2 4 3 ; &# 1 2 2 9 0 ; &# 2 0 3 2 0 ; &# 2 3 5 5 9 ; &# 2 9 9 9 2 ; &# 6 7 ; &# 1 0 1 ; &# 1 1 4 ; &# 1 0 1 ; &# 1 1 5 ; &# 3 2 ; &# 2 1 6 4 4 ; &# 1 0 3 ; &# 5 0 ; &# 1 1 1 ; &# 3 2 ; &# 2 0 9 9 8 ; &# 2 1 0 2 9 ; &# 2 5 7 7 6 ; &# 2 3 5 3 1 ; &# 1 9 9 6 8 ; &# 2 0 4 9 1 ; &# 6 6 ; &# 6 5 ; &# 3 2 ; &# 3 1 2 4 3 ; &# 2 4 3 3 5 ; &# 1 2 2 9 0 ; b r / > b r / > &# 1 2 2 8 8 ; &# 1 2 2 8 8 ; &# 3 1 5 3 2 ; &# 4 9 ; &# 4 8 ; &# 3 2 ; &# 3 5 6 1 1 ; &# 3 2 ; &# 2 0 0 2 7 ; &# 3 5 2 0 1 ; &# 2 0 1 7 1 ; &# 3 2 0 5 7 ; &# 2 4 4 6 0 ; &# 3 1 4 7 1 ; &# 2 6 3 6 8 ; &# 2 0 3 3 9 ; &# 2 1 2 7 0 ; &# 2 0 0 1 3 ; &# 3 0 3 4 0 ; &# 2 0 3 0 1 ; &# 2 3 0 3 9 ; &# 2 2 2 9 4 ; &# 1 2 2 9 0 ; &# 2 0 3 0 1 ; &# 2 3 0 3 9 ; &# 2 2 2 9 4 ; &# 2 6 1 5 9 ; &# 3 4 9 2 0 ; &# 3 6 9 4 8 ; &# 3 8 3 6 4 ; &# 3 7 7 4 9 ; &# 3 8 9 1 3 ; &# 2 6 6 9 4 ; &# 2 0 0 4 3 ; &# 3 8 2 9 1 ; &# 3 2 0 0 4 ; &# 2 6 4 6 3 ; &# 3 0 3 4 0 ; &# 1 9 9 6 8 ; &# 3 1 2 7 8 ; &# 2 6 3 5 6 ; &# 3 2 2 0 2 ; &# 2 8 2 3 4 ; &# 3 0 3 4 0 ; &# 2 4 4 1 8 ; &# 2 4 3 3 5 ; &# 1 2 2 9 0 ; &# 2 5 1 0 5 ; &# 2 0 4 9 7 ; &# 2 6 3 7 1 ; &# 2 0 1 7 1 ; &# 3 2 0 5 7 ; &# 8 3 ; &# 6 9 ; &# 4 0 ; &# 5 1 ; &# 4 1 ; &# 2 1 6 4 4 ; &# 8 3 ; &# 1 0 5 ; &# 1 0 9 ; &# 4 0 ; &# 5 1 ; &# 4 1 ; &# 3 0 3 4 0 ; &# 2 0 3 0 1 ; &# 2 3 0 3 9 ; &# 2 2 2 9 4 ; &# 6 5 2 9 2 ; &# 2 1 5 1 6 ; &# 2 6 1 7 8 ; &# 2 0 3 2 0 ; &# 2 3 5 5 9 ; &# 2 0 3 5 1 ; &# 2 9 9 9 2 ; &# 1 0 3 ; &# 5 0 ; &# 1 1 1 ; &# 3 2 ; &# 2 3 5 6 5 ; &# 1 9 9 6 8 ; &# 2 0 4 9 1 ; &# 2 0 3 0 1 ; &# 2 3 0 3 9 ; &# 2 9 6 9 9 ; &# 3 6 9 1 4 ; &# 3 4 8 9 2 ; &# 2 6 3 6 8 ; &# 2 0 3 3 9 ; &# 2 1 2 7 0 ; &# 1 2 2 9 0 ; b r / > b r / > &# 1 2 2 8 8 ; &# 1 2 2 8 8 ; &# 3 1 5 3 2 ; &# 4 9 ; &# 4 9 ; &# 3 2 ; &# 3 5 6 1 1 ; &# 3 2 ; &# 2 8 8 5 8 ; &# 2 2 2 3 8 ; &# 3 6 3 3 5 ; &# 2 7 2 9 8 ; &# 2 8 2 0 4 ; &# 6 5 2 9 2 ; &# 2 0 0 2 7 ; &# 3 5 2 0 1 ; &# 2 0 1 7 1 ; &# 3 2 0 5 7 ; &# 2 0 1 9 7 ; &# 3 5 4 2 2 ; &# 3 4 9 5 5 ; &# 2 6 0 4 1 ; &# 2 7 8 6 1 ; &# 2 8 8 5 8 ; &# 2 0 0 2 7 ; &# 3 0 3 4 0 ; &# 2 2 2 3 8 ; &# 3 6 3 3 5 ; &# 2 7 2 9 8 ; &# 2 8 2 0 4 ; &# 1 2 2 9 0 ; &# 2 0 3 2 0 ; &# 2 3 5 5 9 ; &# 2 0 3 5 1 ; &# 2 9 9 9 2 ; &# 6 8 ; &# 6 6 ; &# 1 1 1 ; &# 8 7 ; &# 5 1 ; &# 3 2 ; &# 2 5 7 7 6 ; &# 2 3 5 3 1 ;
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(BAA2 8 9 ; &# 3 0 3 4 0 ; &# 2 8 1 4 5 ; &# 2 0 8 3 7 ; &# 3 5 3 4 2 ; &# 3 5 5 4 2 ; &# 6 5 2 9 2 ; &# 2 1 2 5 3 ; &# 2 1 5 4 7 ; &# 2 2 5 2 2 ; &# 2 6 4 1 2 ; &# 3 0 3 4 0 ; &# 6 6 ; &# 6 5 ; &# 6 5 2 9 2 ; &# 2 0 1 9 7 ; &# 2 1 4 5 0 ; &# 2 2 9 1 4 ; &# 2 0 3 0 9 ; &# 2 1 0 3 3 ; &# 2 9 9 9 2 ; &# 3 1 2 3 2 ; &# 3 0 0 9 5 ; &# 2 4 6 1 5 ; &# 2 1 1 5 2 ; &# 3 6 8 9 5 ; &# 2 7 7 1 4 ; &# 3 5 2 9 9 ; &# 3 6 9 4 2 ; &# 3 1 2 4 3 ; &# 1 2 2 9 0 ; &# 2 0 3 2 0 ; &# 2 3 5 5 9 ; &# 2 9 9 9 2 ; &# 6 7 ; &# 1 0 1 ; &# 1 1 4 ; &# 1 0 1 ; &# 1 1 5 ; &# 3 2 ; &# 2 1 6 4 4 ; &# 1 0 3 ; &# 5 0 ; &# 1 1 1 ; &# 3 2 ; &# 2 0 9 9 8 ; &# 2 1 0 2 9 ; &# 2 5 7 7 6 ; &# 2 3 5 3 1 ; &# 1 9 9 6 8 ; &# 2 0 4 9 1 ; &# 6 6 ; &# 6 5 ; &# 3 2 ; &# 3 1 2 4 3 ; &# 2 4 3 3 5 ; &# 1 2 2 9 0 ; b r / > b r / > &# 1 2 2 8 8 ; &# 1 2 2 8 8 ; &# 3 1 5 3 2 ; &# 4 9 ; &# 4 8 ; &# 3 2 ; &# 3 5 6 1 1 ; &# 3 2 ; &# 2 0 0 2 7 ; &# 3 5 2 0 1 ; &# 2 0 1 7 1 ; &# 3 2 0 5 7 ; &# 2 4 4 6 0 ; &# 3 1 4 7 1 ; &# 2 6 3 6 8 ; &# 2 0 3 3 9 ; &# 2 1 2 7 0 ; &# 2 0 0 1 3 ; &# 3 0 3 4 0 ; &# 2 0 3 0 1 ; &# 2 3 0 3 9 ; &# 2 2 2 9 4 ; &# 1 2 2 9 0 ; &# 2 0 3 0 1 ; &# 2 3 0 3 9 ; &# 2 2 2 9 4 ; &# 2 6 1 5 9 ; &# 3 4 9 2 0 ; &# 3 6 9 4 8 ; &# 3 8 3 6 4 ; &# 3 7 7 4 9 ; &# 3 8 9 1 3 ; &# 2 6 6 9 4 ; &# 2 0 0 4 3 ; &# 3 8 2 9 1 ; &# 3 2 0 0 4 ; &# 2 6 4 6 3 ; &# 3 0 3 4 0 ; &# 1 9 9 6 8 ; &# 3 1 2 7 8 ; &# 2 6 3 5 6 ; &# 3 2 2 0 2 ; &# 2 8 2 3 4 ; &# 3 0 3 4 0 ; &# 2 4 4 1 8 ; &# 2 4 3 3 5 ; &# 1 2 2 9 0 ; &# 2 5 1 0 5 ; &# 2 0 4 9 7 ; &# 2 6 3 7 1 ; &# 2 0 1 7 1 ; &# 3 2 0 5 7 ; &# 8 3 ; &# 6 9 ; &# 4 0 ; &# 5 1 ; &# 4 1 ; &# 2 1 6 4 4 ; &# 8 3 ; &# 1 0 5 ; &# 1 0 9 ; &# 4 0 ; &# 5 1 ; &# 4 1 ; &# 3 0 3 4 0 ; &# 2 0 3 0 1 ; &# 2 3 0 3 9 ; &# 2 2 2 9 4 ; &# 6 5 2 9 2 ; &# 2 1 5 1 6 ; &# 2 6 1 7 8 ; &# 2 0 3 2 0 ; &# 2 3 5 5 9 ; &# 2 0 3 5 1 ; &# 2 9 9 9 2 ; &# 1 0 3 ; &# 5 0 ; &# 1 1 1 ; &# 3 2 ; &# 2 3 5 6 5 ; &# 1 9 9 6 8 ; &# 2 0 4 9 1 ; &# 2 0 3 0 1 ; &# 2 3 0 3 9 ; &# 2 9 6 9 9 ; &# 3 6 9 1 4 ; &# 3 4 8 9 2 ; &# 2 6 3 6 8 ; &# 2 0 3 3 9 ; &# 2 1 2 7 0 ; &# 1 2 2 9 0 ; b r / > b r / > &# 1 2 2 8 8 ; &# 1 2 2 8 8 ; &# 3 1 5 3 2 ; &# 4 9 ; &# 4 9 ; &# 3 2 ; &# 3 5 6 1 1 ; &# 3 2 ; &# 2 8 8 5 8 ; &# 2 2 2 3 8 ; &# 3 6 3 3 5 ; &# 2 7 2 9 8 ; &# 2 8 2 0 4 ; &# 6 5 2 9 2 ; &# 2 0 0 2 7 ; &# 3 5 2 0 1 ; &# 2 0 1 7 1 ; &# 3 2 0 5 7 ; &# 2 0 1 9 7 ; &# 3 5 4 2 2 ; &# 3 4 9 5 5 ; &# 2 6 0 4 1 ; &# 2 7 8 6 1 ; &# 2 8 8 5 8 ; &# 2 0 0 2 7 ; &# 3 0 3 4 0 ; &# 2 2 2 3 8 ; &# 3 6 3 3 5 ; &# 2 7 2 9 8 ; &# 2 8 2 0 4 ; &# 1 2 2 9 0 ; &# 2 0 3 2 0 ; &# 2 3 5 5 9 ; &# 2 0 3 5 1 ; &# 2 9 9 9 2 ; &# 6 8 ; &# 6 6 ; &# 1 1 1 ; &# 8 7 ; &# 5 1 ; &# 3 2 ; &# 2 5 7 7 6 ; &# 2 3 5 3 1 ;