目录

写在前面:

环境说明:

准备工作(安装依赖):

源码下载:

Pangolin安装:

OpenCV安装

Eigen3安装

DBoW2 and g2o

Python

安装boost库

安装libssl-dev

        ORB_SLAM3的编译和安装

源码编译:

数据集测试

 运行截图:


写在前面:

ps:2023年4月20日补充说明:

本文是当初我自己跑的时候的踩坑记录,主要记录了当时我跑ORBslam3时候遇到的问题和解决方案,希望能帮到大家。另外,由于时效问题,此教程可能与最新的源码有出入,请自行辨别(如遇到问题可以看看本文的评论区,很多大佬留下了宝贵的经验,也许可以对你有帮助~~~)

---------------以下是原文-------------

准备跑一下ORB-SLAM3,然后配置运行也是自己在网上搜索相关的博客跟着做的,参考了很多博客,而且由于博文发布时间原因,并没有哪一篇博客可以从头到尾解决所有问题,都是边装边搜索新的解决办法。

所以在此记录一下整个安装过程以及遇到的问题和解决方案。解决过程中所参考的博客链接我都会放出来。

ps:我是用的虚拟机安装的,并且是在一个新系统上开始配置的

所以我的操作步骤是在一个全新的Ubuntu上做的,参考博客的同学注意一下(如果你已经在系统上安装过了一些包,则有些步骤可以省去)

环境说明:

我用的是虚拟机VMware运行的

Ubuntu版本是20.04  (系统是在官网下载的)

ORB-SLAM3源码: https://github.com/UZ-SLAMLab/ORB_SLAM3

准备工作(安装依赖):

ps:整个安装的大致流程我参考的是这篇博客

Ubuntu16.04下ORB_SLAM3的编译及运行【完整教程】_orbslam3运行_jian_1996的博客-CSDN博客

但是中间遇到了很多问题

源码下载:

去github上直接clone到本地   https://github.com/UZ-SLAMLab/ORB_SLAM3

最好先创建个文件夹,把待会要下载的东西都到这个文件夹下。

git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git

注意,如果你没装git,跟我一样是新系统,那要先装git

sudo apt-get install git

另外,如果是新系统的话,预装的vi编辑器不完整,用不了。

执行如下命令安装vi编辑器。后边要用

sudo apt-get remove vim-common
sudo apt-get install vim

Pangolin安装:

先去github把代码clone下来

地址:github.com/stevenlovegrove/Pangolin

git clone https://github.com/stevenlovegrove/Pangolin.git

然后安装按照GitHub给的依赖挨个安装即可

然后Optional Dependencies for video inputVery Optional Dependencies里面的我没有装。

安装好依赖了之后编译安装Pangolin

cd Pangolin
mkdir build
cd build
cmake ..
cmake --build .

OpenCV安装

源码要求OpenCV 3.2及以上。

但是最好不要安装OpenCV4以上(4默认不会生成.pc文件,最后查看版本的时候查看不到,找不到包,网上有人说是编译选项没选好,我改了,还是不行,我也不知道是啥原因,最后我换了3.4版本的)

首先,到官网去下载源码:Releases - OpenCV

我下载的是3.4.3版本

下载之后放到你想放的位置,然后把他解压

unzip opencv-3.4.3.zip

解压之后,cmake前面安装过了,如果没装的,安装一下

sudo apt-get install cmake

更新一下,准备开始安装OpenCV依赖库(不更新也行)

sudo apt-get update

这几个依赖库,一条指令完成

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev

注意:我在运行上面这个指令的时候报错了,提示说

error: unable to locate libjasper-dev    无法定位这个包libjasper-dev

解决办法是:执行如下指令

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

其中libjasper1是libjasper-dev的依赖包

运行完这个,在安装下面这个指令就没错了

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev

安装好了依赖,编译OpenCV

cd opencv-3.4.3
mkdir build
cd build

cmake

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

注意:执行上面指令后,终端会自动下载一个必需的ippicv加速库。
如果电脑配置了vpn并进入外网,便会卡住一会进行下载;

否则,不会卡住,而是报错提示ippicv_2017u3_lnx_intel64_general_20170822.tgz的加速库下载失败。报错如下:

