基于Ubuntu的ORB-SLAM2项目环境搭建过程

关于ORB-SLAM2

  • 机器人所研究SLAM的学长介绍,ORB-SLAM2是双目SLAM的很成熟的一个算法
  • 由于项目需要双目摄像头测的距离来调节摄像头焦距,以及后期的实景AR加入,所以从双目视频流,得到每一帧图像上每一点,对应实际的摄像头到实际物体间的空间距离,和摄像头所在实景的三维空间数据,是项目采用ORB-SLAM2算法的原因
  • 相关博客会记录,ORB-SLAM2环境搭建ORB-SLAM2代码原理和实际测试双目SLAM测出距离对应焦距调节(后两个,之后完成补上链接)

环境搭建

  • 环境搭建总体参考上节中GitHub链接,以及ORB-SLAM2搭建详细过程
  • 记录如下原因,
    • 一是为针对本项目需要(双目视频流实时测距)的环境搭建提供提醒和参考
    • 二是第一次接触CV工程化代码,希望自己除了乖乖的听话的搭建环境之外,了解工程化代码的依赖、链接...等关系,也为之后项目系统搭建、降低时延优化,夯实基础。
    • 三是虽然环境搭建已经有前车之鉴,但是在计算机学院的诸多环境配置中,博客总结终究纸上得来,无法应对复杂的环境变化;而且博客上的方法,很多还是不如官方库、GitHub - Readme中的方法,下文完全遵循各GitHub - Readme,加之自己bug的补充,或许能提供更舒适的用户体验~

已有环境

  • 没有如下软件或环境,最好先行安装;检查是否有该环境的最好方式应该是查看--version了~
    • Ubuntu16.04
    • apt 1.2.29 (amd64)
    • git 2.7.4
    • gcc 5.4.0
    • python 2.7.12

创建环境

新建项目目录

  • 目录SLAM (我取的项目名,随意即可~)

安装Pangolin

  • GitHub for Pangolin,在Readme中已经有一个安装说明,补充一个参考ubuntu Pangolin 从源码安装
  • What is pangolin? 穿山甲hhh~从CV角度,阅读过上小段中GitHub - Readme中的简介,概述可以说是加快3D可视化和UI交互的OpenGL库
  • Pangolingit clone之后,安装Pangolin必须的依赖
    1. OpenGL sudo apt install libgl1-mesa-dev
    2. Glew sudo apt install libglew-dev ,也是OpenGL的库
    3. CMake sudo apt install cmake ,CMake就要好好介绍介绍了~在openCV下载与MacOS系统下的cLion配置一文中,我已经粗浅的接触到C与C++编译环境的配置,此处又涉及而且刚刚结束的一学期OS课程中粗浅地学习了链接等知识,故而在CMake & Make——链接初探一文中看看CMake & Make~
  • Pangolin推荐的和选择性的依赖,下面我会逐一将探索得到的相关软件信息记录,并判断是否有利于项目,决定是否安装
    1. Wayland sudo apt install pkg-config & sudo apt install pkg-config
      按照wiki上的说明,"Wayland是一个通信协议,规定了显示服务器与其客户机之间的通信方式。窗口管理器简化成显示管理服务,专门负责渲染那些屏幕上的程序。这比X Window System中的窗口管理器要更简单、高效。"考虑项目可能涉及阶段性的窗口视频显示来代替VR HMD显示,所以下载
    2. FFMPEG (For video decoding and image rescaling) sudo apt install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev项目涉及硬件及软件编解码,FFMPEG也是编解码常用的平台,故下载
    3. DC1394 (For firewire input) sudo apt install libdc1394-22-dev libraw1394-dev 适用于firewire camera,项目仅涉及视频流层面,但为未涉及摄像头层面,故未下载
    4. libuvc (For cross-platform webcam video input via libusb) git://github.com/ktossell/libuvc.git 项目确实采用的是UVC camera,相关介绍可见libuvc与webcam的开发(一) - UVC协议,但是我么购买的是商家集成封装好的直接USB3.0接口导出视频流的摄像机,故此处不需。
    5. libjpeg, libpng, libtiff, libopenexr (For reading still-image sequences) sudo apt install libjpeg-dev libpng12-dev libtiff5-dev libopenexr-dev
      ...GitHub上还有一些,但没有仔细介绍,而且和项目无关,故不写
  • 搭环境(以下关于cmake指令在“CMake & Make——链接初探“一文中也有介绍)
    • 在搭环境之前,对pangolin源码做一点修改,避免之后出现bug
    • vim打开Pangolin/src/display/device/display_x11.cpp,改变第110行的GLX_DOUBLEBUFFER , glx_doublebuffer ? True : False,GLX_DOUBLEBUFFER , glx_doublebuffer ? False : False,
    • 搭环境:
  // under the directory of SLAM (the dir of my project)
  cd Pangolin
  mkdir build
  cd build
  cmake ..
  cmake --build .
  sudo make install		# can not find in the Readme.md of Pangolin GitHub, but it is necessary to install in /usr/local/bin/
  • 生成了一堆.o可执行文件,pangolin配置完成
    SLAM-pangolin环境搭建完成

  • 测试安装是否成功,可以在/usr/local/bin/include目录下查找。

