Алгоритм 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;
}
По сути, просто отключите матрицу М, вы можете попробовать.