diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index eafc4f5ae3984fab6c526e0d8454e66aa0ae3032..9b36a2be37e9eeee47e162ed8e8f4830d0c77738 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -166,11 +166,14 @@ target_link_libraries(gtest_factor_pose_2D ${PROJECT_NAME}) wolf_add_gtest(gtest_factor_pose_3D gtest_factor_pose_3D.cpp) target_link_libraries(gtest_factor_pose_3D ${PROJECT_NAME}) - # MakePosDef function test wolf_add_gtest(gtest_make_posdef gtest_make_posdef.cpp) target_link_libraries(gtest_make_posdef ${PROJECT_NAME}) +# Map yaml save/load test +wolf_add_gtest(gtest_map_yaml gtest_map_yaml.cpp) +target_link_libraries(gtest_map_yaml ${PROJECT_NAME}) + # Parameter prior test wolf_add_gtest(gtest_param_prior gtest_param_prior.cpp) target_link_libraries(gtest_param_prior ${PROJECT_NAME}) diff --git a/test/gtest_map_yaml.cpp b/test/gtest_map_yaml.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6fd406f31e5a0439921238b99a1f046dfc6ae906 --- /dev/null +++ b/test/gtest_map_yaml.cpp @@ -0,0 +1,116 @@ +/** + * \file test_map_yaml.cpp + * + * Created on: Jul 27, 2016 + * \author: jsola + */ + +#include "core/utils/utils_gtest.h" +#include "core/common/wolf.h" +#include "core/problem/problem.h" +#include "core/map/map_base.h" +#include "core/landmark/landmark_base.h" +#include "core/state_block/state_block.h" +#include "core/yaml/yaml_conversion.h" + +#include <iostream> +using namespace wolf; + +void print(MapBase& _map) +{ + for (auto lmk_ptr : _map.getLandmarkList()) + { + std::cout << "Lmk ID: " << lmk_ptr->id() << std::endl; + std::cout << "\tLmk type: " << lmk_ptr->getType() << std::endl; + if (lmk_ptr->getType() == "LANDMARK BASE") + { + std::cout << "\tpos: " << lmk_ptr->getP()->getState().transpose() << (lmk_ptr->getP()->isFixed() ? " -- fixed" : " -- estimated\n"); + if (lmk_ptr->getO()) + std::cout << "\tori: " << lmk_ptr->getO()->getState().transpose() << (lmk_ptr->getO()->isFixed() ? " -- fixed" : " -- estimated\n"); + else + std::cout << "\tori: none\n"; + } + } +} + +TEST(MapYaml, save_2D) +{ + ProblemPtr problem = Problem::create("PO", 2); + + Eigen::Vector2s p1, p2, p3; + Eigen::Vector1s o2, o3; + p1 << 1, 2; + p2 << 3, 4; + p3 << 5, 6; + o2 << 2; + o3 << 3; + + StateBlockPtr p1_sb = std::make_shared<StateBlock>(p1); + StateBlockPtr o1_sb = nullptr; + StateBlockPtr p2_sb = std::make_shared<StateBlock>(p2); + StateBlockPtr o2_sb = std::make_shared<StateBlock>(o2); + StateBlockPtr p3_sb = std::make_shared<StateBlock>(p3, true); + StateBlockPtr o3_sb = std::make_shared<StateBlock>(o3, true); + + LandmarkBase::emplace<LandmarkBase>(problem->getMap(), p1_sb, o1_sb); + LandmarkBase::emplace<LandmarkBase>(problem->getMap(), p2_sb, o2_sb); + LandmarkBase::emplace<LandmarkBase>(problem->getMap(), p3_sb, o3_sb); + + std::string wolf_root = _WOLF_ROOT_DIR; + std::string map_path = wolf_root + "/test/yaml"; + std::string filename = wolf_config + "/map_2D_problem.yaml"; + std::cout << "Saving map to file: " << filename << std::endl; + problem->saveMap(filename, "2D map saved from Problem::saveMap()"); + + std::string filename = wolf_config + "/map_2D_map.yaml"; + std::cout << "Saving map to file: " << filename << std::endl; + problem->getMap()->save(filename, "2D map saved from Map::save()"); +} + +TEST(MapYaml, load_2D) +{ + ProblemPtr problem = Problem::create("PO", 2); + + std::string wolf_root = _WOLF_ROOT_DIR; + std::string map_path = wolf_root + "/test/yaml"; + std::string filename = wolf_config + "/map_2D_problem.yaml"; + std::cout << "Loading map to file: " << filename << std::endl; + problem->loadMap(filename); + + ASSERT_EQ(problem->getMap()->getLandmarkList().size(), 3); + + for (auto lmk : problem->getMap()->getLandmarkList()) + { + if (lmk->id() == 1) + { + ASSERT_TRUE(lmk->getP() != nullptr); + ASSERT_TRUE(lmk->getO() == nullptr); + ASSERT_MATRIX_APPROX(lmk->getP()->getState(), (Eigen::Vector2s()<<1,2).finished(), 1e-12); + ASSERT_FALSE(lmk->getP()->isFixed()); + } + else if (lmk->id() == 2) + { + ASSERT_TRUE(lmk->getP() != nullptr); + ASSERT_TRUE(lmk->getO() != nullptr); + ASSERT_MATRIX_APPROX(lmk->getP()->getState(), (Eigen::Vector2s()<<3,4).finished(), 1e-12); + ASSERT_MATRIX_APPROX(lmk->getO()->getState(), (Eigen::Vector1s()<<2).finished(), 1e-12); + ASSERT_FALSE(lmk->getP()->isFixed()); + ASSERT_FALSE(lmk->getO()->isFixed()); + } + else if (lmk->id() == 3) + { + ASSERT_TRUE(lmk->getP() != nullptr); + ASSERT_TRUE(lmk->getO() != nullptr); + ASSERT_MATRIX_APPROX(lmk->getP()->getState(), (Eigen::Vector2s()<<3,4).finished(), 1e-12); + ASSERT_MATRIX_APPROX(lmk->getO()->getState(), (Eigen::Vector1s()<<2).finished(), 1e-12); + ASSERT_TRUE(lmk->getP()->isFixed()); + ASSERT_TRUE(lmk->getO()->isFixed()); + } + } +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}