bundle fusion代码精讲
引言
慕尼黑工大的bundlefusion开发至少超过数年时间,至今在RGBD类型的开源项目中依然是性能较佳的存在
原版在Windows环境中完成,且不易移植到其他框架中,东北大学的关老师做了Linux环境的移植,还在进行中
笔者在slam领域历时不久,且欣喜此份代码的高完成度和实时性,决定对各个模块逐一注释修改,希望将来有所启迪
1,FriedLiver/Source/FriedLiver.cpp
工程编译的main函数在此其中zParametersDefault.txt zParametersBundlingDefault.txt被定义为抽取的配置文件
根据代码可以./FriedLiver 或者./FriedLiver zParametersDefault.txt zParametersBundlingDefault.txt执行
这里调用的ParameterFile 格式的类专门读取储存配置文件 和增删改查
parameterFile.h中ml空间中用一个类ParameterFile 定义了对文件读取和使用方法
GlobalAppState.h中有个
private:
bool m_bIsInitialized;
ParameterFile m_ParameterFile; 此次可以储存定义过得的数据类型
//ID3D11Query* m_pQuery;
回到FriedLiver.cpp main函数中:
//Read the global app state
ParameterFile parameterFileGlobalApp(fileNameDescGlobalApp);// 初始化默认配置
std::ofstream out;
GlobalAppState::getInstance().readMembers(parameterFileGlobalApp); //读入配置
//Read the global camera tracking state
ParameterFile parameterFileGlobalBundling(fileNameDescGlobalBundling);// 初始化融合配置
GlobalBundlingState::getInstance().readMembers(parameterFileGlobalBundling); //读入配置
//Gpu方法的初始化
DualGPU& dualGPU = DualGPU::get(); //needs to be called to initialize devices 这用了引用的小方法,可以节省资源
dualGPU.setDevice(DualGPU::DEVICE_RECONSTRUCTION); //main gpu 这个GPU是固定的,很奇怪,为什么不适用cuda多GPU方法
//线程初始化
ConditionManager::init();
g_RGBDSensor = getRGBDSensor();
if (g_RGBDSensor == NULL) throw MLIB_EXCEPTION("No RGBD sensor specified");
g_RGBDSensor->createFirstConnected();// 这个需要你自己写createFirstConnected的实现
g_imageManager = new CUDAImageManager(GlobalAppState::get().s_integrationWidth, GlobalAppState::get().s_integrationHeight, GlobalBundlingState::get().s_widthSIFT, GlobalBundlingState::get().s_heightSIFT, g_RGBDSensor, false); 里面包含了 siftGPU的实现方法
#ifdef RUN_MULTITHREADED
std::thread bundlingThread(bundlingThreadFunc); //又指定了GPU 表示重点
//waiting until bundler is initialized
while (!g_bundler) sleep(0);
//std::cout << "g_bundler" << std::endl;
#else
g_bundler = new OnlineBundler(g_RGBDSensor, g_imageManager);
#endif
//start depthSensing render loop
startDepthSensing(g_bundler, getRGBDSensor(), g_imageManager); //表示重点