天天看點

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

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 程式環境

  1. 編譯器:Visual Studio 2015;程式位數:64位(即x64)
  2. 作業系統:Windows 10;
  3. 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。如下所示:

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

否則會出現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,如右圖所示。

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

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" 目錄下,如下:

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

(2)添加realsense屬性表

BundleFusion工程打開“屬性管理器”, 右鍵工程,選擇“添加現有屬性表”,從 RealSense SDK 2.0 的安裝路徑下選中intel.realsense.props屬性表;

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

(3)RealSenseSensor類源碼的添加

将前面下載下傳的RealSenseSensor類的cpp和h檔案放到BundleFusion-master/FriedLiver/Source檔案夾下;

同時VS工程的解決方案右鍵-添加現有項,選中上面的cpp和h檔案。

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

否則後面編譯會出現錯誤:

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配置完成。如下圖所示:

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

(5)源碼錯誤修正

将FriedLiver.cpp73行的g_sensor = RealSenseSensor 改為 “g_sensor =new RealSenseSensor”,否則編譯會報錯:

未定義辨別符 "RealSenseSensor"......
           
Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

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模式,運作。結果如下:

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

最後ctrl+9,儲存ply模型。用meshlab顯示,如下:

Win10+VS2015+Realsense D435相機+BundleFusion實作基于SLAM的實時三維重建前言1 程式環境2 相關代碼、SDK的下載下傳3 配置4 編譯5 最終目錄6 其他

可發現,可以重建出電腦和桌子。但由于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 ” 目錄下。

(原創不易。若有用,請左下角點贊,謝謝!)

繼續閱讀