天天看點

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

可以看到涉及的知識面還是比較廣的。這裡放出一張SLAM圈子裡喜聞樂見的表達悲喜交加心情的漫畫圖,大家可以感受一下:

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

每個學SLAM的小夥伴可以說都是冒着“頭頂涼涼”的巨大風險,勇氣可嘉。下面結合SLAM知識樹展開具體說說。

程式設計環境

首先先說電腦環境和程式設計。

1、電腦環境:Linux環境,推薦Ubuntu16.04。

有人問Windows行不行?這麼說吧,如果你是一位SLAM領域的大牛,并且具有超強的解決bug能力,你可以用Windows,否則,非常不建議在Windows下編譯,因為你早晚會被各種依賴庫,各種bug搞崩潰的。而且大部分的SLAM開源代碼都在Linux環境下編譯,很多第三方依賴庫在Linux下可以非常友善的安裝。

如果之前沒有接觸過Ubuntu的,也不用擔心。剛開始用指令行界面可能不太習慣,慢慢習慣後就會發現Linux的内在美。是以要學SLAM就先裝一個Ubuntu系統吧,如果電腦本身是Windows系統,建議裝雙系統,不要裝虛拟機。學習Linux的話,就看那本經典的書:《鳥哥的Linux私房菜》吧,書的内容比較多,建議先學習一下基本的文檔操作指令。可以快速浏覽一遍,不需要死記,以後用到了再去查就行。這書的作者鳥哥有個網站也可以查指令,挺友善的:

http://cn.linux.vbird.org/linux_basic/1010index.php

2、程式設計相關

程式設計語言:

主要是C++。推薦紅寶書《C++ Primer》。内容非常多而全。如果是初學者沒那麼多時間學一遍,就重點選擇前幾章基礎看看,動手敲一敲代碼。然後了解後面幾章常用的資料結構和C++的一些特性(重載、多态、繼承)等。有時候也需要會一些python,網上資料很多,不多說。

內建開發環境:

CLion(用edu結尾郵箱可以申請免費使用一年)、kdevelop(免費),個人覺得前者好用一點。

編譯工具:

cmake。統一使用cmake編譯,好處很多,比如代碼可以很友善的跨平台使用等。使用起來也很友善。有個小冊子《CMake practice》照着學一下。

文檔編輯:

有很多,比如gedit、Nano、vim等。

第三方函數庫:

使用到的第三方庫主要包括:OpenCV(計算機視覺),OpenGL(計算機圖形學),Eigen(幾何變換),Sophus(李代數),Ceres(非線性優化),G2o(圖優化)等。

數學

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

主要是大學裡學的:線性代數、機率論和微積分。雖然很多人大學裡學的早都還給老師了,不過也不用太擔心,SLAM裡也不需要非常難的數學問題。主要包括:

矩陣的性質。比如矩陣乘法、求逆、矩陣分解(SVD,QR,Cholesky)、反對稱矩陣等。

李群李代數。這個可能很多人以前沒接觸過,也是挺重要的,不過高翔的十四講裡也講的比較詳細了,仔細推一下公式。

非線性優化問題。比如梯度下降、牛頓法、高斯-牛頓法、LM算法、bundle adjustment等。

此外,還有泰勒展開,求(偏)導,積分等。

計算機視覺相關

SLAM裡涉及很多圖像處理、計算機視覺知識,總結一下主要有:

相機相關:單目、雙目、RGB-D等相機的實體參數意義、相機成像模型、相機的标定、去畸變等。雙目的話還涉及到視差計算,RGB-D的話涉及到RGB和depth圖像的對齊等。

圖像處理相關。比如和特征點相關的有:特征點描述子、特征點提取、特征點比對。圖像梯度計算、邊緣檢測、直線檢測等。

多視角幾何相關。比如對極限制、本質矩陣、單應矩陣、光流估計、三角化等。

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

英語

