mapdetector.cpp 1.98 KB
Newer Older
wangdawei's avatar
wangdawei committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
#include "mapdetector.h"

namespace juefx{

MapDetector::Ptr mapDetectorInstance;
MapDetector::MapDetector()
{

}

void MapDetector::Reset()
{
    mapDetectorInstance.reset();
}

MapDetector::Ptr MapDetector::Instance()
{
    if(!mapDetectorInstance){
        mapDetectorInstance.reset(new MapDetector());
    }
    return mapDetectorInstance;
}

void MapDetector::HandleMapFolder(const string &mapFolder)
{
    vector<string> mapDirs = GetMapDirs(mapFolder);
    ConfigMaps(mapDirs);
}

vector<string> MapDetector::GetCloseMap(const Vector3d &blh, float distance)
{
    vector<string> ret;
    Isometry3d unuse;
    for(auto poseGuesser : poseGuesserVec_){
        float dis = poseGuesser->GetMapPoseByBlh(blh, unuse);
        if(dis < distance){
            ret.emplace_back(poseGuesser->GetMapName());
        }
    }
    return ret;
}

vector<string> MapDetector::GetMapDirs(const string &mapFolder)
{
    vector<string> ret;
    if(is_directory(mapFolder)){
        directory_iterator dir_iter(mapFolder);
        directory_iterator end_iter;
        for(; dir_iter != end_iter; dir_iter++) {
            string taskDir = dir_iter->path().string();
            if(!is_directory(taskDir)){
                continue;
            }
            string baseDir = taskDir + "/voxels/";
            if(!is_directory(baseDir)){
                continue;
            }
            ret.push_back(baseDir);
        }
    }
    return ret;
}

void MapDetector::ConfigMaps(const vector<string> &mapDirs)
{
    for(const string& mapDir : mapDirs){
        string trajPath = mapDir + "/traj.txt";
        string gpsTrajPath = mapDir + "/gps_traj.txt";
        if(!exists(trajPath)){
            continue;
        }
        if(!exists(gpsTrajPath)){
            continue;
        }
        PoseGuesser::Ptr poseGuesser(new PoseGuesser);
        poseGuesser->SetMapName(mapDir);
        if(poseGuesser->LoadSlamTraj(trajPath, gpsTrajPath)){
            poseGuesserVec_.emplace_back(poseGuesser);
        }
    }
}


} // end of namespace