2016.11 更新html
SLAM,即Simultaneous Localization and Mapping,中文譯做同時定位與地圖建立,是近幾十年裏機器人領域有重大發展的研究方向。做爲自主機器人的核心技術,SLAM在機器人導航、控制、生產等方面都有着重要的研究意義。尤爲在二十一世紀,以視覺傳感器爲中心的視覺SLAM技術,在理論和方法上都經歷了明顯的轉變與突破,正逐步從實驗室研究邁向成熟的市場應用。在國外研究如火如荼之際,它在國內的研究尚處於起步階段。有關SLAM的中文資料、書籍更是難以一見。然而,隨着機器人技術獲得國家的重視,愈來愈多的青年研究者、學生正逐漸跨入這片領域。本文檔則試圖爲這些剛走進SLAM的同事們,提供一些簡單而實際的參考。python
小蘿蔔:師兄!你上面寫的都是些什麼東西啊!linux
師兄:都是些沒什麼卵用的廢話啊……可是沒這些東西文檔就不上檔次啊。ios
小蘿蔔:師兄!你別幹這些無聊的事情了!趕忙教我作SLAM啊!git
師兄:前言才寫了一段,讀者會以爲我在敷衍他們的吧。算了,無論了,前兩天讓你跑的rgbd-slam怎麼樣了?程序員
小蘿蔔:跑起來了!而後呢?github
師兄:而後你就能夠調調參數,改改代碼啥的啊。算法
小蘿蔔:師兄!我看不懂!編程
師兄:呃這個……ubuntu
小蘿蔔:師兄!你給我寫一個SLAM程序吧!
師兄:呃這個……
小蘿蔔:趕忙寫啦師兄!寫完了你請我吃飯!
師兄:吃飯啊,那好吧……
因而,師兄就開始寫這本文檔了。因爲師兄也不知道何時會寫完,因此他每寫一段就拿給小蘿蔔看(而後請他吃飯)。還好小蘿蔔熱情很高,每次師兄給他寫好的代碼,都拿回去仔細看並且跑了。這也給了師兄很大動力繼續往下寫。
本文將帶領讀者本身動手去寫一個RGB-D SLAM程序。
由於我相信只有經過本身寫程序,才能真正懂得slam的原理。
小蘿蔔:爲何要寫一個SLAM程序,而不採用現有的代碼呢?
- 師兄:爲了更深的理解。
另外一方面,本身寫程序,不表明要用C++實現矩陣的線性代數。基本的庫咱們仍是會用的。
咱們要用的庫:OpenCV, PCL, g2o.
還等什麼?趕忙動手吧!
編程環境:ubuntu 12.04。建議讀者和咱們使用同樣或相似的環境。若是你(出於酷或者其餘什麼緣由)就是要用Arch/Fedora/Mac,請你本身配環境。
必備軟件的安裝:
1 sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev
mkdir build cd build cmake .. make sudo make install
編譯過程須要一點時間,長短視你機器的配置而定。慢一點的可能一下午就過去了,請順便找點其餘事幹幹例如看場電影之類的。
小蘿蔔:裝完以後OpenCV在哪裏呢?
師兄:頭文件在/usr/local/include/,裏面有opencv和opencv2的頭文件。咱們基本只用opencv2啦。
師兄:庫文件就在/usr/local/lib/下面,固然這些在install的時候都是能夠改動的,我列的是默認位置。
小蘿蔔:師兄!剛纔用的cmake是什麼東西啊?
師兄:cmake就是linux下的C++管理工具啦。簡單的代碼你能夠用g++一條條敲,再多些能夠用Makefile來管理,cmake就是自動生成makefile的工具,比makefile集成度更高一些。
小蘿蔔:哦好的!我懂了師兄!請我吃飯哦!
師兄:好!
更新:你也可使用 sudo apt-get install libopencv-dev 安裝OpenCV 2.4.9 。
PCL就是Point Cloud Library啦,處理點雲的必備工具。
小蘿蔔:師兄!爲何要處理點雲?
師兄:啊……忘了說了,這篇文檔是講RGB-D SLAM的呀,深度相機採出來的原本就是點雲數據啦。
小蘿蔔:這麼重要的事情爲何你不放到開頭去講啊!
師兄:我忘了……
無論如何,PCL官網(http://pointclouds.org)上已經給出了ubuntu的安裝方法。由於不少開發工具在ubuntu上裝起來最方便,也比較適合小蘿蔔這種新手,因此咱們才選用了ubuntu。
在Ubuntu 1404或更低版本,你須要經過私有源來安裝PCL庫
Step 1.
1 sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl 2 sudo apt-get update 3 sudo apt-get install libpcl-all
在 Ubuntu 1604,PCL庫已經存在於公共軟件源中,直接安裝便可:
sudo apt-get install libpcl-dev pcl-tools
可是,在1604中PCL的配置彷佛有bug,須要在cmakelist中加一條指令修復。
師兄:怎麼樣?是否是很簡單?
小蘿蔔:是!
師兄:那麼,相似的,你可否找到PCL的頭文件以及庫文件的安裝目錄呢?咱們把這個做爲留給讀者的做業吧!
小蘿蔔:師兄你不怕讀者把你電話打爆嗎?
到這裏,必備的庫就安裝完了。以後若須要裝別的軟件,咱們會單獨講。
咱們已經安裝好了OpenCV和PCL,下面咱們開始來寫第一個程序吧!
小蘿蔔:終於能夠開始寫程序嘍!我最愛寫程序!我感到程序員之魂在我體內燃燒!
師兄:呃,但是咱們第一個程序要作什麼呢?
小蘿蔔:咱們立刻來寫SLAM吧!
師兄:但是那樣讀者能看懂嗎……咱們仍是從簡單的東西開始吧。
小蘿蔔:好!那就寫一個簡單的SLAM!
師兄:不不不,首先咱們來構建一個CMake項目,做爲從此寫代碼的模板。開頭讀者可能會以爲困難,可是萬事開頭難,後來你就慢慢習慣了。
Linux下的CMake項目一般由幾個文件夾組成。例如咱們今天講的slam,你能夠在機器上建一個叫slam的文件夾(注意:這個文件夾就是你代碼的根目錄了!)。而後往裏面建幾個子文件夾:
bin 用來放編譯好的可執行二進制文件。
src 用來放源代碼。
lib 用來放編譯好的庫文件。
include 用來放頭文件。
爲何要用這種目錄結構呢?其實這是一種編譯習慣,固然你能夠把全部文件都擱一個目錄裏,可是這樣看起來很亂不是麼。一般咱們把源代碼和編譯好的東西分開。若是源代碼比較多,還會按模板分開。像opencv和pcl的代碼就是由好多個模塊組成的。
咱們要把目錄結構告訴cmake。因此咱們在代碼根目錄下寫一個CMakeLists.txt。cmake在生成代碼時,會讀這個文件,並按照它來編譯你的代碼。剛纔咱們對opencv進行編譯時,也採用了這個步驟。好,如今在代碼根目錄下新建一個CMakeLists.txt:
touch CMakeLists.txt
寫入:
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) #設定版本 PROJECT( slam ) #設定工程名 SET( CMAKE_CXX_COMPILER "g++") #設定編譯器 #設定可執行二進制文件的目錄 SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #設定存放編譯出來的庫文件的目錄 SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) #而且把該目錄設爲鏈接目錄 LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib) #設定頭文件目錄 INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include) #增長子文件夾,也就是進入源代碼文件夾繼續構建 ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)
井號後面的是個人註釋,只是爲了幫助你理解,你能夠不敲。經過這個文件,你應該瞭解了CMakeLists.txt的一些基本的用法。若是你想找一個系統的介紹,咱們提供了《CMake實踐》電子書,我認爲是一個不錯的參考資料。
小蘿蔔:等一下師兄!庫文件和二進制都是什麼啊!
師兄:二進制就是能夠直接運行的程序啦,庫文件呢,就是爲這些二進制提供函數的啦。有main函數的代碼能夠編譯成二進制,其餘的則編譯成庫文件。連接時,把庫文件鏈到二進制上,就能夠運行啦。
小蘿蔔:師兄我仍是不懂!
師兄:呃,那咱們仍是經過實例來作吧。在src/文件夾下新建一個main.cpp文件,輸入:
1 #include <iostream> 2 3 int main(int argc, char**argv) 4 { 5 std::cout<<"Hello SLAM!"<<std::endl; 6 return 0; 7 }
這固然是個很簡單的,一目瞭然的程序。因此我也沒有加註釋。而後,咱們要從這個源代碼生成一個二進制。在src/目錄下新建一個CMakeLists.txt,輸入:
# 增長一個可執行的二進制 ADD_EXECUTABLE( main main.cpp )
這樣,cmake就會把這個main.cpp編譯成一個叫作main的二進制了。趕忙來試試吧。首先轉到代碼根目錄下,輸入:
1 mkdir build 2 cd build 3 cmake .. 4 make
編譯經過的話,就會在bin/目錄下生成一個main的二進制哦!若是你執行這個二進制,就會輸出Hello SLAM的語句啦!
是否是以爲這個程序太簡單了?不要緊,難的在後面呢!
小蘿蔔:難道這一講就這樣結束了?
師兄:是啊……畢竟寫得仍是蠻辛苦的,我得去休息一會。
小蘿蔔:但是咱們基本上沒寫什麼程序啊!
師兄:別急啊,你先把cmake好好學學,以後的工做都得在這上面作。
小蘿蔔:好吧!那師兄咱們下一講要作什麼呢?
師兄:嗯,咱們會用opencv讀個圖,再把它轉成點雲,怎麼樣?
小蘿蔔:聽起來不難啊,那下一講再見啦!
本文的pdf版本,源代碼,圖片等資源可在個人git裏下載到。
網址: https://github.com/gaoxiang12/rgbd-slam-tutorial-gx