目录
2.2 编译过程会报错 error: ‘decay_t’ is not a member of ‘std’
这篇博客的主要目的是实用性地记录如何成功地运行ORB-SLAM3。ORB-SLAM3有两个版本,分别是常规版本和ROS版本,因此本文也将重点介绍这两个部分。为了方便编译,源代码中提供了两个脚本,分别是build.sh和build_ros.sh,可以自动进行编译,非常方便实用。
ORB-SLAM3的CMake编译
1 配置环境
1.1 确定g++的版本
检查G++版本,查看是否支持C++11,一般g++版本大于4.7即可
g++ -v
1.2 安装Pangolin
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也没用。
1.3 Eigen3版本确认
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
1.4 安装openCV 4.4.0
按照下面的方法安装openCV 4.4.0(虽然下面写的是4.8.0 ,但是4.4.0也可以用)。
1.5 下载编译 DBoW2
虽然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
1.6 下载编译 g2o
这一步对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
生成,生成结果如下。
2 编译ORB-SLAM3
在上述环境没差错,即可编译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
2.1 编译过程遇到的错误1:交换空间的内存不足
出现如下报错,导致编译中止:
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
2.2 编译过程会报错 error: ‘decay_t’ is not a member of ‘std’
修改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
库文件。
3 运行ORB-SLAM3
使用数据集运行ORB-SLAM3请参考这一篇文章
Realsense D435i实时运行ORB-SLAM3请参考这一篇文章