SLAM涉及的知識面很廣,我簡單總結了 「SLAM知識樹」 以下所示:php
(公衆號菜單欄回覆 「樹」 可得到清晰版)python
能夠看到涉及的知識面仍是比較廣的。這裏放出一張SLAM圈子裏喜聞樂見的表達悲喜交加心情的漫畫圖,你們能夠感覺一下: linux
每一個學SLAM的小夥伴能夠說都是冒着「頭頂涼涼」的巨大風險,勇氣可嘉。下面結合SLAM知識樹展開具體說說。git
編程環境
首先先說電腦環境和編程。github
一、電腦環境:Linux環境,推薦Ubuntu16.04。算法
有人問Windows行不行?這麼說吧,若是你是一位SLAM領域的大牛,而且具備超強的解決bug能力,你能夠用Windows,不然,很是不建議在Windows下編譯,由於你遲早會被各類依賴庫,各類bug搞崩潰的。並且大部分的SLAM開源代碼都在Linux環境下編譯,不少第三方依賴庫在Linux下能夠很是方便的安裝。編程
若是以前沒有接觸過Ubuntu的,也不用擔憂。剛開始用命令行界面可能不太習慣,慢慢習慣後就會發現Linux的內在美。因此要學SLAM就先裝一個Ubuntu系統吧,若是電腦自己是Windows系統,建議裝雙系統,不要裝虛擬機。學習Linux的話,就看那本經典的書:《鳥哥的Linux私房菜》吧,書的內容比較多,建議先學習一下基本的文檔操做指令。能夠快速瀏覽一遍,不須要死記,之後用到了再去查就行。這書的做者鳥哥有個網站也能夠查命令,挺方便的:vim
http://cn.linux.vbird.org/linux_basic/1010index.php數據結構
二、編程相關框架
編程語言:
主要是C++。推薦紅寶書《C++ Primer》。內容很是多而全。若是是初學者沒那麼多時間學一遍,就重點選擇前幾章基礎看看,動手敲一敲代碼。而後瞭解後面幾章經常使用的數據結構和C++的一些特性(重載、多態、繼承)等。有時候也須要會一些python,網上資料不少,很少說。
集成開發環境:
CLion(用edu結尾郵箱能夠申請無償使用一年)、kdevelop(免費),我的以爲前者好用一點。
編譯工具:
cmake。統一使用cmake編譯,好處不少,好比代碼能夠很方便的跨平臺使用等。使用起來也很方便。有個小冊子《CMake practice》照着學一下。
文檔編輯:
有不少,好比gedit、Nano、vim等。
第三方函數庫:
使用到的第三方庫主要包括:OpenCV(計算機視覺),OpenGL(計算機圖形學),Eigen(幾何變換),Sophus(李代數),Ceres(非線性優化),G2o(圖優化)等。
數學
主要是大學裏學的:線性代數、機率論和微積分。雖然不少人大學裏學的早都還給老師了,不過也不用太擔憂,SLAM裏也不須要很是難的數學問題。主要包括:
矩陣的性質。好比矩陣乘法、求逆、矩陣分解(SVD,QR,Cholesky)、反對稱矩陣等。
李羣李代數。這個可能不少人之前沒接觸過,也是挺重要的,不太高翔的十四講裏也講的比較詳細了,仔細推一下公式。
非線性優化問題。好比梯度降低、牛頓法、高斯-牛頓法、LM算法、bundle adjustment等。
此外,還有泰勒展開,求(偏)導,積分等。
計算機視覺相關
SLAM裏涉及不少圖像處理、計算機視覺知識,總結一下主要有:
相機相關:單目、雙目、RGB-D等相機的物理參數意義、相機成像模型、相機的標定、去畸變等。雙目的話還涉及到視差計算,RGB-D的話涉及到RGB和depth圖像的對齊等。
圖像處理相關。好比和特徵點相關的有:特徵點描述子、特徵點提取、特徵點匹配。圖像梯度計算、邊緣檢測、直線檢測等。
多視角幾何相關。好比對極約束、本質矩陣、單應矩陣、光流估計、三角化等。
英語
學習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
德國慕尼黑理工大學計算機視覺組製做的數據集,使用Kinect相機採集的數據集,包括IMU數據,而且用高精度運動採集系統提供了groundtruth(真值)。提供測試腳本,能夠方便的實現量化評估。
https://vision.in.tum.de/data/datasets/rgbd-dataset
2、KITTI Vision Benchmark Suite
德國卡爾斯魯厄理工學院和豐田工業大學芝加哥分校一塊兒合做製做的用於自動駕駛的數據集。
使用一輛改裝的汽車採集,該車配備了兩臺高分辨率彩色和灰度攝像機,還有Velodyne激光掃描儀和GPS定位系統,用來提供精確的groundtruth。主要採集區域是卡爾斯魯厄市區、農村地區和高速公路。提供測試腳本能夠方便的實現量化評估。
http://www.cvlibs.net/datasets/kitti/
3、EuRoC MAV Dataset
蘇黎世聯邦理工大學制做的數據集,採用裝備了雙目相機和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的基本操做;根據實踐驗證旋轉矩陣的約束
下圖是用於參考的代碼框架:
參考輸出以下,用於驗證結果。
歡迎留言討論,或者在公衆號:計算機視覺life菜單欄進入知識星球「從零開始學習SLAM」一塊兒學習交流(有參考答案)~
原文連接更精彩:從零開始一塊兒學習SLAM | 學習SLAM到底須要學什麼?--------------------- 做者:electech6 來源:CSDN 原文:https://blog.csdn.net/electech6/article/details/82597882 版權聲明:本文爲博主原創文章,轉載請附上博文連接!