解决办法是:下载离线的ippicv库

去这里下载  GitHub - opencv/opencv_3rdparty at ippicv/master_20170822

下载好了之后,把这个ippicv文件夹单独拷贝出来,放到你的文件夹下面。

然后把你的OpenCV源文件中 /3rdparty/ippicv 文件夹下的 ippicv.cmake 中,

第47行"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/" 改成你新下载的ippicv文件路径

比如我的新下载的ippicv我放在ORB-SLAM3下面

我的就改为"file:///home/ORB-SLAM3/ippicv",如此,便改成了离线编译ippicv文件

反正你改成你下载后存的路径就行了,很好理解。

再次执行cmake命令,就完成了编译

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

然后make一下

( j4 代表4核  我虚拟机分配的8核   我编译用的4核   也可以不用 直接 make即可 就是慢一点)

make -j4

make的时间可能略微长一些,我花了十几分钟左右。耐心等待下。好了之后,安装

(不要忘了这一步,没有这个不算成功)

sudo make install

到此,OpenCV就安装好了,然后我们配置一下环境

1)添加库路径

sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'

2)更新系统库

sudo ldconfig

3)配置bash

sudo gedit /etc/bash.bashrc

在末尾粘贴如下两行代码

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH 

4)保存,执行如下命令使得配置生效:

source /etc/bash.bashrc 

5)更新

sudo updatedb  

如果该指令报错,那么可能是没有安装mlocate

先执行安装命令

apt-get install mlocate

然后再 sudo updatedb

6)opencv版本检测

pkg-config --modversion opencv

注意:如果执行后,显示找不到包。那么注意下你下载的OpenCV版本是不是3.多的  

OpenCV版本4以上的,默认不生成.pc文件,会出现找不到包的问题

输出如下,表示opencv完成了安装

Eigen3安装

安装Eigen3的时候,请下载源码进行安装。

如下

#github 有个mirror,版本3.3.4 from 2017
git clone https://github.com/eigenteam/eigen-git-mirror

#安装
cd eigen-git-mirror
mkdir build
cd build
cmake ..
sudo make install

#安装后,头文件安装在/usr/local/include/eigen3/

不要采用如下指令安装eigen3

sudo apt-get install libeigen3-dev

如果采用这个指令安装,默认是安装到了/usr/include/eigen3,ORB-SLAM3检测不到,导致编译会报错。利用源码安装,安装好的路径是   /usr/local/include/eigen3/

DBoW2 and g2o

DBoW2主要用于回环检测,g2o(General Graph Optimization)主要用于图优化。
ORB-SLAM3的源码包自带DBoW2 and g2o,编译时会自动安装。不用管。

Python

执行如下指令

sudo apt install libpython2.7-dev

安装boost库

由此链接进入boost官网:Boost C++ Libraries

我下载的是1.75.0

下载之后解压:

tar -xzvf boost_1_75_0.tar.gz

解压之后进入解压出来的文件夹

然后执行这个脚本

sudo ./bootstrap.sh

执行完毕之后,你会发现又多了些文件

执行如下脚本

sudo ./b2 install

这可能需要些时间,等他安装完毕。

安装libssl-dev

执行

sudo apt-get install libssl-dev

ORB_SLAM3的编译和安装

源码编译:

进入源码文件夹

cd ORB_SLAM3
chmod +x build.sh
./build.sh

注意:这个build.sh是官方给的安装脚本,执行这个即可编译

但是我遇到一个问题,我执行这个编译完不成,出现了报错

这个报错原因就是内存不够,我虚拟机分配的8G内存。

然后我把虚拟机分配16G内存,再次执行build.sh

同时我打开另一个终端,查看内存使用情况。如图

发现疯狂吃内存,飙升到14G,而且还在上升。最后还是报错,内存不够。

不过我觉得不应该啊。不应该16G还不够

所以我换了个方法编译

打开build.sh这个脚本

脚本里面内容如下

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


echo "Configuring and building ORB_SLAM3 ..."

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j

我不执行这个脚本,而是挨个执行里面的语句,自己手动编译

并且我把这里面的make -j  换成了make -j4 来执行

