• 前言


2016.11 更新

  • 增加了对16.04的支持。
  • 整理了过时的代码。

  SLAM,即Simultaneous Localization and Mapping,中文译作同时定位与地图创建,是近几十年里机器人领域有重大发展的研究方向。作为自主机器人的核心技术,SLAM在机器人导航、控制、生产等方面都有着重要的研究意义。尤其在二十一世纪,以视觉传感器为中心的视觉SLAM技术,在理论和方法上都经历了明显的转变与突破,正逐步从实验室研究迈向成熟的市场应用。在国外研究如火如荼之际,它在国内的研究尚处于起步阶段。有关SLAM的中文资料、书籍更是难以一见。然而,随着机器人技术得到国家的重视,越来越多的青年研究者、学生正逐渐跨入这片领域。本文档则试图为这些刚走进SLAM的同事们,提供一些简单而实际的参考。

  小萝卜:师兄!你上面写的都是些什么东西啊!

  师兄:都是些没什么卵用的废话啊……但是没这些东西文档就不上档次啊。

  小萝卜:师兄!你别干这些无聊的事情了!赶紧教我做SLAM啊!

  师兄:前言才写了一段,读者会觉得我在敷衍他们的吧。算了,不管了,前两天让你跑的rgbd-slam怎么样了?

  小萝卜:跑起来了!然后呢?

  师兄:然后你就可以调调参数,改改代码啥的啊。

  小萝卜:师兄!我看不懂!

  师兄:呃这个……

  小萝卜:师兄!你给我写一个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系列还不完善(主要是没文档)。请把它下载到电脑上随意一个目录下。
    在下载过程中,你可以安装依赖项。基本的依赖项是底下那些,直接拷贝到终端执行。

     sudo apt-get install build-essential libgtk2.-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--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.

     sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
    sudo apt-get update
    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文件,输入:

 #include <iostream>

 int main(int argc, char**argv)
{
std::cout<<"Hello SLAM!"<<std::endl;
return ;
}

  这当然是个很简单的,一目了然的程序。所以我也没有加注释。然后,我们要从这个源代码生成一个二进制。在src/目录下新建一个CMakeLists.txt,输入:

# 增加一个可执行的二进制
ADD_EXECUTABLE( main main.cpp )

  这样,cmake就会把这个main.cpp编译成一个叫做main的二进制了。赶紧来试试吧。首先转到代码根目录下,输入:

 mkdir build
cd build
cmake ..
make

  编译通过的话,就会在bin/目录下生成一个main的二进制哦!如果你执行这个二进制,就会输出Hello SLAM的语句啦!

  是不是觉得这个程序太简单了?没关系,难的在后面呢!

  小萝卜:难道这一讲就这样结束了?

  师兄:是啊……毕竟写得还是蛮辛苦的,我得去休息一会。

  小萝卜:可是我们基本上没写什么程序啊!

  师兄:别急啊,你先把cmake好好学学,之后的工作都得在这上面做。

  小萝卜:好吧!那师兄我们下一讲要做什么呢?
  师兄:嗯,我们会用opencv读个图,再把它转成点云,怎么样?
  小萝卜:听起来不难啊,那下一讲再见啦!


  本文的pdf版本,源代码,图片等资源可在我的git里下载到。

  网址: https://github.com/gaoxiang12/rgbd-slam-tutorial-gx

