ORB-SLAM3在Windows环境下的编译配置

前一段时间开始接触SLAM,了解到ORB-SLAM3应该是比较强大的一个库,但是似乎官方只给出了在Ubuntu环境下的安装配置,由于装显卡的计算机时Windows系统,所以就想在Windows下编译安装ORB-SLAM3,进行相关的学习和开发。

ORB-SLAM 3简介

ORB-SLAM3是西班牙萨拉戈萨大学于2020年7月中旬开源的作品,与ORB-SLAM、ORB-SLAM2一脉相承,是一个能够使用单目、立体、RGB-D相机,兼容针孔及鱼眼相机模型进行视觉、视觉+惯导和多地图的综合性SLAM方案。

首先回顾一下历史:ORB-SLAM首次在2015年被提出,它的改进版ORB-SLAM2在2017年被提出,同年提出了ORB-SLAM-VI,时隔3年,ORB-SLAM3横空出世。

ORB-SLAM3第一个同时具备

  1. 纯视觉(visual)数据处理;
  2. 视觉+惯性(visual-inertial)数据处理、
  3. 构建多地图(multi-map)功能,

支持单目、双目以及 RGB-D 相机,同时支持针孔相机、鱼眼相机模型的 SLAM 系统。

ORB3的主要创新:

  1. 实现了基于视觉与IMU的紧耦合SLAM系统,该系统完全依赖最大似然估计(即便在初始化阶段也是如此)。该方案无论在小型或者大型室内室外环境中都能够稳定的运行,并且比以前的方法精确了2-5倍。
  2. 多地图系统。依赖于一种新的位置识别和改进的回环检测,能够保证ORB3能够长时间在特征缺失环境下有效运行,当它跟丢时会重新启动一个新的地图,当检测到回环之后系统能够无缝拼接多个地图。
  3. 第一个能在算法阶段重用所有历史信息的系统,包含了共视帧之间的捆集调整(BA),即使共视帧在时间上相差甚远,甚至来自不同的地图。

实验表明,在所有的传感器配置中,ORB3与文献中最好的系统一样鲁棒,且更准确。双目惯性SLAM在EuRoC数据集上的平均精度为3.6厘米,在TUM-VI数据集(AR/VR场景的一个典型场景)中,快速手持式移动时的平均精度为9毫米

更多介绍参考:https://cloud.tencent.com/developer/article/1759134

准备工作