安装OpenCV 3.2

  • 在之前的视频流拼接学习中,发现OpenCV是一款好用的视频图像处理软件,应该也是入门Computer vision的路径之一,只是版本较多更新也很多,网上的源码openCV2、3都有,我之前下载最新版本4.1,无奈网站上的大多数源码都通不过编译,而刚刚入门openCV的本咸鱼还不很了解OpenCV,代码运行常有一筹莫展
  • 所以,我的建议是,在熟练OpenCV之前,版本尽量和源码保持一致,此处GitHub显示ORB-SLAM2支持2.4.3 & 2.4.11 & 3.2
  • 下面说安装搭建OpenCV 3.2环境,部分参考ubuntu 16.04 OpenCV3.2.0完全编译安装(下文和这篇博客有不同的命令行使用习惯,建议完全按照一篇,勿混用)
    1. 下载OpenCV 3.2的.tar.gz版本到项目SLAM目录下
    2. 解压 tar -zxvf [filename.tar.gz] (Linux下的打包解压,随意搜索即得,至于tar之后参数的意义倒是非常好奇)
    3. 安装一些官网上没说,但之后发现ORB - SLAM2必须要的依赖,安装libgtk2.0-dev sudo adt-get install libgtk2.0-dev 和 pkg-config sudo apt-get install pkg-config
    4. CMake将分散的程序构建为可执行文件
  cd opencv-3.2.0/
  mkdir build
  cd build
  cmake ..
  make		# wait for several minutes
  # a lot of guidance of this instruction is `make -j4`
  # but i do not find out the meaning of parameter -j4, so i give up to use it
  sudo make install		# after compiling, install it to /usr/local/bin, so "sudo" higher permission is needed.
  • 测试安装是否成功,也可以直接跑一个openCV的程序
    • 输入 pkg-config --modversion opencv
    • 得到版本号3.2.0
  • 初步认为安装成功

安装Eigen

  • Eigen官网," is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms."
  1. 官网下载3.3.7版本到项目SLAM目录下
  2. 解压 tar -jxvf [filename.tar.bz2]
  3. CMake & Make,同上面几个几乎一样的步骤
  • 代码如下
cd [eigen] # file name of eigen dir
mkdir build
cd build 
cmake ..
make
sudo make install 
  • 但在进行了第三行cmake时
    SLAM-eigen-cmake结果

  • 发现有很多相关库没有装(有点困惑),所以尝试装了 Boost BLAS LAPACK,一个基础库,两个和线性代数相关的库

