目录
- 关于ORB-SLAM2
- 环境搭建
- 已有环境
- 创建环境
- 新建项目目录
- 安装Pangolin
- 安装OpenCV 3.2
- 安装Eigen
- DBoW2 and g2o (Included in Thirdparty folder)
- 尝试运行
- 测试环境搭建是否成功
- 尝试数据集
- 出现一系列新bug
- 成功运行双目数据集
- 下一步
关于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库 - Pangolin
git clone
之后,安装Pangolin必须的依赖- OpenGL
sudo apt install libgl1-mesa-dev
- Glew
sudo apt install libglew-dev
,也是OpenGL的库 - CMake
sudo apt install cmake
,CMake就要好好介绍介绍了~在openCV下载与MacOS系统下的cLion配置一文中,我已经粗浅的接触到C与C++编译环境的配置,此处又涉及而且刚刚结束的一学期OS课程中粗浅地学习了链接等知识,故而在CMake & Make——链接初探一文中看看CMake & Make~
- OpenGL
- Pangolin推荐的和选择性的依赖,下面我会逐一将探索得到的相关软件信息记录,并判断是否有利于项目,决定是否安装
- Wayland
sudo apt install pkg-config
&sudo apt install pkg-config
按照wiki上的说明,"Wayland是一个通信协议,规定了显示服务器与其客户机之间的通信方式。窗口管理器简化成显示管理服务,专门负责渲染那些屏幕上的程序。这比X Window System中的窗口管理器要更简单、高效。"考虑项目可能涉及阶段性的窗口视频显示来代替VR HMD显示,所以下载 - FFMPEG (For video decoding and image rescaling)
sudo apt install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev
项目涉及硬件及软件编解码,FFMPEG也是编解码常用的平台,故下载 - DC1394 (For firewire input)
sudo apt install libdc1394-22-dev libraw1394-dev
适用于firewire camera,项目仅涉及视频流层面,但为未涉及摄像头层面,故未下载 - libuvc (For cross-platform webcam video input via libusb)
git://github.com/ktossell/libuvc.git
项目确实采用的是UVC camera,相关介绍可见libuvc与webcam的开发(一) - UVC协议,但是我么购买的是商家集成封装好的直接USB3.0接口导出视频流的摄像机,故此处不需。 - libjpeg, libpng, libtiff, libopenexr (For reading still-image sequences)
sudo apt install libjpeg-dev libpng12-dev libtiff5-dev libopenexr-dev
...GitHub上还有一些,但没有仔细介绍,而且和项目无关,故不写
- Wayland
- 搭环境(以下关于
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/
安装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完全编译安装(下文和这篇博客有不同的命令行使用习惯,建议完全按照一篇,勿混用)
- 下载OpenCV 3.2的.tar.gz版本到项目
SLAM
目录下 - 解压
tar -zxvf [filename.tar.gz]
(Linux下的打包解压,随意搜索即得,至于tar
之后参数的意义倒是非常好奇) - 安装一些官网上没说,但之后发现ORB - SLAM2必须要的依赖,安装libgtk2.0-dev
sudo adt-get install libgtk2.0-dev
和 pkg-configsudo apt-get install pkg-config
- CMake将分散的程序构建为可执行文件
- 下载OpenCV 3.2的.tar.gz版本到项目
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."
- 官网下载3.3.7版本到项目SLAM目录下
- 解压
tar -jxvf [filename.tar.bz2]
- CMake & Make,同上面几个几乎一样的步骤
- 代码如下
cd [eigen] # file name of eigen dir
mkdir build
cd build
cmake ..
make
sudo make install
-
但在进行了第三行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
符合版本要求
DBoW2 and g2o (Included in Thirdparty folder)
- 最初以为这两个库也需要安装,但发现在下载的ORB-SLAM2的 GitHub中的
Thirdparty
中有,而且build.sh
文件里面也有想过安装,故不需要自己安装。
尝试运行
- 在项目目录SLAM下
cd ORB_SLAM2-master/
- 一系列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
- Debug(回忆起了OS vim 干de bug的心酸经历...不过目前碰到的几个bug相对课上任务来说非常容易)
error: usleep is not declared in this scope
,加入下面的头文件:
#include
#include
#include
-
这条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-configsudo apt-get install pkg-config
,然后re-run
- 按照要求,乖乖的install libgtk2.0-dev
成功运行双目数据集
下一步
- 基于项目需求,分析SLAM算法,或融入或提取出项目需要的部分
- 双目视频流导入
- 实时求出每几帧视频图像上点阵对应实物到摄像头的距离
上述内容如有问题,恳请指正