最近由于工作需要,鄙人被迫转入SLAM领域,实属无奈,为了讨口饭吃,被迫放弃最初的梦想,哭哭哭哭哭,最近发现SLAM也蛮好玩的哈,哎,真香!话不多说,还是那句话,为了督促自己认真学习,记录以下复现的第一个SLAM相关的项目吧。
ORB_SLAM是一种基于 ORB特征的三维定位与地图构建算法,OBR_SLAM家族已经更新到第三代了,今天我们就来复现以下ORB_SLAM3,虽然距今已经两年多了,对于刚入门的人来说,复现最新版本是最好的选择。
源码连接:https://github.com/UZ-SLAMLab/ORB_SLAM3
推荐学习:https://mp.weixin.qq.com/s/h1OIxdYQ5Eu-2OAHhsVcIQ
下面我们就来一步步复现吧,条件不好的同学,建议使用虚拟机Ubuntu18.04,版本不建议太高或者太低,容易出问题。
安装好虚拟机后,建议更换到国内源,打开终端,开始安装gcc,g++
,gcc
是C语言编译器,g++
是C++编译器,所以这两个都建议安装以下。然后就是安装Cmake
跨平台编译工具。
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install build-essential
sudo apt-get install cmake
安装过程可以根据作者提供的过程来,可能操作过程会出现很多错误,每个人出现的错误不一样,我建议更换成国内源可能问题会少一些。官方安装连接。
值得注意的是官方说opencv3.2和4.4都测试过,可以跑通,但是很多同学反应,只有4.4能用,我建议安装opencv4.4。
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
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
nproc
查询。make -j2
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
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
#include
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
安装Eigen相对简单,没什么好说的,直接上代码。
git clone https://gitlab.com/libeigen/eigen.git
cd eigen
mkedir build
cd build
cmake ..
make
sudo make install
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
cd ORB_SLAM3
chmod +x build.sh
./build.sh
下载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特征,地图视频中出现的绿色线路径代表相机的运动路径,蓝色小方框代表的相机的运动过程,也就是关键帧,黑点代表过去路标,红点代表现在路标。
今天博客就写到这里,由于,博客内容太多,页面总是卡顿,所以剩下的部分,我另外再接着写,后面我会多所有数据都测试一遍,并且做结果评价。