1

我从TUM RGB-D SLAM Dataset and Benchmark下载了 Freiburg 桌面数据集,并将其转换为“.klg”,这是 slam 算法的自定义格式。我将此 klg 文件加载到 ElasticFusion 并运行 SLAM 算法。执行此操作时,3d 重建输出似乎足够好。

在此处输入图像描述

现在我想通过已经建立的轨迹信息建立 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 提供的地面实况数据。

在此处输入图像描述

即使我使用groundtruth 数据运行它,它也不能构建好的3d 重建。这种结果的原因和缺失点是什么?

好的建议和答案将不胜感激。

4

2 回答 2

0

我成功运行了带有轨迹文件的代码(您的时间戳应该是整数并用空格分隔所有参数)修改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;
}

基本上只是禁用M矩阵,你可以试试

于 2021-07-17T21:40:14.300 回答
-1

我进行了 3 次扫描:从左到右、从下到上和从后到前。我观察到思想轨迹文件似乎是正确的,建筑物出了问题。当我在 x 轴上移动相机时,在 EF 上它会在 z 轴上移动,其他类似的情况。我试图手动找到转换矩阵。我将此转换应用于平移和旋转。之后它开始工作。

于 2017-08-03T14:04:37.253 回答