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); //表示重点