SLAM之BundleFusion测试自制Rosbag数据集
前言
最近在做三维重建与轨迹定位相关的研究,需要以一些传统的重建算法做Baselines,我们选择了KinectFusion、ElasticFusion、BundleFusion、ORB-SLAM、VINS等典型的算法为基础,为了使发布的数据集更具有代表性,我们采用了RealSense录制了ROS格式的数据集,并基于此数据集和SLAM算法展开研究。下面是我基于BundleFusion跑通自制数据集的记录,由于本人接触三维相关技术不久,相关操作有些生疏请多见谅。
本机配置
显卡:NVIDIA GTX 1060
内存:16GB
环境:Ubuntu+Windows+Visual Studio2013
大致流程
- 已录制好的Rosbag格式的数据集
- 基于VS2013测试BundleFusion的Demo
- 将源深度图和源RGB封装成.sens格式
- 提取Rosbag中的深度图和RGB,制作成源格式
- 将制作数据集封装成.sens格式
- 查看BundleFusion对自制数据集的效果
效果展示
我们在实验室搭建了规则的轨道,RealSense在轨道上匀速移动录制了Rosbag数据集,下图是BundleFusion对我们自己数据集重建的结果。
具体流程
基于VS2013测试BundleFusion的Demo
https://graphics.stanford.edu/projects/bundlefusion/ (BF官网)
https://bericht.neopostmodern.com/posts/artist-guide-to-bundlefusion (如何配置BF)
其中在官网页面,我们要下载一个Dataset作为Demo,例如我下载了apt1作为我的样例来研究。
其中,解压apt1.zip,是原始深度图、RGB图像以及其他信息,这些数据会被封装成.sens文件作为BF的输入。
关于数据的具体内容,官网有给出详细说明:
Each sequence contains:
- Color frames (
frame-XXXXXX.color.jpg
): RGB, 24-bit, JPG - Depth frames (
frame-XXXXXX.depth.png
): depth (mm), 16-bit, PNG (invalid depth is set to 0) - Camera poses (
frame-XXXXXX.pose.txt
): camera-to-world (invalid transforms-INF
) - Camera calibration (
info.txt
): color and depth camera intrinsics and extrinsics.
We also have the above data in our custom .sens
format, please see the c++
reader for how to load the file.
这里官网给出了如何载入.sens的程序,是基于VS2013运行的SensReaderNoMLib,但是可惜我们需要实现封装原始数据到.sens的操作,这个程序缺乏各种依赖,不能满足我们的需求,因此我后续操作从BF源程序中修改,里面的依赖较为完善。
配置BundleFusion过程中需要注意的几点是:
- 依赖需要下载完整,并且保持原始的目录结构以避免大的修改
BundleFusion-master/
external/
mLib/ # this is the submodule you replaced
data/
src/
[...]
FriedLiver/
[...]
FriedLiver.sln
[...]
mLibExternal/ # you downloaded this from Dropbox
include
libsWindows
[...]
- 我尝试过VS2015,但遇到的“尝试引用已删除的函数”的报错我没办法解决,因此我就安装了官方的VS2013,最终一路无报错。
- 我使用的是CUDA 8.0,源程序使用的是CUDA 7.0,因此需要将FriedLiver.vcxproj中的7.0改成8.0程序才能加载。
- zParametersBundlingDefault.txt和zParametersDefault.txt拷贝到BundleFusion-master\FriedLiver\x64\Release文件夹里面,方便可执行程序直接运行。
- 修改zParametersDefault.txt中第二行s_sensorIdx = 8,即指定使用离线数据。
- 修改第58行,指定你要重建的.sens数据存放的位置,建议给出绝对路径
s_binaryDumpSensorFile =
"D:/Compressed/BundleFusion-master/FriedLiver/x64/data/sequence.sens";
- 编译通过后,执行程序,会出现命令行窗口显示正在处理第几帧,同时出现深度图窗口,程序结束之后会在上一级目录的data中生成ply点云文件,我在上一级目录中有创建data文件夹。即创建目录BundleFusion-master/FriedLiver/x64/data。