Win10+VS2015+Realsense D435相机+BundleFusion实现基于SLAM的实时三维重建
前言
本人前期实现了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)" (??0RealSenseSensor@@QEAA@XZ),该符号在函数 "class RGBDSensor * __cdecl getRGBDSensor(void)" (?getRGBDSensor@@YAPEAVRGBDSensor@@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 ” 目录下。
(原创不易。若有用,请左下角点赞,谢谢!)