Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建
- 前言
- 1 程式環境
- 2 相關代碼、SDK的下載下傳
-
- 2.1 相關代碼下載下傳
- 2.2 軟體、SDK下載下傳
- 3 配置
-
- 3.1 工程檔案配置
- 3.2 源碼相關配置
- 3.3 模型參數修改
- 4 編譯
- 5 最終目錄
- 6 其他
前言
本人前期實作了ORB_slam3的實作過程,但是其是稀疏重建。
這兩天實作了基于經典SLAM架構—BundleFusion的稠密三維重建。主要參考部落客:https://blog.csdn.net/Claiborne696/article/details/107928892。
配置過程和部落客的基本一緻。主要差別是本人使用Realsense D435、使用vs2015、顯示卡為GTX1050 (2G);并遇到了一些其他問題,在這裡記錄一下。
1 程式環境
- 編譯器:Visual Studio 2015;程式位數:64位(即x64)
- 作業系統:Windows 10;
- GPU: GTX 1050,配CUDA 8.0驅動;
2 相關代碼、SDK的下載下傳
為了快速配置,讀者可以先把下面必須的庫下載下傳過來,主要包括如下兩方面(如果已經安裝過的,就不用下載下傳了)
2.1 相關代碼下載下傳
(1)bundlefusion源碼:https://github.com/niessner/BundleFusion;(若wifi通路不了github,用手機熱點試試)
(2)mLib庫位址:https://github.com/niessner/mLib;
(3)mLibExternal庫位址:https://www.dropbox.com/s/fve3uen5mzonidx/mLibExternal.zip?dl=0。這是外網位址,若通路不了,需要配置vpn;或者用參考部落客給的百度網盤連結:https://pan.baidu.com/s/1CJysQCHl4t7RPfvqliwfew ;提取碼:0x4t。
(4)RealSenseSensor類的2個庫檔案:https://github.com/hqWaynee/lidar_vision_slam;
2.2 軟體、SDK下載下傳
(1)Realsense 位址:https://github.com/IntelRealSense/librealsense/releases。本人下的win10-2.30.0版本;預設c盤安裝。
(2)CUDA8.0 位址:https://developer.nvidia.com/cuda-80-ga2-download-archive。選擇win10,可線上安裝(network)或離線安裝(local);預設安裝。
(3)DirectX SDK 位址:http://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe。
DirectX SDK的安裝會遇到DirectX SDK的錯誤“ErrorCode:s1023”,本人用https://www.dazhuanlan.com/2019/12/13/5df30b9d0f239/ 中的解決方法1。
(4)Boost-1.72.0 位址:https://dl.bintray.com/boostorg/release/1.72.0/source/ 中下載下傳boost_1_72_0.zip。
Boost庫使用說明:Boost-1.72.0不用全部解壓,隻提取其中serialization檔案夾的array_optimization.hpp和array_wrapper.hpp,放到源碼工程的mLibExternal/Include/boost/serialization下。
否則後面編譯會出現如下錯誤:
無法打開包括檔案: “boost/serialization/array_wrapper.hpp”: No such file or directory
無法打開包括檔案: “boost/serialization/array_optimization.hpp”: No such file or directory
3 配置
3.1 工程檔案配置
(1)配置FriedLiver.vcxproj檔案
以文本形式打開,将36行的“CUDA 8.0.props”和376行的“CUDA 8.0.targets”都改成8.0。如下所示:
否則會出現cuda錯誤:
未能從程式集 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\Nvda.Build.CudaTasks.v7.0.dll 加載任務“Nvda.Build.CudaTasks.SanitizePaths”
(2)配置FriedLiver.sln
以文本文檔形式打開,更改為左圖的資料。進而使得vs2013程式更新為vs2015,如右圖所示。
3.2 源碼相關配置
(1)添加dll和lib檔案
将 C:\Program Files (x86)\Intel RealSense SDK 2.0\bin\x64安裝路徑下的realsense2.dll 和C:\Program Files (x86)\Intel RealSense SDK 2.0\lib\x64下的realsense2.lib 拷貝至 “ BundleFusion-master/FriedLiver" 目錄下,如下:
(2)添加realsense屬性表
BundleFusion工程打開“屬性管理器”, 右鍵工程,選擇“添加現有屬性表”,從 RealSense SDK 2.0 的安裝路徑下選中intel.realsense.props屬性表;
(3)RealSenseSensor類源碼的添加
将前面下載下傳的RealSenseSensor類的cpp和h檔案放到BundleFusion-master/FriedLiver/Source檔案夾下;
同時VS工程的解決方案右鍵-添加現有項,選中上面的cpp和h檔案。
否則後面編譯會出現錯誤:
LNK2019無法解析的外部符号 "public: __cdecl RealSenseSensor::RealSenseSensor(void)" ([email protected]@[email protected]),該符号在函數 "class RGBDSensor * __cdecl getRGBDSensor(void)" ([email protected]@[email protected]@XZ) 中被引用。
(4)兩個h檔案修改
GlobalAppState.h 檔案中的 “REAL_SENSE”一行取消注釋,同時屏蔽源碼的“STRUCTURE_SENSOR”一行。
FriedLiver.h 檔案中28和30行添加2條支援庫 realsense2.lib,其他的lib去掉。同時在39行添加#include “RealSenseSensor.h”,表示realsense配置完成。如下圖所示:
(5)源碼錯誤修正
将FriedLiver.cpp73行的g_sensor = RealSenseSensor 改為 “g_sensor =new RealSenseSensor”,否則編譯會報錯:
未定義辨別符 "RealSenseSensor"......
3.3 模型參數修改
(1)修改zParametersBundlingDefault.txt
為避免出現視窗崩潰或沒有響應直接跳出,打開 zParametersBundlingDefault.txt 配置檔案,設定 30行的s_maxNumImages = 1200為s_maxNumImages = 400。否則記憶體容易溢出。
(2)修改zParametersDefault.txt
将s_sensorIdx = 7改為6,進而選中 REAL_SENSE;将49行s_hashNumSDFBlocks = 200000改為100000。否則運作會出現SDFBlocks溢出錯誤。
4 編譯
Debug模式下編譯通過,Debug模式不能運作,會出現錯誤:
由于找不到Freelmage.dll,無法繼續執行代碼。重新安裝程式可能會解決此問題。
需要切換到Release模式,運作。結果如下:
最後ctrl+9,儲存ply模型。用meshlab顯示,如下:
可發現,可以重建出電腦和桌子。但由于640*480分辨率下Realsense相機的深度精度不高,導出效果較差。是以,論重建精度,還是sfm方法更香一點。
5 最終目錄
如果編譯或執行有問題,可以按照上面步驟或參考連結再檢查一遍。或者和下面的程式目錄對照一下。本人目錄格式為:
Bundlefusion(自己建立的總目錄)
BundleFusion-master/ //github源碼下載下傳過來
external/
mLib/ //下載下傳mLib後放在external下
data/
include/
src/
[...]
FriedLiver/
[...]
Source/
RealSenseSensor.cpp //從下載下傳的RealSenseSensor拷過來
RealSenseSensor.h //從下載下傳的RealSenseSensor拷過來
FriedLiver.sln
[...]
realsense2.dll //從RealSense SDK 2.0本地路徑拷過來
realsense2.lib //從RealSense SDK 2.0本地路徑拷過來
zParametersBundlingDefault.txt //修改參數
zParametersDefault.txt //修改參數
img
mLibExternal //下載下傳過來
include/
boost/
serialization/
[...]
array_optimization.hpp //從boost庫拷過來
array_wrapper.hpp //從boost庫拷過來
libsWindows/
[...]
6 其他
若想通過輕按兩下FriedLiver.exe運作,則需要将 ”BundleFusion-master/FriedLiver" 目錄下的 zParametersBundlingDefault.txt 和 zParametersDefault.txt 拷貝至 “ BundleFusion-master/FriedLiver/x64/Release ” 目錄下。
(原創不易。若有用,請左下角點贊,謝謝!)