一塊兒作RGB-D SLAM (1)

  • 前言


 

2016.11 更新html

  • 增長了對16.04的支持。
  • 整理了過期的代碼

 

  SLAM,即Simultaneous Localization and Mapping,中文譯做同時定位與地圖建立,是近幾十年裏機器人領域有重大發展的研究方向。做爲自主機器人的核心技術,SLAM在機器人導航、控制、生產等方面都有着重要的研究意義。尤爲在二十一世紀,以視覺傳感器爲中心的視覺SLAM技術,在理論和方法上都經歷了明顯的轉變與突破,正逐步從實驗室研究邁向成熟的市場應用。在國外研究如火如荼之際,它在國內的研究尚處於起步階段。有關SLAM的中文資料、書籍更是難以一見。然而,隨着機器人技術獲得國家的重視,愈來愈多的青年研究者、學生正逐漸跨入這片領域。本文檔則試圖爲這些剛走進SLAM的同事們,提供一些簡單而實際的參考。python

  小蘿蔔:師兄!你上面寫的都是些什麼東西啊!linux

  師兄:都是些沒什麼卵用的廢話啊……可是沒這些東西文檔就不上檔次啊。ios

  小蘿蔔:師兄!你別幹這些無聊的事情了!趕忙教我作SLAM啊!git

  師兄:前言才寫了一段,讀者會以爲我在敷衍他們的吧。算了,無論了,前兩天讓你跑的rgbd-slam怎麼樣了?程序員

  小蘿蔔:跑起來了!而後呢?github

  師兄:而後你就能夠調調參數,改改代碼啥的啊。算法

  小蘿蔔:師兄!我看不懂!編程

  師兄:呃這個……ubuntu

  小蘿蔔:師兄!你給我寫一個SLAM程序吧!

  師兄:呃這個……

  小蘿蔔:趕忙寫啦師兄!寫完了你請我吃飯!

  師兄:吃飯啊,那好吧……

  因而,師兄就開始寫這本文檔了。因爲師兄也不知道何時會寫完,因此他每寫一段就拿給小蘿蔔看(而後請他吃飯)。還好小蘿蔔熱情很高,每次師兄給他寫好的代碼,都拿回去仔細看並且跑了。這也給了師兄很大動力繼續往下寫。


  • 本文的目標

  本文將帶領讀者本身動手去寫一個RGB-D SLAM程序。

  由於我相信只有經過本身寫程序,才能真正懂得slam的原理。

  小蘿蔔:爲何要寫一個SLAM程序,而不採用現有的代碼呢?

  - 師兄:爲了更深的理解。

  1. 一個完整的程序含有大量的算法與GUI的代碼,你讀一遍須要多久?弄清楚原理要多久?
  2. 別人工具都作好了,代碼都寫完了,參數也調好了,你拿過來運行。那頂多給別人作一下評測。
  3. 你早晚要本身寫代碼。

  另外一方面,本身寫程序,不表明要用C++實現矩陣的線性代數。基本的庫咱們仍是會用的。

  咱們要用的庫:OpenCV, PCL, g2o. 

  還等什麼?趕忙動手吧!

 


  • 預備知識與編程環境

  編程環境:ubuntu 12.04。建議讀者和咱們使用同樣或相似的環境。若是你(出於酷或者其餘什麼緣由)就是要用Arch/Fedora/Mac,請你本身配環境。

  必備軟件的安裝:

  1. OpenCV
    推薦從源代碼安裝的模式。編譯過程須要一點時間。
    Step 1.
    下載OpenCV源代碼: http://opencv.org/downloads.html。
    目前(2015.6)較好的版本是2.4系列,由於3.0系列還不完善(主要是沒文檔)。請把它下載到電腦上隨意一個目錄下。
    在下載過程當中,你能夠安裝依賴項。基本的依賴項是底下那些,直接拷貝到終端執行。
    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
    Step 2.
    把OpenCV解壓到下載目錄中,用cmake編譯再安裝.
    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 。

  2. PCL

    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的頭文件以及庫文件的安裝目錄呢?咱們把這個做爲留給讀者的做業吧!
    小蘿蔔:師兄你不怕讀者把你電話打爆嗎?

  到這裏,必備的庫就安裝完了。以後若須要裝別的軟件,咱們會單獨講。


  • HELLO SLAM!

  咱們已經安裝好了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

相關文章
相關標籤/搜索