與超過 1200萬 開發(fā)者一起發(fā)現(xiàn)、參與優(yōu)秀開源項目,私有倉庫也完全免費 :)
為確保你提交的代碼身份被 Gitee 正確識別,請執(zhí)行以下命令完成配置
初次使用 SSH 協(xié)議進行代碼克隆、推送等操作時,需按下述提示完成 SSH 配置
使用 HTTPS 協(xié)議時,命令行會出現(xiàn)如下賬號密碼驗證步驟。基于安全考慮,Gitee 建議配置并使用私人令牌替代登錄密碼進行克隆、推送等操作
由于 Git 不支持空文件夾,創(chuàng)建文件夾后會生成空的 .keep 文件
# 一步一步學SLAMSLAM的全稱是Simultaneous Localization and Ming,同時定位與地圖構建,就是通過激光或者視覺等傳感器掃描環(huán)境,構建環(huán)境地圖并同時給自己定位。這項技術是人工智能的感知部分,就是通過傳感器將環(huán)境重建成數(shù)字模型并定位,從而實現(xiàn)AR、無人駕駛、自主探險等等應用。雖然經過了多年的發(fā)展,視覺SLAM取得了很大的進步,已逐步從實驗室走向了應用,但是視覺SLAM仍然面臨很多的挑戰(zhàn),例如動態(tài)環(huán)境下如何魯邦的重建環(huán)境、如何實現(xiàn)與語義分割等有機融合、如何實現(xiàn)人類使用認知的方式完成精密三維重建等等。## 1. 為何學習SLAM?隨著機器人、AR、自動駕駛的爆發(fā)式增長,SLAM方向的需求量仍在上升,而相關從業(yè)者相對較少,具備扎實基礎知識,強大編程實現(xiàn)能力的人更少。目前對SLAM技術需求強烈的公司包括:互聯(lián)網公司如百度、騰訊、阿里、京東等,計算機視覺算法公司如曠世、虹軟、商湯等,自動駕駛創(chuàng)業(yè)公司如圖森、momenta、景馳、馭勢、滴滴及各大汽車廠商等,無人機/機器人公司如大疆、思嵐、高仙等,AR移動終端應用相關公司如三星、華為、悉見等。SLAM的實現(xiàn)是一類復雜的程序,包括數(shù)學、操作系統(tǒng)、多線程、C++、STL、CMake、大量第三方庫等等,因此通過學習SLAM能夠掌握復雜軟件系統(tǒng)的設計、程序高級技巧,有了這些能力與技巧,后續(xù)做其他項目就會變得簡單。**因此學習SLAM對[《個人的綜合能力》](Targets.md)的提升有著非常顯著的作用,希望大家能夠腳踏實地、一步一步去學習。**## 2. 為什么學習SLAM比較難?1. 深度學習在檢測、識別領域具有強大的能力,但是在涉及**多視角幾何相關的SLAM領域,深度學習的作用仍然有限**。究其原因是因為在多視角幾何為基礎的SLAM領域,需要明確清晰的理論基礎保證,而深度學習的「黑盒子」模型目前還不是特別有效。2. **SLAM技術門檻較高**。深度學習爆發(fā)后,很多非計算機視覺領域的從業(yè)者紛紛轉而學習深度學習,由于深度學習本身黑盒子的特點,很多從業(yè)者不需要了解圖像處理、計算機視覺的基礎知識便可以得到一個相對較好的結果,因此入門門檻并不是很高。而SLAM需要非常多的數(shù)學、優(yōu)化、數(shù)值計算、編程等技能,程序需要手工設計與實現(xiàn),細節(jié)比較多,因此會卡住很多人。學習SLAM需要具備三維空間剛體變換、相機成像模型、特征點提取與匹配、多視角幾何、光束平差、數(shù)值優(yōu)化、程序優(yōu)化等內容。這對于非該領域的從業(yè)者來說還是具有較高的門檻。3. **需要高超的編程水平**:SLAM是一類比較復雜的軟件系統(tǒng),包括了大量的基礎知識和技巧,主要有操作系統(tǒng)、多線程、C++編程、OpenGL。此外由于SLAM是一類實時處理的程序,因此對程序的性能優(yōu)化有非常高的要求,因此比類似的技術structure from motion (SfM)難度高了不少。## 3. 學習內容和需要達到的目標SLAM的入門一直都是很多初學者的噩夢,但請不用怕,時至今日,它的理論和實踐參考都已經非常完善,了解他們對于[《個人的綜合能力》](Targets.md)提升非常大,可以將SLAM相關的知識分為以下幾類:1. 幾何理論: 多視圖幾何是認識SLAM中元素組成及其關聯(lián)的核心,了解幾何之后,即使不明白其具體的優(yōu)化計算處理,也至少可以明白模塊之間的輸入輸出,從而對大問題進行分解,是SLAM學習最基礎的知識;2. 編程: Linux系統(tǒng)的使用及程序工程能力是SLAM實踐的關鍵,正確使用工具能讓你少走彎路;3. 計算機視覺(CV):SLAM的前端主要作用是獲取高質量的觀測信息,決定了系統(tǒng)魯棒性,區(qū)別與SLAM專屬的數(shù)學及圖優(yōu)化處理,前端的理解往往比較直觀,但涉及大量的工程處理;4. 數(shù)學及優(yōu)化: SLAM的后端決定了系統(tǒng)的整體精度,它涉及較多的數(shù)學,需要一定的耐心和鉆研;## 4. 如何學習SLAM?### Stage0: 基礎知識學習([C++](,[Linux]()* [C++](大部分的SLAM程序通過C++實現(xiàn),由于需要很高的執(zhí)行效率,因此大部分的程序使用了較多的C++技巧 - 需要考慮如何評估自己的C++能力是否適應SLAM編程的需求,如果自己的能力不夠,該如何學習?從哪里找資料去學習? - 如果C++能力比較弱,可以參考[《一步一步學編程》](學習C++編程、數(shù)據(jù)結構與算法、編程項目等練習* [Linux](由于大部分的SLAM系統(tǒng)開發(fā)都在Linux下面進行,因此非常有必要先把[Linux的基本操作](學會 - 基本的命令,如何安裝軟件包,如何查找軟件包等等 - 如何在Linux下編譯軟件,如何使用[CMake](如何使用Linux下面的IDE,例如QtCreator,KDevelop等等 ### Stage1: [OpenCV學習](1_OpenCV)* [OpenCV的基本,`Mat`以及對應的基本操作](讀取圖像,顯示圖像](特征點提取,特征點匹配](相機標定原理與程序](, Essential Matrix* 簡單的圖像拼接(利用Homograph等)### Stage2: SfM基本原理* Structure from Motion原理,可以參考[《Mastering OpenCV with Practical Computer Vision Projects》的第四章](references/MasteringOpenCV/MasteringOpenCV.)* 相機成像基本原理* 坐標變換基本原理* 最簡單流程的程序理解,改進* Bundle Adjust原理* 如何編譯示例程序: [SequenceSfM](示例程序[SequenceSfM](存在什么問題?怎么改進?* 在學習SfM過程,也可以看一下[《SLAM十四講》](references/視覺SLAM十四講)### Stage3: SLAM十四講與相關庫* SLAM十四講學習方法 - 先快速把[《SLAM十四講》](references/視覺SLAM十四講)過一遍 - 主要是相機成像,三維的點如何變成二維上的點,把這個里面的公式搞通了,后面的一些東西就容易理解,好多公式是基于相機成像模型來進行推導的。 - 在進行學習的同時可以配合[作業(yè)](6_homework)達到練習的效果。- 在看書學習的基礎上,需要嘗試自己獨立編寫處理模塊,例如特征點提取,特征點匹配,初始化,三角化。。。 * SLAM相關庫操作 - Eigen3 - G2O - [Ceres](5_Ceres/README.md) - OpenGL - Qt - [Pangolin](:閱讀并改進已有的SLAM系統(tǒng)* 建議從 [VINS-Fusion](開始學習* 如何編譯程序?* 這個程序分成幾個模塊,各個模塊都完成什么工作,模塊之間是如何銜接的?* 能否將輸入數(shù)據(jù)替換成自己錄制的數(shù)據(jù)?能否把輸出、顯示改成自己的程序?* 通過一步一步的仿真、增加算法模塊,在具體任務的牽引下完成對SLAM的改進,具體參考:[SLAM練習開發(fā)項目](4_Projects)### Stage5:在消化吸收已有SLAM實現(xiàn)的基礎上,編寫自己的SLAM系統(tǒng)* 在消化吸收已有SLAM程序的基礎上,逐個模塊替換成自己寫的模塊## 5. 學習的建議1. 不要想從空白一步到位自己獨立編寫出一個SLAM系統(tǒng),SLAM是一個非常復雜的軟件系統(tǒng),包含了大量的數(shù)學、編程知識、編程技巧的系統(tǒng),**需要先建立感性認識,然后熟悉各個技術模塊,然后在有一點理解的基礎上嘗試集成、修改、改進等等**。2. 由于SLAM包含了大量的數(shù)學知識、編程知識,因此強烈建議采用廣度優(yōu)先的方法來學習,即首先建立整體的感性認識;然后針對每一個技術模塊了解其目的、意義、調用的方法等等;然后通過整合的方式去理解整體的銜接、組織。在不斷深入理解的過程中,深入學習各個部分的數(shù)學原理、公式推導、公式如何轉化成程序等等。否則一上來扎入復雜的公式,很有可能迷失方向。3. **需要大量的編程練習!?。⌒枰罅康木幊叹毩暎。?!**SLAM其實真正難的并不完全是數(shù)學,通過庫函數(shù)調用其實已經屏蔽了數(shù)學基本原理。最難的是需要比較高的編程技能,才能駕馭SLAM這類復雜的軟件系統(tǒng)。因此如果自己覺得自己編程內功還欠火候,強烈建議同步練習編程的基本,自己設想一些不是太復雜,但是比較綜合的小項目來練手。例如[《Learn Programming》中的Stage4,Stage5的題目](,通過項目、代碼重構學習如何分析、處理比較復雜的問題。將這些知識與經驗遷移到SLAM上,就是的學習SLAM程序沒有那么難。4. 強烈建議各位可以從structure from motion (SfM) 開始學習,因SfM是批處理的方式,方便理解每一個步驟的操作。通過構建比較好的輸入數(shù)據(jù),可以單獨實現(xiàn)、測試每一個步驟。前輩們的經驗分享:* [2013年進實驗室 趙勇](./experiences/zhaoyong2021.md)## 6. 參考資料### 6.1 SLAM實現(xiàn)* [VINS-Fusion](教程等* [《一步一步學編程》](《飛行器智能感知與控制實驗室-暑期培訓教程》]((視頻)](分鐘學Python](《一步一步學ROS》](圖書與學習資料* 參考圖書 * 《視覺SLAM十四講》 * 《計算機視覺中的多視圖幾何》(《Multiple View Geometry in Computer Vision》) * 《機器人學中的狀態(tài)估計》 * 《STL源碼剖析》 * 《Effective C++》 * 《ROS機器人開發(fā)實踐》 * 《概率機器人》* 學習資料 * [SLAM從入門到放棄——學習SLAM 學習機器人 書籍推薦](聊聊這兩年學習slam啃過的書!](其他參考資料* [高翔博士的SLAM思維導圖](images/SLAM_AllInOne.png)* [Linux](編程代碼參考、技巧集合](:可以在這個代碼、技巧集合中找到某項功能的示例,從而加快自己代碼的編寫
GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc.
此處可能存在不合適展示的內容,頁面不予展示。您可通過相關編輯功能自查并修改。九游體育官網
如您確認內容無涉及 不當用語 / 純廣告導流 / 暴力 / 低俗色情 / 侵權 / 盜版 / 虛假 / 無價值內容或違法國家有關法律法規(guī)的內容,可點擊提交進行申訴,我們將盡快為您處理。