Bootstrap

【Docker】《视觉SLAM十四讲》Docker环境配置及代码复现

背景

由于本书发行时间较早,且当下软件更新迭代速度较快,因此该书的原版代码依赖了许多旧版本的库文件,而很多库多版本操作配置起来较为繁琐,以及在与他人联合开发时容易产生编译冲突,因此选择在Docker中配置原版代码环境,从而避免与本地库版本冲突造成的麻烦,节省该书的学习成本,记录此教程供参考

Docker 环境配置

1. 拉取 Docker 镜像

sudo docker pull ubuntu:20.04

拉取的为ubuntu20.04版本镜像,环境十分干净(啥也没有),通过以下命令查看

sudo docker images

如下
在这里插入图片描述

2. 创建 Container 容器

使用如下命令挂载显示及本地代码仓库,自行修改xxx地址

sudo docker run -it -v /home/xxx/Projects/slam:/home/xxx/Projects/slam --device=/dev/dri --volume=/tmp/.X11-unix:/tmp/.X11-unix --env="DISPLAY=$DISPLAY" --name=slam-display 626a /bin/bash

创建后默认会直接进入Contanier,如果没有,可通过以下命令启动并进入

sudo docker start slam-display
sudo docker exec -it slam-display /bin/bash

注意:进入Contanier之前需要先在该terminal内执行xhost +命令,否则无法挂载可视化

terminate called after throwing an instance of 'std::runtime_error'
what():  Pangolin X11: Failed to open X display
Aborted (core dumped)

3. 拉取源码

git clone https://github.com/gaoxiang12/slambook2.git

以上命令拉取仅包含各章节代码,其中3rdparty内的库属于submodule并未拉取,需先进入slambook2目录后执行

git submodule init
git submodule update

若下载失败或速度太慢可选择更改源,需先在该Container中安装vim

apt-get update
apt-get install vim

安装完成后通过vi /etc/apt/source.list更改source.list文件内容为

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

更改完成后执行apt-get update


Chapter 2

本节的例程使用cmakeg++编译c++程序

1. 安装 cmake 及 g++

按照惯性,进入ch2后,首先创建build文件夹,由于是在Docker环境中,为了便于区分,命名为build-docker文件夹

mkdir build-docker && cd build-docker

由于该Container环境太干净,需要先手动安装cmakeg++

apt-get install cmake
apt-get install g++

2. 编译例程

CMakeLists.txt已经写好(所有章节均是),因此可直接执行

cmake ..
make -j4

编译完成后执行

./helloSLAM
// -- Hello SLAM!

Chapter 3

本节的例程使用EigenPangolin库,可检验Docker可视化是否成功

1. 安装 Eigen

apt-get install libeigen3-dev

2. 安装 Pangolin

为了保证与本书的库版本一致,直接编译3rdparty中作者提供的库源码,Pangolin依赖OpenGLglew

apt-get install libgl1-mesa-dev mesa-common-dev libglu1-mesa-dev
apt-get install libglew-dev

安装完成后编译Pangolin源码并安装

cd 3rdparty/Pangolin
mkdir build-docker && cd build-docker
cmake ..
make -j4
make install

3. 编译例程

回到ch3/build-docker目录下编译例程

cmake .. && make -j4

编译成功后执行visualizeGeometry

./visualizeGeometry/visualizeGeometry

出现如下画面说明可视化成功
在这里插入图片描述
注意,如果按照惯性在build目录下执行编译产物,则examples/plotTrajectory.cpp例程中line11需要修改

// -- string trajectory_file = "./examples/trajectory.txt"; 
string trajectory_file = "../examples/trajectory.txt";

重新make之后执行plotTrajectory

./examples/plotTrajectory

出现如下画面
在这里插入图片描述
至此可判定Docker可视化取得圆满成功,其余 Eigen相关代码例程已同时编译完成,自行执行查看结果,不在此浪费篇幅


Chapter 4

本节的例程使用Sophus

1. 安装 Sophus

进入3rdparty/Sophus编译Sophus源码,直接编译会遇到如下问题

error: implicitly-declared 'Eigen::Map<Sophus::SO2<double> >::Map(const Eigen::Map<Sophus::SO2<double> >&)' is deprecated [-Werror=deprecated-copy]

需要在CMakeList.txt中添加如下语句

set(CMAKE_CXX_FLAGS "-Wno-error=deprecated-declarations -Wno-deprecated-declarations")

在这里插入图片描述
重新编译

cmake ..
make -j4 && make install

2. 编译例程

其中ch4/example/trajectoryError.cppline10&11需要修改

// -- string groundtruth_file = "./example/groundtruth.txt";
// -- string estimated_file = "./example/estimated.txt";
string groundtruth_file = "../example/groundtruth.txt";
string estimated_file = "../example/estimated.txt";

编译完成后执行

./example/trajectoryError

显示
在这里插入图片描述


Chapter 5

本节的例程使用OpenCV

1. 安装 OpenCV

首先安装本书推荐的OpenCV依赖项,建议每个依赖项单独安装,以免漏掉报错

apt-get install build-essential libgtk2.0-dev libvtk6-dev libjpeg-dev libtiff-dev libjasper-dev libopenexr-dev libtbb-dev

其中libvtk5修改为libvtk6tiff4修改为tifflibjasper-dev需手动添加

apt-get install software-properties-common
add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"

安装与本书相同的版本OpenCV 3OpenCV下载地址
在这里插入图片描述

可以直接在本地下载,然后复制到/home/xxx/Projects/slam/slambook2/3rdparty目录下,因为该目录在Container创建的时候已挂载,因此可以找到
也可以通过命令下载,首先需要安装git

apt-get install git
git clone https://github.com/opencv/opencv.git
git checkout 3.4.0 // -- 切换到 3.4.0 版本分支

下载完成后进入OpenCV目录

cmake .. && make -j4 && make install

2. 编译例程

编译完成后执行imageBasics

./imageBasics/imageBasics ../imageBasics/ubuntu.png

在这里插入图片描述
修改imageBasics/undistortImage.cppline6的路径为绝对路径

// -- string image_file = "./distorted.png";   // 请确保路径正确
string image_file = "/home/xxx/Projects/slam/slambook2/ch5/imageBasics/distorted.png";

执行distortImage

./imageBasics/undistortImage

在这里插入图片描述
直接在build目录下直接执行joinMap会报错,若懒得修改代码中的相对路径,可切换至提示目录下

./rgbd/joinMap
// -- 请在有pose.txt的目录下运行此程序

更改执行目录到ch5/rgbd下,执行joinMap

../build-docker/rgbd/joinMap

在这里插入图片描述
同理,cdch5/stereo目录下执行stereoVision

../build-docker/stereo/stereoVision

在这里插入图片描述
若出现如下报错

Gtk-Message: 18:03:03.855: Failed to load module "canberra-gtk-module"
The program 'disparity' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadAccess (attempt to access private resource denied)'.
  (Details: serial 197 error_code 10 request_code 130 minor_code 1)
  (Note to programmers: normally, X errors are reported asynchronously;
   that is, you will receive the error a while after causing it.
   To debug your program, run it with the --sync command line
   option to change this behavior. You can then get a meaningful
   backtrace from your debugger if you break on the gdk_x_error() function.)

则修改stereoVision.cppline56

// -- cv::imshow("disparity", disparity / 96.0);
cv::imshow("disparity1", disparity / 96.0);

Chapter 6


EndLine

;