15 #include <mrpt/containers/yaml.h>
16 #include <mrpt/core/exceptions.h>
17 #include <mrpt/core/get_env.h>
18 #include <mrpt/system/filesystem.h>
20 const bool VERBOSE = mrpt::get_env<bool>(
"VERBOSE",
false);
21 const double SCALE = mrpt::get_env<double>(
"SCALE", 3.0);
25 const std::string datasetDir = mrpt::system::pathJoin({MOLA_TEST_DATASET_DIR,
"loop_closures"});
27 ASSERT_DIRECTORY_EXISTS_(datasetDir);
29 const std::string datasetListFile = mrpt::system::pathJoin({datasetDir,
"dataset.yaml"});
31 const auto dataset = mrpt::containers::yaml::FromFile(datasetListFile);
33 const auto badOnes = dataset[
"bad"];
34 const auto goodOnes = dataset[
"good"];
36 ASSERT_(badOnes.isSequence());
37 ASSERT_(goodOnes.isSequence());
40 mrpt::containers::yaml params;
41 params[
"voxel_layer_name"] =
"localmap_voxels";
42 params[
"dist2quality_scale"] =
SCALE;
50 mrpt::poses::CPose3D local_pose_wrt_global;
54 std::vector<Entry> LCs;
56 auto lambdaProcessYaml = [&](
const mrpt::containers::yaml::sequence_t& seq,
bool are_good_lcs)
58 for (
const auto& p : seq)
60 auto& lc = LCs.emplace_back();
61 lc.is_good_lc = are_good_lcs;
62 lc.global = p.asMap().at(
"global").as<
std::string>();
64 const auto v = p.asMap().at(
"final_pose").asSequence();
65 ASSERT_EQUAL_(v.size(), 6UL);
66 lc.local_pose_wrt_global = mrpt::poses::CPose3D::FromXYZYawPitchRoll(
67 v[0].as<double>(), v[1].as<double>(), v[2].as<double>(),
68 mrpt::DEG2RAD(v[3].as<double>()), mrpt::DEG2RAD(v[4].as<double>()),
69 mrpt::DEG2RAD(v[5].as<double>()));
74 lambdaProcessYaml(goodOnes.asSequenceRange(),
true);
77 lambdaProcessYaml(badOnes.asSequenceRange(),
false);
79 for (
const auto& e : LCs)
82 pcG.
load_from_file(mrpt::system::pathJoin({datasetDir, e.global}));
87 const auto res =
q.evaluate(pcG, pcL, e.local_pose_wrt_global, {});
88 const double quality =
res.quality;
92 std::cout <<
"- global: " << e.global <<
"\n"
93 <<
" local: " << e.local <<
"\n"
94 <<
" is_good: " << e.is_good_lc <<
"\n"
95 <<
" result_quality: " << quality <<
"\n";
98 if ((quality < 0.2 && e.is_good_lc) || (quality >= 0.5 && !e.is_good_lc))
100 std::cerr <<
"Failed for test case:\n"
101 <<
" local : " << e.local <<
"\n"
102 <<
" global : " << e.global <<
"\n"
103 <<
" is_good : " << e.is_good_lc <<
"\n"
104 <<
" quality : " << quality <<
"\n";
105 throw std::runtime_error(
"test failed (see cerr above)");
110 int main([[maybe_unused]]
int argc, [[maybe_unused]]
char** argv)
116 catch (std::exception& e)
118 std::cerr << mrpt::exception_to_str(e) <<
"\n";