01 寫在前面
近期在學習SLAM,想部署一下ORB-SLAM3,但是自己電腦是win11系統,因此就想著在win11上部署一下。但是網上看了一些教程,有一些博客,但是可能不適合我這種情況把,就很糾結。先說下結果,配置成功,過程極其痛苦。
02 參考工作
所參考的資料如下,感謝各位技術大佬的付出。
1、https://github.com/ds-ly/orbslam3-windows
2、ORB-SLAM3在Windows環境下的編譯配置 | 北遠山村
3、ORB-SLAM3在windows下的編譯使用 - 知乎
03 基礎環境
- CPU:i7-12700K;
- GPU:RTX A4000;
- 操作系統:Windows 11 64位專業版;
- Microsoft Visual Studio 2022; (此軟件默認大家已經裝好,在此對vs的安裝不贅述)
- CMake GUI;(不贅述too)
04 開始配置
04-1 下載源碼
本方案是基于https://github.com/ds-ly/orbslam3-windows
該方案中在Thirdparty中包含了一些博客中提到的DBoW2、eigen、g2o、Pangolin等幾個關鍵的包,所以大家也不用額外再去搜,直接在此方案下配置,配置的時候地址也比較集中,很方便。不必擔心忘記安裝在哪里了。但是在這之前有兩個軟件需要額外先安裝一下,opencv和boost。當然了你也可以Thirdparty下安裝。但是考慮到我自己的需要,我是在其他路徑下安裝的。都一樣,記住安裝位置就行了。
04-2 安裝opencv
因為的自己的opencv之前就安裝過,所以在此沒有同步記錄,推薦一些博客或者大家搜索自行安裝opencv。
Windows下 OpenCV 的下載安裝教程(詳細)_opencv下載-CSDN博客
04-3 安裝boost
boost安裝,首先從官網下載相應文件。(Boost C++ Libraries)
選擇下載,然后將下載的文件解壓到你想要安裝的路徑下:
進入boost_1_83_0文件夾,開始安裝
(1)雙擊bootstrap.bat文件,生成b2.exe;(也可以通過終端命令執行)
(2)接下來應該對b2.exe進行操作,操作之前,請先看這個:
????????
說明:
????????這里通過雙擊b2.exe進行編譯的,默認在stage下生成lib文件夾,里面只包含著靜態庫。
如果想要生成dll動態庫,可./b2 --help查看參數說明,然后需要輸入相應的編譯命令樣式如:./b2.exe toolset=msvc-14.1 link=static runtime-link=shared threading=multi variant=debug
????????其中toolset:指定編譯器,可選的如minGW、msvc等。
vs2017 : msvc-14.1,vs2015 : msvc-14.0, linux :gcclink:生成動態鏈接庫/靜態鏈接庫。生成動態鏈接庫需使用shared方式,生成靜態鏈接庫需使用static方式。一般boost庫可能都是以static方式編譯,因為最終發布程序帶著boost的dll感覺會比較累贅。
runtime-link:動態/靜態鏈接運行時庫。同樣有shared和static兩種方式,標記如何連接C++運行庫,是包含就用靜態,使用系統運行庫就用動態。
threading:單/多線程編譯。一般都寫多線程程序,當然要指定multi方式了;如果需要編寫單線程程序,那么還需要編譯單線程庫,可以使用single方式。
variant:編譯debug/release版本。一般都是程序的debug版本對應庫的debug版本,所以兩個都編譯。
- 以“lib”開頭的是“link=static”版本(靜態鏈接庫版本,沒有dll),而直接以“boost”開頭的是“link=shared”版本(動態鏈接庫版本,包含lib和dll)。
- 所有的庫都含有"boost"前綴。
- 緊隨其后的是boost庫名稱(比如date_time庫)。
- 然后是編譯器的版本,與庫名稱之間以"-"而不是下劃線"_"分隔(比如 -vc120)。
- 有“mt”的為“threading=multi”版本,沒有的則是“threading=single”版本。
- 有“s”的為“runtime-link=static”版本,沒有的則是“runtime-link=shared”版本。
- 有“gd”的為debug版本,沒有的則是release版本。
- 所有的庫都含有boost庫的版本號結尾(比如1_56,其中的"."以下劃線"_"代替)
?
之所以要說這個,是因為后面要用到boost里面一個很重要的文件libboost_serialization-vc143-mt-s-x64-1_83.lib。 我第一遍生成的時候,是生成“gd”的了,反正我是默認直接生成,他給我生成這個了,后期我死活找不到這個文件,編譯不成功。后來知道這個問題后重新生成了一些就好了,也就是說,我們要生成帶s的。
所以可以直接:
.\b2.exe link=static runtime-link=static
(其他參數沒動)
(3)等待編譯完成,時間不等。結束后會生成bin.v2和stage兩個文件夾,其中bin.v2下是生成的中間文件,大小在2.4G左右,可以直接刪除(看別的博客說的)。stage/lib下是要用的文件。
(4)配置boost環境
通過VS2022創建一個空項目,點擊“項目”,點擊“屬性”,然后:
1)找到“配置屬性/ VC++目錄”,點擊“包含目錄”。在里面添加boost的根目錄。(如我的是:D:\boost\boost_1_83_0)
2)找到“配置屬性/ VC++目錄”,點擊“庫目錄”。在里面添加boost的鏈接庫目錄。(如我的是:D:\boost\boost_1_83_0\stage\lib)
2)找到“配置屬性/鏈接器/常規”,點擊“附加庫目錄”,同上述庫目錄:D:\boost\boost_1_83_0\stage\lib
(要熟悉這種包含目錄啊庫目錄的操作,后面要頻繁用到)
操作完以上,Boost環境應該就配置好了。可以進行測試一下。
(5)測試
測試代碼如下:
#include <iostream>
#include <boost/version.hpp>
#include <boost/config.hpp>using namespace std;
int main()
{cout<<BOOST_VERSION<<endl;cout<<BOOST_LIB_VERSION<<endl;cout<<BOOST_PLATFORM<<endl;cout<<BOOST_COMPILER<<endl;cout<<BOOST_STDLIB<<endl;getchar();return 0;
}
有結果輸出,說明boost部署成功~,因為我這沒啥錯,大家如果有啥錯了先自行解決一下=-=。
04-4 第三方庫的配置
eigen
eigen:線性算術的C++模板庫(屬于g2o的依賴),剛開始我沒有用這套源碼的時候,一個個單獨安裝依靠包,是相當啰嗦麻煩,有了這個源碼的Thirdparty,就方便很多了。這個包放這就行。只要保證后面項目生成的時候有這個路徑即可。
DBoW2
用于SLAM回環檢測,這里需要opencv環境的支持。
(1)在Thirdparty/DBoW2
路徑下新建一個build
文件夾;
(2)打開Thirdparty/DBoW2/CMakeLists.txt,在里面
配置自己安裝opencv的路徑。
原版是這樣式兒的:
然后我給改了一下,把那幾行給刪除了。
就是根據自己的opencv路徑,set(OpenCV_DIR "D:\opencv\opencv3_4\opencv\build"
這個opencv路徑設置也可以通過后面的cmake來設置,但是我覺得這樣方便點。
(3)打開cmake。把cmake上的倆路徑改了(根據自己路徑來)。然后點擊“condigure”,出現done,再點擊“Generate”。出現done。則表示配置成功。
如果出現報錯,大概率就是opencv的路徑問題。
如果成功,會在build文件中看到,DBoW2.sln。
(4)用vs2022打開build/DBoW2.sln
(5)
- 將配置改成
release
- 右鍵項目==> 屬性 ==> 常規 ==> 配置類型 ==>?靜態庫(.lib);
- 屬性 ==> 高級 ==> 目標文件擴展名 ==>?.lib;
- C/C++ ==> 代碼生成 ==> 運行庫 ==>?多線程 (/MT)
- 右鍵項目 ==> 生成,即可看到生成好的lib文件
Thirdparty/DBoW2/lib/Release/DBoW2.lib
g2o
g2o用于圖優化的框架
然后熟悉的操作來了:
(1)在Thirdparty/g2o
路徑下新建一個build
文件夾
(2)打開cmake,把cmake上的倆路徑改了(根據自己路徑來)。然后點擊“condigure”,出現done,再點擊“Generate”。出現done。則表示配置成功。 (這個不用設置opencv路徑)
(3)用vs2022打開build/
g2o.sln
(4)
- 將配置改成
release
,同時 - 右鍵項目==> 屬性 ==> 常規 ==> 配置類型 ==>?靜態庫(.lib);
- 屬性 ==> 高級 ==> 目標文件擴展名 ==>?.lib;
- C/C++ ==> 代碼生成 ==> 運行庫 ==>?多線程 (/MT);
- C/C++ ==> 預處理器 ==>最上面加入
WINDOWS
- 右鍵項目 ==> 生成,即可看到生成好的lib文件
Thirdparty/g2o/build/Release/g2o.lib
Pangolin
用于3D視覺和3D導航的視覺圖和用戶之間的交互。這里其實和編譯ORB_SLAM3沒有關系,但是我們使用ORB_SLAM3庫的時候應用的例子上是需要這個庫的。
(1)在Thirdparty/g2o
路徑下新建一個build
文件夾
(2)打開cmake,把cmake上的倆路徑改了(根據自己路徑來)。然后點擊“condigure”,出現done,再點擊“Generate”。出現done。則表示配置成功。
(3)用vs2022打開build/Pangolin.sln
(4)
- 將配置改成
release
, - 右鍵項目==> 屬性 ==> 常規 ==> 配置類型 ==>?靜態庫(.lib);
- 屬性 ==> 高級 ==> 目標文件擴展名 ==>?.lib;
- C/C++ ==> 代碼生成 ==> 運行庫 ==>?多線程 (/MT)
- 右鍵項目 ==> 生成,即可看到生成好的lib文件ThirdParty/Pangolin/lib/Release/pangolin.lib
至此所有的準備工作完成,開始編譯ORB_SLAM3
05 編譯ORB_SLAM3
(1) 找到orbslam3-windows/CMakeLists.txt文件,配置opencv3.4.11的路徑。
同樣我時在txt文件中直接給,跟上文操作一樣:
(2)在orbslam3-windows
的路徑下新建一個build
文件夾
(3)打開cmake,把cmake上的倆路徑改了(根據自己路徑來)。然后點擊“condigure”,出現done.
(4)用vs2022打開build/ORB_SLAM3.sln
(5)
- 將配置改成
release;
- 同時右鍵項目==> 屬性 ==> 常規 ==> 配置類型 ==>?靜態庫(.lib);
- 屬性 ==> 高級 ==> 目標文件擴展名 ==>?.lib;
- C/C++ ==> 代碼生成 ==> 運行庫 ==>?多線程 (/MT);
- C/C++ ==> 預處理器 ,添加以下預編譯器定義
WINDOWS
COMPILEDWITHC11 - 右鍵項目 ==> 生成,即可看到生成好的lib文件
ORB_SLAM3/build/Release/ORB-SLAM3.lib
這步可能會有一些報錯,大多都是相應的boost包、第三方庫啥的路徑沒設置對,特別是opencv,因為我這個博客中沒有提到對opencv的設置,默認為大家都設置好了,所以在這步相應的包含目錄啊、庫目錄啊都要有相應依賴性的路徑。簡而言之,就是你所編譯的這個ORBSLAM3的項目,里面設置路徑的地方要把上面的依賴包都包含進去。
06?展示案例
我是測試的單目方案,大家根據自己的需要來。
在orbslam3-windows\Examples文件中包含單目、雙目、RGB項目等。
1、下載數據集
(1)下載數據集,我是用的The EuRoC MAV Dataset數據集,地址如下,我下載了MH_01_easy。
kmavvisualinertialdatasets – ASL Datasets
下載后我是放到Examples\Monocular文件夾中,解壓。
2、編譯案例Monocular
- 用vs2019打開
build/ORB_SLAM3.sln
- 將配置改成
release
, - 同時右鍵項目mono_euroc(如果想編譯其他案例就選擇自己需要的) ==> 屬性 ==> C/C++ ==> 代碼生成 ==> 運行庫 ==>?多線程 (/MT);
- C/C++ ==> 預處理器 ,添加以下預編譯器定義
COMPILEDWITHC11
; - 鏈接器 ==> 高級 ==> 導入庫,改為空;
- 鏈接器 ==> 輸入 ==> 去掉
..\Thirdparty\boost_1_67_0\lib64-msvc-14.1\libboost_serialization-vc141-mt-s-x64-1_67.lib,改為自己路徑下的lib,此處我的為:D:\boost\boost_1_83_0\stage\lib\
libboost_serialization-vc143-mt-s-x64-1_83.lib - 右鍵項目 ==> 生成,即可看到生成好的exe文件
orbslam3-windows\Examples\Monocular\Release\mono_euroc.exe
如果有exe文件生成,說明案例編譯成功了。
3、
運行案例Monocular
指令用法
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
path_to_vocabulary?# 字典文件
path_to_settings??# 參數設置文件
path_to_sequence_folder_1?# 影像序列文件夾路徑
path_to_times_file_1?# 對應的時間戳文件
trajectory_file_name
我在orbslam3-windows目錄下運行:
.\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
不管寫絕對路徑還是相對路徑,只要寫對了就行。
最后!運行成功!!!
哈哈部署成功還是很開心的~
祝大家順利~~~