由于很久没有做C的开发了(应该说本来也不太熟),但是也知道C本身的配置就比较复杂,在Windows下尤其如此(越来越觉得Windows不是一个开发的理想平台:joy。不过事已至此,磨刀砍柴不耽工。

基础环境

包括Windows的软硬件基本情况:

  1. CPU:AMD Ryzen 9 5950X;
  2. GPU:NVIDIA Geforce RTX 3080Ti;
  3. 操作系统:Windows 11 64位专业版;
  4. Microsoft Visual Studio 2022;
  5. CMake GUI (CMake版本为3.22.1);

ORB-SLAM 3及依赖

包括ORB-SLAM 3及其相关的依赖库(2-7):

  1. ORB-SLAM3 v1.0;
  2. Boost v1.78.0,用于位C++标准库提供扩展,编译ORB-SLAM3需要;
  3. Pangolin v0.6,用于可视化和用户界面;
  4. OpenCV v4.5.4,用于处理图像和特征;
  5. Eigen v3.4.0,用于线性代数运算;
  6. DBoW2和g2o,包含在ORM-SLAM3 v1.0-releaseThirdparty文件夹内(是ORB-SLAM3作者修改后的版本),其中DBoW2用于位置识别,g2o用于非线性优化;
  7. Python,用于计算轨迹与真实值的对齐情况。

编译配置步骤

0. 说明

为了保证命令能顺利执行,Windows Terminal、CMake 和 Visual Studio 均以管理员身份运行。

1. 安装Boost库

Boost的安装应该是最为简单的,从Boost官网下载Windows平台下的压缩包,然后解压即可。假设我们将其解压到C盘,则目录为 C:\boost_1_78_0\

可以配置用户环境变量BOOST_ROOT

image-20220201210625671

**注意:**Boost也可以使用vcpkg安装,可以使用vcpkg list命令查看,如果已经存在,两个Boost库可能会在附加目录时冲突,所以建议只用一个。

Tips:vcpkg卸载Boost库的命令为

1
2
3
4
# 卸载32位
vcpkg remove boost-uninstall --recurse
# 卸载64位
vcpkg remove boost-uninstall:x64-windows --recurse

2. 安装OpenCV库

OpenCV的安装同样非常简单,从官网下载Windows平台下的exe文件,然后安装即可。假设我们将其安装在C盘根目录下,库目录为C:\opencv\.

3. 安装eigen库

eigen库的安装也比较简单,实际、直接使用源码,免安装。eigen只包含头文件,因此它不需要实现编译(只需要使用#include),指定好eigen的头文件路径,编译项目即可。

另外,eigen也提供了INSTALL脚本,如果想安装的话,可以采取以下步骤:

  1. 配置(configure),假设下载的源码解压到目录C:\eigen-3.4.0,在该目录下运行命令:

    1
    2
    mkdir ./build
    cmake . ./build
  2. 安装(install),假设安装的目录为CMAKE_INSTALL_PREFIX=C:/Program Files (x86)/Eigen3,进入C:\eigen-3.4.0\build目录,运行命令:

    1
    cmake --build . --target INSTALL
  3. 确认安装结果。

    Eige3目录结构

4. 安装Pangolin库

根据Pangolin的官方说明,作者推荐使用Visual Studio 2019的工具链,并且使用git bash或者Windows Terminal执行命令(看过我前面文章的读者可能知道,我就是在Windows Terminal里使用git bash:laughing)。具体的步骤如下:

  1. 安装glew,下载网址为:The OpenGL Extension Wrangler Library

    请直接下载已经编译好的版本;

  2. 打开目标文件夹,执行以下命令:

    1
    2
    git clone stevenlovegrove/Pangolin
    cd Pangolin
  3. 修正Pangolin v 0.6在Windows下编译的错误,需要进行修补,也就是注释掉以下语句:

    1
    #define MPARK_CPP14_CONSTEXPR

    image-20220201200030451

    注意:Pangolin v0.6是代码重构前的最后一个稳定版本,当然也可以用更早的版本比如v0.5

  4. 使用CMake(或者CMake GUI)进行配置,执行以下语句:

    1
    2
    3
    mkdir build
    cd build
    cmake ..

    image-20220201201120400

  5. 使用Visual Studio进行编译和安装,打开Pangolin.sln,将配置改成Release,同时右键pangolin项目==> 属性 ==> 常规 ==> 配置类型 ==> 静态库(.lib);属性 ==> 高级 ==> 目标文件扩展名 ==> .lib;C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT),然后生成即可。

    image-20220201202402416

    编译成功后,再右键INSALL项目,点击生成,就可以完成安装。

    安装成功后目录如下图所示:

    image-20220201202716731

    **注意:**Pangolin安装过程中需要下载依赖库,如果网络不好,建议为git设置代理。

5. 编译DBoW2库

DBoW2库在C:\ORB_SLAM3-1.0\Thirdparty\目录下。具体步骤如下:

  1. 使用CMake(或者CMake GUI)进行配置,执行以下语句:

    1
    2
    3
    4
    cd C:\ORB_SLAM3-1.0\Thirdparty\DBoW2
    mkdir build
    cd build
    cmake ..

    image-20220201203623927

  2. 用VS2022打开DBoW2.sln,然后进行如下操作(类似截图见g2o):

    • 将配置改成release,同时右键DBoW2项目==> 属性 ==> 常规 ==> 配置类型 ==> 静态库(.lib);

    • 属性 ==> 高级 ==> 目标文件扩展名 ==> .lib;

    • C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT);

    • C/C++ > 常规> 附加包含目录 ==>

      1
      2
      C:\opencv\build\include;
      C:\boost_1_78_0\;
    • 右键项目 ==> 生成。

    即可看到生成好的lib文件DBoW2/lib/Release/DBoW2.lib

    注意:从网上的资料来看,之前Windows编译DBoW2并不需要附加Boost库,但是我使用的ORB-SLAM3 v1.0中的DBoW2却需要,所以一定要注意版本

    image-20220202160635012

    image-20220202160512502

    image-20220201210107245