(因为 make -j 的话会自动检测你的核心数,选用合适的数量,我感觉是我分配的太多了,我分了八核,编译时候16G内存都不够,后来我改成了 make -j4  竟然编译好了,而且也不是很慢,就不到十分钟的样子。我也搞不懂,这块可能跟自己电脑有关吧)

这里你可以根据自己情况,如果一直不行的话,可以试试换成make

单核编译,就是速度慢一些而已

注意:脚本里面的指令,前面安装库啥的都没问题

到了最后,编译源码出问题了

报错如下

make[2]: *** [CMakeFiles/ORB_SLAM3.dir/build.make:89:CMakeFiles/ORB_SLAM3.dir/src/LocalMapping.cc.o] 错误 1

make[2]: *** [CMakeFiles/ORB_SLAM3.dir/build.make:349:CMakeFiles/ORB_SLAM3.dir/src/CameraModels/KannalaBrandt8.cpp.o] 错误 1

解决办法是:

在报错的文件里,如KannalaBrandt8.cpp,LocalMapping.cc

在include之后加上如下代码

namespace cv
{
template<typename _Tp, int m, int n> static inline
Matx<_Tp, m, n> operator / (const Matx<_Tp, m, n> &a, float alpha)
{
return Matx<_Tp, m, n>(a, 1.f / alpha, Matx_ScaleOp());
}
}

参考博客:安装orbslam3时报错:error: no match for ‘operator/’_威少少熬夜的博客-CSDN博客

如果你报错:error: no match for ‘operator/’

也可以使用这个方法解决。

另外:如果你还遇到了其他错误,可以参考这篇博客

ORB-SLAM2编译错误_嵙杰的博客-CSDN博客

例如:

make[2]: *** [CMakeFiles/ORB_SLAM2.dir/src/LoopClosing.cc.o] Error 1
CMakeFiles/Makefile2:178: recipe for target 'CMakeFiles/ORB_SLAM2.dir/all' failed
make[1]: *** [CMakeFiles/ORB_SLAM2.dir/all] Error 2
Makefile:83: recipe for target 'all' failed

最终编译成功。

数据集测试

数据集下载地址:(下载很慢,百度云有会员的同学可以用我给的百度云链接)

kmavvisualinertialdatasets – ASL Datasets

要下载ASL格式的,我下的是第一个MH01

注意:这个网站下载的贼慢。

我这里放一个百度云链接,是我下载出来的MH01的压缩包

链接:https://pan.baidu.com/s/1glBWtlwACJnnuRqGrnMy-g 
提取码:gixc 

这个压缩包下好了之后,把他解压了,里面是一个mav0的文件夹(注意看你下的对不)

然后在你的文件夹下,我的是ORB-SLAM3文件夹下,创建一个文件夹叫dataset

dataset文件夹下再创建一个MH01文件夹

然后把mav0文件夹放到MH01里面去

然后,在ORB-SLAM3的源码中,有一个Examples文件夹,

这个文件夹下有一个脚本“euroc_examples.sh“。打开这个脚本

你可以看到有一个与MH01有关的指令(就是第一条) 指令如下:

./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH01 ./Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono

把这条指令复制出来:(我的指令复制出来如下)

./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH01 ./Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono

其中我标红的需要改:

"$pathDatasetEuroc"/MH01  改成你自己的路径,比如我的路径就是  

../dataset/MH01

为什么是这样,因为我观察这个指令,会发现他所执行的程序

比如./Monocular/mono_euroc

这个Monocular文件夹是在Examples文件夹下的,那也就意味着这个指令是在Examples文件夹下执行的才对

然后呢,咱们的数据集dataset在上一层文件夹呢

故改成 ../dataset/MH01

然后再把末尾的dataset-MH01_mono删了

最后就得到了如下指令

./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml ../dataset/MH01 ./Monocular/EuRoC_TimeStamps/MH01.txt

然后在Examples文件夹下,打开终端,执行如下指令

ORB-SLAM3就运行起来啦

运行截图:

刚开始

中间

快结束的时候

运行结束后终端显示如下

大概记录了下我运行的过程以及遇到的问题

如有不足,欢迎指正~

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