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