赞
踩
目录
2.2 编译过程会报错 error: ‘decay_t’ is not a member of ‘std’
这篇博客的主要目的是实用性地记录如何成功地运行ORB-SLAM3。ORB-SLAM3有两个版本,分别是常规版本和ROS版本,因此本文也将重点介绍这两个部分。为了方便编译,源代码中提供了两个脚本,分别是build.sh和build_ros.sh,可以自动进行编译,非常方便实用。
检查G++版本,查看是否支持C++11,一般g++版本大于4.7即可
g++ -v
Pangolin以轻量级和易用性为主要优点,使用起来可以大大简化OpenGL视觉化编程,非常适合用于SLAM系统的可视化辅助。它在ORB-SLAM中发挥着绘制关键帧、地图点等重要作用。
先安装Pangolin的依赖,OpenGL,Glew
- sudo apt install pkg-config
- sudo apt install libegl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols
- sudo apt-get install doxygen
- sudo apt install libgl1-mesa-dev
- sudo apt install libglew-dev
安装Pangolin,注意:要想ORB-SLAM3编译通过请使用std=c++17
- git clone https://github.com/stevenlovegrove/Pangolin.git
- cd Pangolin
- mkdir build
- cd build
- # cmake .. #某些新版本的GCC编译器中
- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-std=c++17
- cmake --build .
- sudo make install
如果你想建立文档,你已经安装了Doxygen,你可以执行:
- cmake --build . --target pangolin_doc
- sudo make install
编译构建出现问题,如果卸载一些依赖后,编译仍有问题,最好重新下载源码安装,make claen 没用,删除build也没用。
ORB-SLAM3 中使用的Eigen3需要最少3.1.0,
pkg-config --modversion eigen3
安装
- sudo apt install libeigen3-dev
-
- # 若默认安装的是 /usr/include/eigen3 下,
- # 将Eigen文件夹拷贝一份到/usr/local/include 下
-
- sudo cp -r /usr/include/eigen3/Eigen /usr/local/include
按照下面的方法安装openCV 4.4.0(虽然下面写的是4.8.0 ,但是4.4.0也可以用)。
虽然orb-slam3项目中自带DBoW2 and g2o,但还是先源码编译了一遍,对后面的编译无影响。
- git clone https://github.com/dorian3d/DBoW2.git DBoW2
- cd DBoW2
- mkdir build
- cd build
- cmake ..
- make
- sudo make install
这一步对Cmake有较高的版本要求,需要先升级Cmake,详细参考下面这一篇文章:
- git clone https://github.com/RainerKuemmerle/g2o.git g2o
- cd g2o
- mkdir build
- cd build
- cmake ..
- make
- sudo make install
如果不升级cmake ,当有如下报错时,可以采用如下方法(该方法未测试,因为感觉很有意思,故记录之)
这是因为他要求的EIgen3必须要是3.1.0的版本,而你的电脑上没有对应版本(比他高也不行)。解决办法也非常简单,你可以修改g2o文件夹下的CMakeLists.txt
,如下,将其中的3.1.0
删掉保存,再重新cmake
即可。
最后make
生成,生成结果如下。
在上述环境没差错,即可编译orb-slam3项目。需要注意的是,ORB-SLAM3编译对于内存的使用相对较大,推荐16GB及以上。当然也可以在8GB内存上编译,不过编译的时候记得尽可能多腾出点空间,把用不到的程序关掉。否则编译内存不够的话,会直接卡死。
- git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
- cd ORB_SLAM3
- chmod +x build.sh
- ./build.sh
出现如下报错,导致编译中止:
- C++: fatal error: Killed signal terminated program cc1plus
- compilation terminated.
增加交换空间大小
- sudo fallocate -l 5G /var/swapfile
- sudo chmod 600 /var/swapfile
- sudo mkswap /var/swapfile
- sudo swapon /var/swapfile
- sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'
如果你已经创建了一个较小的交换文件,你可以尝试删除它,然后再创建一个较大的交换文件。可以使用以下命令删除交换文件:
- sudo swapoff /var/swapfile
- sudo rm /var/swapfile
修改CMakeLists.txt中的c++版本:
- CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX11)
- CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
- if(COMPILER_SUPPORTS_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- add_definitions(-DCOMPILEDWITHC11)
- message(STATUS "Using flag -std=c++11.")
- elseif(COMPILER_SUPPORTS_CXX0X)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
- add_definitions(-DCOMPILEDWITHC0X)
- message(STATUS "Using flag -std=c++0x.")
- else()
- message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
- endif()
-
-
- 修改成c++14版本
-
- CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX11)
- CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
- if(COMPILER_SUPPORTS_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
- add_definitions(-DCOMPILEDWITHC11)
- message(STATUS "Using flag -std=c++14.")
- elseif(COMPILER_SUPPORTS_CXX0X)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
- add_definitions(-DCOMPILEDWITHC0X)
- message(STATUS "Using flag -std=c++0x.")
- else()
- message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
- endif()
编译
通过后的提示:
至此,ORB-SLAM3的CMake编译就完成了。我们可以在Examples
文件夹下看到很多生成的可执行文件。
同时在源码根目录的lib
文件夹下看到一个.so
库文件。
使用数据集运行ORB-SLAM3请参考这一篇文章
Realsense D435i实时运行ORB-SLAM3请参考这一篇文章
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。