ORB_SLAM3
前言
最近由于工作需要,鄙人被迫转入SLAM领域,实属无奈,为了讨口饭吃,被迫放弃最初的梦想,哭哭哭哭哭,最近发现SLAM也蛮好玩的哈,哎,真香!话不多说,还是那句话,为了督促自己认真学习,记录以下复现的第一个SLAM相关的项目吧。
1. ORB_SLAM3
ORB_SLAM是一种基于 ORB特征的三维定位与地图构建算法,OBR_SLAM家族已经更新到第三代了,今天我们就来复现以下ORB_SLAM3,虽然距今已经两年多了,对于刚入门的人来说,复现最新版本是最好的选择。
源码连接:https://github.com/UZ-SLAMLab/ORB_SLAM3
推荐学习:https://mp.weixin.qq.com/s/h1OIxdYQ5Eu-2OAHhsVcIQ
下面我们就来一步步复现吧,条件不好的同学,建议使用虚拟机Ubuntu18.04,版本不建议太高或者太低,容易出问题。
2. 准备环境
2.1 C++11 Compiler
安装好虚拟机后,建议更换到国内源,打开终端,开始安装gcc,g++
,gcc
是C语言编译器,g++
是C++编译器,所以这两个都建议安装以下。然后就是安装Cmake
跨平台编译工具。
- gcc,g++
sudo apt-get install gcc
sudo apt-get install g++
- cmake
sudo apt-get install build-essential
sudo apt-get install cmake
2.2 Pangolin
安装过程可以根据作者提供的过程来,可能操作过程会出现很多错误,每个人出现的错误不一样,我建议更换成国内源可能问题会少一些。官方安装连接。
2.3 Opencv
值得注意的是官方说opencv3.2和4.4都测试过,可以跑通,但是很多同学反应,只有4.4能用,我建议安装opencv4.4。
- 官网下载安装包
官网连接,官网提供了很多下载方式,注意下载Sources哈
- 解压切换到路径下
unzip opencv-4.4.0.zip
cd opencv-4.4.0
- 下面开始安装依赖项
sudo apt-get install git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
- Cmake一下
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_GTK=ON -D OPENCV_GENERATE_PKGCONFIG=YES ..
备注:
命令 | 说明 |
---|---|
CMAKE_BUILD_TYPE=RELEASE | 发布版本 |
CMAKE_INSTALL_PREFIX | 动态库的安装路径,可以自定义 |
WITH_GTK=ON | libgtk2.0-dev是否安装成功 |
OPENCV_GENERATE_PKGCONFIG=YES | 自动生成OpenCV的pkgconfig文件 |
提示安装多个版本,可以这样修改,其他不变
# 设置安装路径
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.4.0 -D WITH_GTK=ON -D OPENCV_GENERATE_PKGCONFIG=YES ..
# 添加环境变量,想使用那个版本,就把哪个版本注释即可
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv-4.4.0/lib/pkgconfig
export PKG_CONFIG_PATH
- 编译make
使用多系统内核进行编译,可以通过nproc
查询。
make -j2
- make安装
sudo make install
注释:如果中途出现错误,需要从新编译,需要先清空build文件。
- 添加库路径
sudo vim /etc/ld.so.conf
在文件中添加如下代码include /usr/loacal/lib
,记住保存退出(ESC + : + wq!
)。也可以手动生成opencv.conf
,打开sudo vim /etc/ld.so.conf.d/opencv.conf
,写入/usr/local/lib
。注意opencv.conf
,是vim手动生成的空文件。
- 使路径生效
sudo ldconfig
- 配置系统环境
sudo vim /etc/bash.bashrc
在文件末尾添加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
同样使用(ESC + : + wq!
)保存退出。
- 使系统变量生效
source /etc/bash.bashrc
- 测试环境配置是否成功
pkg-config --modversion opencv4
pkg-config --cflags opencv4
pkg-config --libs opencv4
出现以上结果,恭喜您已经大功告成了,如果你还想检验一下,库能否正常调用,那么你可以测试一下代码。
新建一个测试文件test.cpp
。在终端输入(新建文件touch test.cpp
) (打开文件gedit test.cpp
)输入以下代码保存。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("image.jpg");
imshow("Display Image window",srcImage);
waitKey(0);
return 0;
}
注意放一张图片在同级目录下哈,并且改名图片名为image.jpg
。编译使用如下命令。
g++ `pkg-config opencv4 --cflags` test.cpp -o demo `pkg-config opencv4 --libs`
./demo
走到这里恭喜你,喜提opencv4.4
。
2.4 Eigen
安装Eigen相对简单,没什么好说的,直接上代码。
git clone https://gitlab.com/libeigen/eigen.git
cd eigen
mkedir build
cd build
cmake ..
make
sudo make install
3. 复现ORB_SLAM3
3.1 下载代码
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
3.2 执行build.sh
cd ORB_SLAM3
chmod +x build.sh
./build.sh
3.3 测试EuRoC数据集
下载EuRoC MAV Dataset数据集,下面以这个数据集为例。点击连接下载,在ORB_SLAM3路径下新建文件Datasets
(mkidr Datasets
),将下载的数据集重命名为MH01
放入Datasets
文件中。注意路径哈,不然会出错。
一定要注意路径相对应哈
./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ./Datasets/MH01/ ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono
出现以下问题,就是在运行一遍命令。./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ./Datasets/MH01/ ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono
另外可能运行中出现这个问题,既不报错,又没有结果,如下,这个问题花了很长时间解决。
The output in terminal is as follows.
Initialization of Atlas from scratch
Creation of new map with id: 0
Creation of new map with last KF id: 0
Seq. Name:
There are 1 cameras in the atlas
Camera 0 is pinhole
[ INFO:0] global /home/ber/Documents/software/opencv-4.5.4/modules/core/src/parallel/registry_parallel.impl.hpp (96) ParallelBackendRegistry core(parallel): Enabled backends(3, sorted by priority): ONETBB(1000); TBB(990); OPENMP(980)
First KF:0; Map init KF:0
New Map created with 271 points
解决办法,可以查看连接,就是Examples/Monocular/mono_euroc.cc
这个文件中的false to true
,大概在这个位置。
下面是正常运行的结果。
注释:视频图像中出现的绿色小方框是提取到的ORB特征,地图视频中出现的绿色线路径代表相机的运动路径,蓝色小方框代表的相机的运动过程,也就是关键帧,黑点代表过去路标,红点代表现在路标。
总结
今天博客就写到这里,由于,博客内容太多,页面总是卡顿,所以剩下的部分,我另外再接着写,后面我会多所有数据都测试一遍,并且做结果评价。