目录
写在前面:
环境说明:
准备工作(安装依赖):
源码下载:
Pangolin安装:
OpenCV安装
Eigen3安装
DBoW2 and g2o
Python
安装boost库
安装libssl-dev
ORB_SLAM3的编译和安装
源码编译:
数据集测试
运行截图:
准备跑一下ORB-SLAM3,然后配置运行也是自己在网上搜索相关的博客跟着做的,参考了很多博客,而且由于博文发布时间原因,并没有哪一篇博客可以从头到尾解决所有问题,都是边装边搜索新的解决办法。
所以在此记录一下整个安装过程以及遇到的问题和解决方案。解决过程中所参考的博客链接我都会放出来。
ps:我是用的虚拟机安装的,并且是在一个新系统上开始配置的
所以我的操作步骤是在一个全新的Ubuntu上做的,参考博客的同学注意一下(如果你已经在系统上安装过了一些包,则有些步骤可以省去)
我用的是虚拟机VMware运行的
Ubuntu版本是20.04 (系统是在官网下载的)
ORB-SLAM3源码: https://github.com/UZ-SLAMLab/ORB_SLAM3
ps:整个安装的大致流程我参考的是这篇博客
https://blog.csdn.net/weixin_42203839/article/details/107728106
但是中间遇到了很多问题
去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
先去github把代码clone下来
地址:github.com/stevenlovegrove/Pangolin
git clone https://github.com/stevenlovegrove/Pangolin.git
然后安装按照GitHub给的依赖挨个安装即可
然后Optional Dependencies for video input和Very Optional Dependencies里面的我没有装。
安装好依赖了之后编译安装Pangolin
cd Pangolin
mkdir build
cd build
cmake ..
cmake --build .
源码要求OpenCV 3.2及以上。
但是最好不要安装OpenCV4以上(4默认不会生成.pc文件,最后查看版本的时候查看不到,找不到包,网上有人说是编译选项没选好,我改了,还是不行,我也不知道是啥原因,最后我换了3.4版本的)
首先,到官网去下载源码:https://opencv.org/releases/
我下载的是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加速库。
如果电脑配置了并进入外网,便会卡住一会进行下载;否则,不会卡住,而是报错提示ippicv_2017u3_lnx_intel64_general_20170822.tgz的加速库下载失败。报错如下:
解决办法是:下载离线的ippicv库
去这里下载 https://github.com/opencv/opencv_3rdparty/tree/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的时候,请下载源码进行安装。
如下
#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主要用于回环检测,g2o(General Graph Optimization)主要用于图优化。
ORB-SLAM3的源码包自带DBoW2 and g2o,编译时会自动安装。不用管。
执行如下指令
sudo apt install libpython2.7-dev
由此链接进入boost官网:https://www.boost.org/
我下载的是1.75.0
下载之后解压:
tar -xzvf boost_1_75_0.tar.gz
解压之后进入解压出来的文件夹
然后执行这个脚本
sudo ./bootstrap.sh
执行完毕之后,你会发现又多了些文件
执行如下脚本
sudo ./b2 install
这可能需要些时间,等他安装完毕。
执行
sudo apt-get install libssl-dev
进入源码文件夹
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
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()); } } 参考博客:https://blog.csdn.net/Welf688/article/details/117434032
如果你报错:error: no match for ‘operator/’
也可以使用这个方法解决。
另外:如果你还遇到了其他错误,可以参考这篇博客
https://blog.csdn.net/lixujie666/article/details/90023059
例如:
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
最终编译成功。
数据集下载地址:(下载很慢,百度云有会员的同学可以用我给的百度云链接)
https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets#downloads
要下载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就运行起来啦
刚开始
中间
快结束的时候
运行结束后终端显示如下
大概记录了下我运行的过程以及遇到的问题
如有不足,欢迎指正~