學習SLAM必須具備一定的英語閱讀能力。因為SLAM相關的大部分資料(論文、書籍、技術文檔等)都是英文的。不過即使英文不好也不用太擔心,利用好查單詞軟體,遇到不認識的 就去查,時間長了也就都混的“臉熟”了,英語閱讀速度和了解能力也會逐漸提升。

開源代碼

雖然SLAM比較難,但是令人欣慰的是,SLAM領域有很多優秀的開源代碼可以學習。列舉幾個主流的如下:

稀疏法:

ORB-SLAM2:支援單目,雙目,RGB-D相機

https://github.com/raulmur/ORB_SLAM2

半稠密法:

LSD-SLAM:支援單目,雙目,RGB-D相機

https://vision.in.tum.de/research/vslam/lsdslam

DSO:單目

https://vision.in.tum.de/research/vslam/dso

稠密法

Elastic Fusion:RGB-D相機

https://github.com/mp3guy/ElasticFusion

BundleFusion:RGB-D相機

https://github.com/niessner/BundleFusion

RGB-D SLAM V2:RGB-D相機

https://github.com/felixendres/rgbdslam_v2

多傳感器融合:

VINS:單目 + IMU(慣性測量單元)

https://github.com/HKUST-Aerial-Robotics/VINS-Mono

OKVIS:(單目、雙目、四目)+ IMU

https://wp.doc.ic.ac.uk/sleutene/2016/02/04/release-of-okvis-open-keyframe-based-visual-inertial-slam/

資料集

主要列舉幾個主流的資料集

1、TUM RGB-D SLAM Dataset and Benchmark

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

德國慕尼黑理工大學計算機視覺組制作的資料集,使用Kinect相機采集的資料集,包括IMU資料,并且用高精度運動采集系統提供了groundtruth(真值)。提供測試腳本,可以友善的實作量化評估。

https://vision.in.tum.de/data/datasets/rgbd-dataset

2、KITTI Vision Benchmark Suite

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

德國卡爾斯魯厄理工學院和豐田工業大學芝加哥分校一起合作制作的用于自動駕駛的資料集。

使用一輛改裝的汽車采集,該車配備了兩台高分辨率彩色和灰階錄影機,還有Velodyne雷射掃描器和GPS定位系統,用來提供精确的groundtruth。主要采集區域是卡爾斯魯厄市區、農村地區和高速公路。提供測試腳本可以友善的實作量化評估。

http://www.cvlibs.net/datasets/kitti/

3、EuRoC MAV Dataset

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

蘇黎世聯邦理工大學制作的資料集,采用裝備了雙目相機和IMU的四旋翼無人機采集資料,使用高精度運動采集系統提供了groundtruth。提供測試腳本,可以友善的實作量化評估。

https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets

作業

題目1

我們知道SLAM是處理序列圖像的,有時候需要格式化的圖像名字用作輸入。前面提到的TUM的RGB-D資料集中圖像是根據時間命名的,請從下面連結下載下傳資料集fr1/desk

https://vision.in.tum.de/data/datasets/rgbd-dataset/download#

并解壓。請程式設計實作将檔案夾/rgb下以時間命名的序列圖檔重新命名為0000-9999的格式。

本程式學習目的:

熟悉cmake的使用、OpenCV讀寫操作、C++的string操作

題目2

已知相機的位姿用四元數表示為q=[0.35,0.2,0.3,0.1],順序為x,y,z,w,請程式設計實作:

輸出四元數對應的旋轉矩陣、旋轉矩陣的轉置,旋轉矩陣的逆矩陣,旋轉矩陣乘以自身的轉置,驗證旋轉矩陣的正交性。

熟悉cmake的使用、學習eigen的基本操作;根據實踐驗證旋轉矩陣的限制

下圖是用于參考的代碼架構:

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

參考輸出如下,用于驗證結果。

從零開始一起學習SLAM | 學習SLAM到底需要學什麼?

原文釋出時間為:2018-09-10

本文作者:electech6

本文來自雲栖社群合作夥伴“

計算機視覺life

”,了解相關資訊可以關注“

”。

繼續閱讀