sudo apt-get update
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libblas-dev
sudo apt-get install liblapack-dev
  • 然后再进行cmake ..及其之后的指令操作

  • 这种方法,最终可用 /usr/local/include/eigen3/Eigen/src/Core/util$ vim Macros.h 查看版本 3.3.7,认为安装成功

  • 安装Eigen的另一种简单方法,在进行到第一次cmake之后,我在网上查了安装Eigen的步骤,ubuntu16.04+eigen3安装,但是上一种方法比较知根知底...

  • 发现 sudo apt-get install libeigen3-dev,一条指令即可完成安装,之后 cd /usr/include/eigen3/Eigen/src/Core/util/ 目录下的 Macros.h 查看版本号为 3.2.92 符合版本要求

SLAM-eigen-version

DBoW2 and g2o (Included in Thirdparty folder)

  • 最初以为这两个库也需要安装,但发现在下载的ORB-SLAM2的 GitHub中的 Thirdparty中有,而且build.sh文件里面也有想过安装,故不需要自己安装。

尝试运行

  1. 在项目目录SLAM下 cd ORB_SLAM2-master/
  2. 一系列cmake & make:给权限 chomd +x build.sh,运行 ./build.sh
  • 点评一二,为什么此处的cmake和make,跟上面见到的诸多cmake make不同呢~个人以为这是非常优秀的工程化开发习惯。
  • 输入 vim build.sh查看shell文件,发现在此文件中运行环境已经全部配置好
  • 提醒,有说法 make -j使用多编译器,容易崩,本机运行也崩了一次,在vim中将所有 make -j改为 make
echo "Configuring and building Thirdparty/DBoW2 ..."

cd Thirdparty/DBoW2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j

cd ../../g2o

echo "Configuring and building Thirdparty/g2o ..."

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j

cd ../../../

echo "Uncompress vocabulary ..."

cd Vocabulary
tar -xf ORBvoc.txt.tar.gz
cd ..

echo "Configuring and building ORB_SLAM2 ..."

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
  1. Debug(回忆起了OS vim 干de bug的心酸经历...不过目前碰到的几个bug相对课上任务来说非常容易)
  • error: usleep is not declared in this scope ,加入下面的头文件:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
  • 这条error出现的非常频繁,我猜测可能是Ubuntu16.4和14.4环境不同的原因,假如搭建过程中Ubuntu14.4中没出现这个问题,那我的猜测才可能有几分道理。

  • 也思考过把这三条头文件加入某个库函数比如 system.h 但是未找到,故尚未实施

  • 最终得到可执行的“ libORB_SLAM2.so at lib folder and the executables mono_tum, mono_kitti, rgbd_tum, stereo_kitti, mono_euroc and stereo_euroc in Examples folder."

测试环境搭建是否成功

尝试数据集

  • 下载Vicon Room 1 01到项目SLAM文件夹下,在ORB...文件夹下输入
    /ORB_SLAM2-master$ ./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml ../mav0/cam0/data ../mav0/cam1/data ./Examples/Stereo/EuRoC_TimeStamps/V101.txt

出现一系列新bug

  • 提醒:下文中所有的bug,均已在上文过程中修复🙏
  • 新bug1 : terminate called after throwing an instance of 'std::runtime_error' what(): Pangolin X11: Unable to retrieve framebuffer options Aborted (core dumped)
    • 对于这个问题,GitHub上我找到两种解决方案,方案1 & 方案2
    • 我采用方案2解决该问题之后,出现又一个新bug
  • 新bug2: /parallels/Desktop/slam/opencv-3.2.0/modules/highgui/src/window.cpp:565: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow
    • 按照要求,乖乖的install libgtk2.0-dev sudo adt-get install libgtk2.0-dev and pkg-config sudo apt-get install pkg-config,然后re-run

成功运行双目数据集

SLAM_stereo_demo0

下一步

  • 基于项目需求,分析SLAM算法,或融入或提取出项目需要的部分
    • 双目视频流导入
    • 实时求出每几帧视频图像上点阵对应实物到摄像头的距离

上述内容如有问题,恳请指正

posted @ 2019-07-30 13:39  yzy11235  阅读(2408)  评论(0编辑  收藏  举报