Алгоритм ElasticFusion Slam, работающий с графом поз в тесте TUM RGB-D

Я скачал настольный набор данных Фрайбурга из TUM RGB-D SLAM Dataset and Benchmark и преобразовал его в ".klg", который является пользовательским форматом алгоритма слэма. Я загрузил этот файл klg в ElasticFusion и запустил алгоритм SLAM. 3D-реконструкция выглядит достаточно хорошо, делая это.

Теперь я хочу построить трехмерную реконструкцию по уже построенной информации о траектории. Я извлек данные траектории из предыдущего прогона из .freibrug и преобразовал их в желаемый формат с помощью ElasticFusion. Я просто изменил метку времени с секунд на микросекунды, умножив ее на 1000000. И разделил переменные, используя "," вместо " " пробела. На этот раз я запускаю алгоритм с флагом "-p" и информацией о пути к файлу траектории. Ниже моя бегущая команда.

/path_to_EF/./ElasticFusion -l /path_to_data/rgbd_dataset_freiburg1_desk/test2.klg -p /path_to_data/rgbd_dataset_freiburg1_desk/modified_freiburg.txt

Я ожидаю получить то же облако точек. Но результат, который я получаю с данными, далек от ожидаемого.

Как видите, его точность и уровень реконструкции намного хуже, чем в предыдущем заезде. У меня нет проблем с траекторией. Приведенный ниже график показывает, что траектория, которую я извлек из предыдущего прогона, близка к основополагающим данным, предоставленным TUM RGB-D Benchmark.

Даже когда я запускаю его с достоверными данными, он не создает красивую трехмерную реконструкцию. В чем может быть причина и недостающие очки для такого результата?

Хорошие предложения и ответы будут оценены.

2 ответа

Решение

Я сделал 3 скана: слева направо, снизу вверх и сзади вперед. Я заметил, что файл траектории мысли кажется правильным, здание идет не так. Когда я перемещаю камеру по оси x, на EF она перемещается по оси z и аналогичная ситуация для остальных. Я пытался найти матрицу преобразования вручную. Я применил это преобразование к переводу и ротации. Это начало работать потом.

Я успешно запустил код с файлом траектории (ваша временная метка должна быть целочисленной и разделять все параметры пробелом) изменить ElasticFusion/GUI/src/Tools/GroundTruthOdometry.cpp

      void GroundTruthOdometry::loadTrajectory(const std::string & filename)
{
    std::ifstream file;
    std::string line;
    file.open(filename.c_str());
    while (!file.eof())
    {
        unsigned long long int utime;
        float x, y, z, qx, qy, qz, qw;
        std::getline(file, line);
        int n = sscanf(line.c_str(), "%llu %f %f %f %f %f %f %f", &utime, &x, &y, &z, &qx, &qy, &qz, &qw);

        if(file.eof())
            break;

        assert(n == 8);

        Eigen::Quaternionf q(qw, qx, qy, qz);
        Eigen::Vector3f t(x, y, z);

        Eigen::Isometry3f T;
        T.setIdentity();
        T.pretranslate(t).rotate(q);
        camera_trajectory[utime] = T;
    }
}

Eigen::Matrix4f GroundTruthOdometry::getTransformation(uint64_t timestamp)
{
    Eigen::Matrix4f pose = Eigen::Matrix4f::Identity();

    if(last_utime != 0)
    {
        std::map<uint64_t, Eigen::Isometry3f>::const_iterator it = camera_trajectory.find(last_utime);
        if (it == camera_trajectory.end())
        {
            last_utime = timestamp;
            return pose;
        }


        pose = camera_trajectory[timestamp].matrix();
    }
    else
    {
        std::map<uint64_t, Eigen::Isometry3f>::const_iterator it = camera_trajectory.find(timestamp);
        Eigen::Isometry3f ident = it->second;
        pose = Eigen::Matrix4f::Identity();
        camera_trajectory[last_utime] = ident;
    }

    last_utime = timestamp;

    return pose;
}

По сути, просто отключите матрицу М, вы можете попробовать.

Другие вопросы по тегам