一、引言
Windows系统C++环境的配置一直比较繁琐,初入SLAM领域,很多方法都是用C++代码编写,于是自己动手配置了比较经典的ORB-SLAM3需要的环境。下面将一步步讲解配置方法,确保项目能够在你的电脑正常运行。二、三节中安装好的库一定要记住路径,因为在配置环境的时候要反复添加库的路径。
ORB-SLAM3forWindows项目链接:chanho-code/ORB-SLAM3forWindows: ORB-SLAM3 for Windows Platform
参考链接:ORB-SLAM3在windows11下的编译使用_orb-slam3 windows-优快云博客
所需工具:visual studio2022,ORB-SLAM3forWindows项目,cmake-gui。
二、准备工作
在clone项目之前,首先确保自己电脑已经安装cmake-gui、visual studio(配好C++环境)、opencv、boost这些必要组件。由于篇幅原因,visual studio的下载配置这里就不过多叙述,如果没有可以参考Visual Studio搭建C++环境 配置教程_vs 手动添加c++环境-优快云博客。下面是对cmake-gui、opencv、boost这些工具和库的安装教程(如果已安装且知道路径,可以跳过第二章节)。
1.cmake安装
官方下载:Download CMake
参考链接:Windows中使用CMake编译安装指南 - 知乎
我下载的是3.30.8版本,不同版本应该差别不大,如果不放心可以follow我的版本。
(1)下载好msi文件之后打开开始安装,在安装向导中,勾选“Add CMake to the system PATH for all users”选项,以便在命令行中直接使用cmake命令。同时,可以选择创建桌面快捷方式。
(2)在选择安装路径步骤,为方便查找文件目录,可以点击“Change”按钮,自定义安装路径(推荐D盘或E盘下)。
(3)点击Next开始安装,点击Finish完成安装。
(4)验证安装是否成功:在命令提示符中输入cmake --version,如果安装成功,会显示CMake的版本信息。
*添加环境变量
在安装过程中,如果选择了自动添加环境变量,则无需手动配置。如果未选择,可以手动将CMake的安装路径添加到系统的PATH环境变量中。具体步骤如下:
打开系统属性:右键点击“此电脑”,选择“属性”。
进入高级系统设置:点击“高级系统设置”。
配置环境变量:在”用户变量“和“系统变量”中找到PATH变量,点击“编辑”,新建添加CMake的安装路径,如我的是D:\cmake\bin。
2.opencv安装
官方下载:OpenCV下载
参考链接:Windows下 OpenCV 的下载安装教程(详细)_opencv下载-优快云博客
选择的版本不能太高,否则有些废弃或修改的语法在项目中不能正常使用,我选择的版本是3.4.1,最好也是跟我相同。
打开下载地址,在第6页可以看到我们需要的3.4.1版本,点击Windows即可跳转下载。
下载完成打开安装包,选择安装路径,如果自己电脑有其他版本的opencv,需要注意一下所在文件夹的命名方式,我这里使用opencv341作为安装目录进行安装,直接点击extract即可。
安装完成后进行系统环境变量配置,步骤与cmake环境变量配置相同。添加变量后如下图所示。在”用户变量“和“系统变量”中都要添加成功。
到这就完成了opencv的安装和配置,想要检查是否正确安装,可以点击本小节的参考链接,内有检验方法。
3.boost安装
官方下载:boost下载
参考链接:VS2022配置boost库-Windows为例_vs boost库-优快云博客
boost我安装的版本是1.83.0,同样稳妥起见,推荐安装相同版本。打开上面的下载地址点击下图中的more news,进入更多版本选择界面,找到1.83.0版本,点击标题下的“download”。
点击后进入下述页面,点第一个即可进入下载。
下载完后解压,进入文件夹双击bootstrap.bat文件,生成b2.exe。
点击b2.exe来自动生成静态的lib库文件。
这样boost库的安装与编译就完成了。
如果想要测试,同样可以点击本小节参考链接中的方法进行验证。
4.glew安装
glew库是ORB-SLAM3项目中pangolin(后面会提到)的依赖库,缺少glew库同样无法成功运行项目,因此我们作为准备工作先行安装,后面编译pangolin的时候会用到。
官方下载:GLEW: The OpenGL Extension Wrangler Library
这里glew下载的是已经编译好的最新版本2.1.0。进入下载链接,按照下两图顺次点击,下载glew2.1.0的压缩包。
然后解压,记好放在了哪个目录下面,后面会用到。
5.准备工作结束
到这所有准备工作就都结束了,正式项目配置之前,先来学习并熟练一下怎么在visual studio中配置基础的opencv、boost这些环境,因为后面编译的时候会频繁添加opencv和boost库。本小节只做演示用途,可以跳过此处进到三、项目配置。
(1)首先打开visual studio,新建一个c++项目,在右侧解决方案资源管理器中右击你的项目,单击属性。
(2)先是看到主页和属性页配置对应关系,一定要对应起来,即release对release,debug对debug,x64对x64,win32对win32。本项目用到的都是release和x64,所以每次编译时要确保当前项目的配置属性都是release和x64。
(3)我们点击VC++目录,就可以看到我每次主要配置的包含目录和库目录。包含目录就是include文件夹下的目录,库目录一般就是lib文件夹下的目录。
(4)除此之外,有时我们需要配置C/C++ ==> 常规 ==> 附加包含目录
(5)另外其他需要在配置页更改的内容,我们在项目配置环节会详细涉及,下面让我们正式进入项目配置。
三、ORB-SLAM3forWindows项目配置
本节中所有需要编译配置的第三方库都在下载好的项目的Thirdparty文件夹下。
1.下载github代码
github链接:chanho-code/ORB-SLAM3forWindows: ORB-SLAM3 for Windows Platform
终端命令:
git clone https://github.com/chanho-code/ORB-SLAM3forWindows.git
2.eigen库
这个库在Thirdparty文件夹下已经编译配置好,只需要在最后编译整个项目时添加到附加包含目录中,这里先不涉及。
3.DBoW2库
这个库同样在Thirdparty文件夹下,但需要手动编译。DBoW2库是用来回环检测的,需要opencv库的支持,下面来进行配置编译。
(1)首先进到Thirdparty文件夹下的DBoW2内,打开CMakeList,修改一下opencv的路径。
txt文档中图中标记出来的这几行代码,替换成以下代码,路径换成你自己的opencv的build路径,第二行的版本信息也是你自己的opencv版本。
set(OpenCV_DIR "D:/opencv341/build")
find_package(OpenCV 3.4.1 QUIET)
我的路径中修改完后是这样子,保存然后关闭文档即可。
(2)在当前DBoW2目录下新建build文件夹。
(3)打开cmake-gui,将第一行资源代码路径设置成DBoW2所在主目录,第二行设置为新建的build文件夹的路径。
点击configure,选择你的vs版本,一般直接默认即可,然后点击finish。
再次点击configure,出现“Configuring done”后,再点generate。出现“Generating done”后即可关闭cmake。
(4)打开build目录,进入刚刚生成的项目文件DBoW2.sln。
调整vs主页上的配置信息,选择Release。
右键右侧的DBoW2,上面配置改为Release和x64 ==> VC++ 目录 ==> 包含目录 加入你opencv的include目录(我的是有三个目录,同样341版本的直接copy我的即可)
接着库目录,加入opencv的库目录,我的路径是D:\opencv341\build\x64\vc15\lib
属性 ==> 常规 ==> 配置类型 ==> 静态库(.lib)
高级 ==> 目标文件扩展名 ==> .lib
C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT)
以上配置完成后,点击确定。右键右侧的ALL_BUILD ==> 生成。
这样第三方的DBoW2库就被编译成了lib文件,为项目提供依赖环境。
4.g2o库
这个库是用来进行SLAM图优化的,与上面步骤相似,这里会省略一些步骤的图示。
(1)g2o库不需要opencv环境,因此可省略上个库配置的第一步。
(2)在当前g2o目录下新建build文件夹。
(3)打开cmake-gui,将第一行资源代码路径设置成g2o所在主目录,第二行设置为新建的build文件夹的路径。
点击configure,选择你的vs版本,一般直接默认即可,然后点击finish。
再次点击configure,出现“Configuring done”后,再点generate。出现“Generating done”后即可关闭cmake。
(4)打开build目录,进入刚刚生成的项目文件g2o.sln。
调整vs主页上的配置信息,选择Release。
右键右侧的g2o,上面配置改为Release和x64 ==> 属性 ==> 常规 ==> 配置类型 ==> 静态库(.lib)
高级 ==> 目标文件扩展名 ==> .lib
C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT)
C/C++ ==> 预处理器 ==> 预处理器定义 ==> 加入WINDOWS
以上配置完成后,点击确定。右键右侧的ALL_BUILD ==> 生成。
这样第三方的g2o库就被编译成了lib文件,为项目提供依赖环境。
5.Pangolin库
(1)在当前Pangolin目录下新建build文件夹。
(2)打开cmake-gui,将第一行资源代码路径设置成Pangolin所在主目录,第二行设置为新建的build文件夹的路径。
点击configure,选择你的vs版本,一般直接默认即可,然后点击finish。
再次点击configure,会提示是否安装外部库,这里取消勾选BUILD_EXAMPLES, BUILD_ETERN_GLEW, BUILD_ETERN_LIBJPNG, BUILD_ETERN_LIBPNG这四项内容。
再次点击configure,会报错,再让你选择GLEW的包含目录和库文件,我们就在第一个选项里把一中安装的GLEW的include目录选上,在第二个选项里把GLEW的x64的静态lib文件glew32s.lib选上,注意不要选成glew32.lib。
再次点击configure,出现“Configuring done”后,再点generate。出现“Generating done”后即可关闭cmake。
(3)打开build目录,进入刚刚生成的项目文件Pangolin.sln。
调整vs主页上的配置信息,选择Release。
右键右侧的Pangolin,上面配置改为Release和x64 ==> 属性 ==> 常规 ==> 配置类型 ==> 静态库(.lib)
高级 ==> 目标文件扩展名 ==> .lib
C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT)
以上配置完成后,点击确定。右键右侧的ALL_BUILD ==> 生成。
6.ORB-SLAM3forWindows编译
(1)在ORB-SLAM3forWindows目录下新建build文件夹。打开CMakeList,修改一下opencv的路径。
txt文档中图中标记出来的这几行代码,替换成以下代码,路径换成你自己的opencv的build路径,第二行的版本信息也是你自己的opencv版本。
set(OpenCV_DIR "D:/opencv341/build")
find_package(OpenCV 3.4.1 QUIET)
我的路径中修改完后是这样子。
再看到txt文件里这一行,g2o库的默认路径与我们实际生成的不一致,所以要改一下,把lib改成build即可。
(2)打开cmake-gui,将第一行资源代码路径设置成ORB-SLAM3forWindows所在主目录,第二行设置为新建的build文件夹的路径。
点击configure,选择你的vs版本,一般直接默认即可,然后点击finish。
出现“Configuring done”后,再点generate。出现“Generating done”后即可关闭cmake。
(3)打开build目录,进入刚刚生成的项目文件ORB_SLAM3.sln。
调整vs主页上的配置信息,选择Release。
右键右侧的ORB_SLAM3,上面配置改为Release和x64 ==> 属性 ==> 常规 ==> 配置类型 ==> 静态库(.lib)
高级 ==> 目标文件扩展名 ==> .lib
C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT)
C/C++ ==> 预处理器 ==> 预处理器定义 ==> 添加以下两项
WINDOWS
COMPILEDWITHC11
(4)添加opencv和boost的包含目录、库目录
VC++目录 ==> 包含目录 ==> 加入opencv和boost的包含目录
VC++目录 ==> 库目录 ==> 加入opencv和boost的库目录
C/C++ ==> 常规 ==> 附加包含目录 ==> 加入第三方库DBoW2和g2o的路径
以上配置完成后,点击确定。右键右侧的ORB_SLAM3 ==> 生成
四、mono_euroc实例运行
以上我们的环境就算配置完成,下面用一个单目相机的实例(mono_euroc)来验证一下配置成果,看一下ORB-SALM3的运行效果。
1.编译mono_euroc
(1)打开刚才的项目文件ORB_SLAM3.sln
调整vs主页上的配置信息,选择Release。
右键右侧的mono_euroc,上面配置改为Release和x64 ==> C/C++ ==> 代码生成 ==> 运行库 ==> 多线程 (/MT)
C/C++ ==> 预处理器 ==> 预处理器定义 ==> 添加 COMPILEDWITHC11
链接器 ==> 高级 ==> 导入库 ==> 删掉里面的内容
(2)添加opencv和boost的包含目录、库目录
VC++目录 ==> 包含目录 ==> 加入opencv和boost的包含目录
VC++目录 ==> 库目录 ==> 加入opencv和boost的库目录
(3)链接器 ==> 输入 ==> 附加依赖项 ==> 添加下图所示boost的lib静态库文件和opencv的lib静态release库文件
opencv的lib里面有两个,其中带d的是用于debug的,我们需要不带d的,不要选错。
(4)C/C++ ==> 常规 ==> 附加包含目录 ==> 加入第三方库DBoW2和g2o的路径
(5)打开mono_euroc项目下的mono_euroc.cc文件,在代码中加入usleep的定义函数。
#ifdef _WIN32
#include <windows.h>
#define usleep(x) Sleep((x) / 1000) // 转换微秒 -> 毫秒
#else
#include <unistd.h> // Unix/Linux 需要这个头文件
#endif
加完后就是这样。
接着找到下面这一行代码,因为下载的数据集目录与项目读取函数内的目录格式之间有差异,所以为确保能正常读取数据要把“/mav0”删掉。
以上两处修改完成后点击保存即可。
(5)右键右侧的mono_euroc ==> 生成
2.下载数据集
下载链接:kmavvisualinertialdatasets – ASL Datasets
直接解压到ORB-SLAM3forWindows\Examples\Monocular目录下
3.glew.dll复制
这里还有一个问题我不知道为什么会这样报错,但把glew.dll文件复制一份到主文件夹下(ORB-SLAM3forWindows)就能解决。
找到你glew.dll的静态库,我的路径是D:\glew-2.1.0\bin\Release\x64
把glew.dll文件复制一份到主文件夹下(ORB-SLAM3forWindows)。
4.解压词汇表
进入ORB-SLAM3forWindows\Vocabulary目录,可以看到有个压缩包,解压它到当前文件夹。
5.终端运行mono_euroc.exe
在mono_euroc.cc文件中可以看到终端调用方法
Usage: ./mono_euroc path_to_vocabulary path_to_settings path_to_sequence_folder_1 path_to_times_file_1 (path_to_image_folder_2 path_to_times_file_2 ... path_to_image_folder_N path_to_times_file_N) (trajectory_file_name)
引用参考链接的分析:
./mono_euroc # exe文件
path_to_vocabulary # 字典文件
path_to_settings # 参数设置文件
path_to_sequence_folder_1 # 影像序列文件夹路径
path_to_times_file_1 # 对应的时间戳文件
trajectory_file_name
所以我们直接在你的ORB-SLAM3forWindows文件夹下使用cmd命令进入终端。
进入后输入下面的命令
Examples\Monocular\Release\mono_euroc.exe ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ./Examples/Monocular/MH_01_easy ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_monocular
等待数据读取后就开始展示整个SLAM过程了,配了几天看到成果还是很开心的,希望大家顺利配置。
五、写在最后
如果是第一次配置环境确实会感觉比较繁琐,特别是习惯了python的安装包的方法以后,c++操作实在太麻烦,但是按照本文的步骤来一定没问题的。如果在编译生成中报错,不要心急,重点检查一下包含目录、库目录,附加包含目录和附加依赖项,有些在cmakelist文件里面路径不存在或者不正确都有可能导致某个库或最后的项目生成失败,都添加好就行了。