视觉SLAM十四讲
背景
由于本书发行时间较早,且当下软件更新迭代速度较快,因此该书的原版代码依赖了许多旧版本的库文件,而很多库多版本操作配置起来较为繁琐,以及在与他人联合开发时容易产生编译冲突,因此选择在
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
本节的例程使用
cmake
和g++
编译c++
程序
1. 安装 cmake 及 g++
按照惯性,进入ch2
后,首先创建build
文件夹,由于是在Docker
环境中,为了便于区分,命名为build-docker
文件夹
mkdir build-docker && cd build-docker
由于该Container
环境太干净,需要先手动安装cmake
及g++
apt-get install cmake
apt-get install g++
2. 编译例程
CMakeLists.txt
已经写好(所有章节均是),因此可直接执行
cmake ..
make -j4
编译完成后执行
./helloSLAM
// -- Hello SLAM!
Chapter 3
本节的例程使用
Eigen
和Pangolin
库,可检验Docker
可视化是否成功
1. 安装 Eigen
apt-get install libeigen3-dev
2. 安装 Pangolin
为了保证与本书的库版本一致,直接编译3rdparty
中作者提供的库源码,Pangolin
依赖OpenGL
与glew
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.cpp
中line10&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
修改为libvtk6
,tiff4
修改为tiff
,libjasper-dev
需手动添加
apt-get install software-properties-common
add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
安装与本书相同的版本OpenCV 3
,OpenCV下载地址
可以直接在本地下载,然后复制到/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.cpp
中line6
的路径为绝对路径
// -- 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
同理,cd
到ch5/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.cpp
中line56
// -- cv::imshow("disparity", disparity / 96.0);
cv::imshow("disparity1", disparity / 96.0);