一起做RGB-D SLAM (1)的更多相关文章

  1. 一起做RGB-D SLAM (4)

    第四讲 点云拼接 广告:“一起做”系列的代码网址:https://github.com/gaoxiang12/rgbd-slam-tutorial-gx 当博客更新时代码也会随着更新. SLAM技术交 ...

  2. (2)RGB-D SLAM系列- 工具篇(依赖库及编译)

    做了个SLAM的小视频,有兴趣的朋友可以看下 https://youtu.be/z5wDzMZF10Q 1)Library depended 一个完整的SLAM系统包括,数据流获取,数据读取,特征提取 ...

  3. Android 音视频编解码——RGB与YUV格式转换

    一.RGB模型与YUV模型 1.RGB模型 我们知道物理三基色分别是红(Red).绿(Green).蓝(Blue).现代的显示器技术就是通过组合不同强度的红绿蓝三原色,来达成几乎任何一种可见光的颜色. ...

  4. 音视频编解码——RGB与YUV格式转换

    一.RGB模型与YUV模型 1.RGB模型 我们知道物理三基色分别是红(Red).绿(Green).蓝(Blue).现代的显示器技术就是通过组合不同强度的红绿蓝三原色,来达成几乎任何一种可见光的颜色. ...

  5. 常用的SLAM解决方案

    ORB SLAM 可以去Github上自己搜索现成的SLAM程序包 在此基础上做优化 视觉SLAM的分类方法:按摄像头的多少分为单目和双目,按是否使用概率方法分为概率法和图法 链接 学习SLAM重要的 ...

  6. 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势

    SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...

  7. BAD SLAM:捆绑束调整直接RGB-D SLAM

    BAD SLAM:捆绑束调整直接RGB-D SLAM BAD SLAM: Bundle Adjusted Direct RGB-D SLAM 论文地址: http://openaccess.thecv ...

  8. Camera 图像处理原理分析

    1         前言 做为拍照手机的核心模块之一,camera sensor效果的调整,涉及到众多的参数,如果对基本的光学原理及sensor软/硬件对图像处理的原理能有深入的理解和把握的话,对我们 ...

  9. Camera图像处理原理及实例分析-重要图像概念

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

  10. Android Camera2采集摄像头原始数据并手动预览

    Android Camera2采集摄像头原始数据并手动预览 最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在Te ...

随机推荐

  1. 程序员的出路在哪里?挣钱的机会来了续-福利来了,仿QQ界面,放出全部源码,打造创业框架及实现思路

    上一篇:程序员的出路在哪里?挣钱的机会来了!, 原来搞技术,挣钱,不一定非得要多高精尖,有时候抓住小白用户,解决他们一个很小但是很常用的功能,也是一条很好的出路. 其实很多软件产品,要实现出来没有你想 ...

  2. 第十课:CSS选择器的介绍和区分

    IE7以及以下版本: getElementById是不区分表单元素ID与Name的,因此如果有一个表单元素只定义name,并与我们的目标元素ID同名,并且我们的目标元素在它的后面,那么就会选择到那个表 ...

  3. linux 安装webbench

    webbench :1.5  http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz从官网下载webbench-1.5.tar.gz1.解压 t ...

  4. WordPress 常用数据库SQL查询语句大全

    在使用WordPress的过程中,我们少不了要对数据库进行修改操作,比如,更换域名.修改附件目录.批量修改文章内容等等.这个时候,使用SQL查询语句可以大大简化我们的工作量. 关于如何操作SQL查询语 ...

  5. OC基础--description方法

    PS:经过之类重写description方法后,个人感觉有点像C#中的ToString();方法 一.description方法的作用:(输出所有的OC对象都用%@) 1.默认情况下(不重写descr ...

  6. 【BZOJ 1036】【ZJOI 2008】树的统计 树链剖分模板题

    sth神犇的模板: //bzoj1036 题目:一个n个点的树每个点有一个权值,支持修改单点权值,求某两点路径上的点权和或最大点权. #include <cstdio> using nam ...

  7. Linux数据包路由原理、Iptables/netfilter入门学习

    相关学习资料 https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html http://zh.wik ...

  8. 一个cheat命令 == Linux命令小抄大全

    本文介绍一个Linux超级命令,有了这个命令,你就可以开开心心的使用linux上的各种命令了.当你要执行一个linux命令,在这个命令参数选项众多时,你一般怎么做?对,我们大多数人都会去求助man命令 ...

  9. PHP实现发红包程序(helloweba网站经典小案例)

    我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...

  10. ThinkPHP 购物商城网站(数据库中增删改查的功能实现)——————重点——————

    控制器 ---------------------GoodsController.class.php------------------------------------------------- ...