6. 编译g2o库

g2o库在C:\ORB_SLAM3-1.0\Thirdparty\目录下。具体步骤如下:

  1. 使用CMake(或者CMake GUI)进行配置,执行以下语句:

    1
    2
    3
    4
    cd C:\ORB_SLAM3-1.0\Thirdparty\g2o
    mkdir build
    cd build
    cmake ..

    image-20220201210834928

  2. 用VS2022打开g2o.sln,然后进行如下操作:

  • 将配置改成release,同时右键g2o项目==> 属性 ==> 常规 ==> 配置类型 ==> 静态库(.lib);

  • 属性 ==> 高级 ==> 目标文件扩展名 ==> .lib;

  • C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT);

  • C/C++ > 命令行> 其他选项 ==> 删除-W参数(解决/W需要参数的错误);

  • C/C++ > 预处理器>预处理器定义 ==> 添加WINDOWS(解决"vasprintf 找不到标识符"的错误);

  • C/C++ > 常规> 附加包含目录 ==>

    1
    2
    3
    4
    C:\ORB_SLAM3-1.0\Thirdparty\g2o\core;
    C:\ORB_SLAM3-1.0\Thirdparty\g2o\types;
    C:\ORB_SLAM3-1.0\Thirdparty\g2o\stuff;
    C:\include\eigen3;
  • 右键项目 ==> 生成。

image-20220201211303617

image-20220201211327853

image-20220201211410395

image-20220201212040980

image-20220201213101383

image-20220202164236415

即可看到生成好的lib文件g2o/build/Release/g2o.lib

image-20220201215113246

7. 编译ORB0-SLAM3

在完成以上依赖的准备之后,正式开始ORB-SLAM3的编译。

  1. 使用CMake(或者CMake GUI)进行配置,执行以下语句:

    1
    2
    3
    4
    cd C:\ORB_SLAM3-1.0
    mkdir build
    cd build
    cmake ..

    需要注意,Eigen3_DIRG2O_EIGEN#_INCLUDEPangolin_DIR以及g2o_LIBRARY_OUTPUT_DIRECTORY等几个变量的值是否正确:

    image-20220201215950306

  2. 替换源代码中的usleep()函数,Windows下没有usleep()函数,所以如果直接编译会发生错误,根据Sta Overflow上的解答——c++, usleep() is obsolete, workarounds for Windows/MingW? - Stack Overflow,我们使用以下代码进行替换:

    1
    2
    3
    4
    5
    6
    7
    ```

    ```cpp
    #include <chrono>
    #include <thread>
    ...
    std::this_thread::sleep_for(std::chrono::microseconds(usec));

    ORB_SLAM3-1.0的目录下查找了一下,usleep()出现的次数还是比较多的,需要一一加以替换(此外,在示例程序中也有usleep()函数,如果用到同样要替换)。

    image-20220202125850008

  3. 用VS2022打开ORB_SLAM3.sln,然后进行如下操作:

    • 将配置改成release,同时右键ORB_SLAM3项目==> 属性 ==> 常规 ==> 配置类型 ==> 静态库(.lib);

    • 属性 ==> 高级 ==> 目标文件扩展名 ==> .lib;

    • C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT);

    • C/C++ > 预处理器>预处理器定义 ==> 添加WINDOWS(解决"vasprintf 找不到标识符"的错误)和COMPILEDWITHC11

    • C/C++ > 常规> 附加包含目录 ==>

      1
      2
      3
      4
      5
      6
      7
      8
      9
      C:\ORB_SLAM3-1.0;C:\ORB_SLAM3-1.0\include;
      C:\ORB_SLAM3-1.0\include\CameraModels;
      C:\ORB_SLAM3-1.0\Thirdparty\Sophus;
      C:\include\eigen3;
      C:\ORB_SLAM3-1.0\Thirdparty\Pangolin\include;
      C:\ORB_SLAM3-1.0\Thirdparty\Pangolin\build\src\include;
      C:\ORB_SLAM3-1.0\Thirdparty\Pangolin\build\external\glew\include;
      C:\opencv\build\include;
      C:\boost_1_78_0;
    • 右键项目 ==> 生成。

    image-20220201220453276

    image-20220201220518177

    image-20220201220600197

    image-20220201220918389

    image-20220202164451967

