Win10+VS2015+Realsense D435相机+BundleFusion实现基于SLAM的实时三维重建

前言

本人前期实现了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。如下所示:
在这里插入图片描述
否则会出现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 ” 目录下。

(原创不易。若有用,请左下角点赞,谢谢!)

实时全局一致的3D重建,使用动态表面重新整合技术实时,高品质,大尺寸场景的3D扫描是混合现实和机器人应用的关键。然而,可扩展性带来了姿态估计漂移的挑战,在累积模型中引入了显着的错误。方法通常需要几个小时的离线处理来全局纠正模型错误。最近的在线方法证明了令人信服的结果,但遭受以下缺点:(1)需要几分钟的时间才能执行在线修正,影响了真正的实时使用; (2)脆弱的帧到帧(或帧到模型)姿态估计导致许多跟踪失败;或(3)仅支持非结构化的基于点的表示,这限制了扫描质量和适用性。我们通过一个新颖的,实时的端对端重建框架来系统地解决这些问题。其核心是强大的姿态估计策略,通过考虑具有高效分层方法的RGB-D输入的完整历史,针对全局摄像机姿态优化每帧。我们消除了对时间跟踪的严重依赖,并且不断地将其定位到全局优化的帧。我们提出了一个可并行化的优化框架,它采用基于稀疏特征和密集几何和光度匹配的对应关系。我们的方法估计全局最优化(即,束调整的姿势)实时,支持从总跟踪故障(即重新定位)恢复的鲁棒跟踪,并实时重新估计3D模型以确保全局一致性;都在一个框架内。我们优于最先进的在线系统,质量与离线方法相同,但速度和扫描速度前所未有。我们的框架导致尽可能简单的扫描,使用方便和高质量的结果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值