即可看到生成好的lib文件C:\ORB_SLAM3-1.0\build\Release\ORB-SLAM3.lib

image-20220202170347923

8. 编译测试样例stereo_inertial_euroc

这个案例是双目 + 惯导的Euroc数据集的应用。

测试样例编译

  1. 替换源代码中的usleep()函数,只有1处,如下图所示(注意添加头文件):

    image-20220202172434740

  2. 用Visual Studio 2022打开ORB_SLAM3.sln,然后进行如下操作:

    • 右键项目stereo_inertial_tum_vi ==> 属性 ==> C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT);
    • C/C++ ==> 预处理器 ,添加以下预编译器定义COMPILEDWITHC11
    • 链接器 ==> 高级 ==> 导入库,改为空;
    • 链接器 ==> 输入 ==> 替换boost_serialization-*.lib为C:\boost_1_78_0\stage\lib\libboost_serialization-vc143-mt-s-x64-1_78.lib(由于此处的boost是自己安装的,所以应该将该部分改掉)。

    image-20220202172208521

    image-20220202172008275

  3. 右键项目 ==> 生成,即可看到生成好的exe文件:

image-20220202173225159

测试样例运行

测试样例我没有运行,以下说明从网上扒拉来的:

  • 下载数据MH_01_easy.zip,并解压到MH01;
  • 进入到生成好的exe文件夹下cd C:\ORB_SLAM3-1.0\Examples\Stereo-Inertial\Release,可以看到生成好的stereo_inertial_euroc.exe
  • 开启程序:.\stereo_inertial_euroc.exe ..\..\..\Vocabulary\ORBvoc.txt ..\EuRoC.yaml ..\MH01\ ..\EuRoC_TimeStamps\MH01.txt dataset-MH01_stereoi

可能遇到的错误

opencv 找不到opencv_*.dll

将…\opencv\build\x64\vc14\bin下的3个*.dll文件放到c:\Windows\system32下就好了。

更好的办法是将…\opencv\build\x64\vc14\bin加入用户或者系统的环境变量path里面,重启Visual studio 生效。

结论

综合了网上的诸多资料,基于目前比较新的库,整理了一下,希望能够有点用处。当然了,我觉得用Linux应该会好很多。

参考资料

  1. https://github.com/UZ-SLAMLab/ORB_SLAM3
  2. https://blog.csdn.net/tehcatalyst/article/details/117742825
  3. https://zhuanlan.zhihu.com/p/74958936?from_voters_page=true
  4. https://www.twblogs.net/c/5b7ee1c02b717767c6ac633a/
  5. https://github.com/UZ-SLAMLab/ORB_SLAM3/pull/53/files
  6. https://github.com/chanho-code/ORB-SLAM3forWindows
  7. https://its201.com/article/tehcatalyst/117742825#22_DBow2_22
  8. https://zhuanlan.zhihu.com/p/372299812
  9. https://blog.csdn.net/weixin_34217711/article/details/92078713
  10. https://blog.csdn.net/cxy_hust/article/details/117426385