/* * GridMapTest.cpp * * Created on: Aug 26, 2015 * Author: Péter Fankhauser * Institute: ETH Zurich, ANYbotics */ #include "grid_map_core/GridMap.hpp" // gtest #include namespace grid_map { TEST(GridMap, CopyConstructor) { GridMap map({"layer_a", "layer_b"}); map.setGeometry(Length(1.0, 2.0), 0.1, Position(0.1, 0.2)); map["layer_a"].setConstant(1.0); map["layer_b"].setConstant(2.0); GridMap mapCopy(map); EXPECT_EQ(map.getSize()[0], mapCopy.getSize()[0]); EXPECT_EQ(map.getSize()[1], mapCopy.getSize()[1]); EXPECT_EQ(map.getLength().x(), mapCopy.getLength().x()); EXPECT_EQ(map.getLength().y(), mapCopy.getLength().y()); EXPECT_EQ(map.getPosition().x(), mapCopy.getPosition().x()); EXPECT_EQ(map.getPosition().y(), mapCopy.getPosition().y()); EXPECT_EQ(map.getLayers().size(), mapCopy.getLayers().size()); EXPECT_EQ(map["layer_a"](0, 0), mapCopy["layer_a"](0, 0)); EXPECT_EQ(map["layer_b"](0, 0), mapCopy["layer_b"](0, 0)); } TEST(GridMap, CopyAssign) { GridMap map({"layer_a", "layer_b"}); map.setGeometry(Length(1.0, 2.0), 0.1, Position(0.1, 0.2)); map["layer_a"].setConstant(1.0); map["layer_b"].setConstant(2.0); GridMap mapCopy; mapCopy = map; EXPECT_EQ(map.getSize()[0], mapCopy.getSize()[0]); EXPECT_EQ(map.getSize()[1], mapCopy.getSize()[1]); EXPECT_EQ(map.getLength().x(), mapCopy.getLength().x()); EXPECT_EQ(map.getLength().y(), mapCopy.getLength().y()); EXPECT_EQ(map.getPosition().x(), mapCopy.getPosition().x()); EXPECT_EQ(map.getPosition().y(), mapCopy.getPosition().y()); EXPECT_EQ(map.getLayers().size(), mapCopy.getLayers().size()); EXPECT_EQ(map["layer_a"](0, 0), mapCopy["layer_a"](0, 0)); EXPECT_EQ(map["layer_b"](0, 0), mapCopy["layer_b"](0, 0)); } TEST(GridMap, Move) { GridMap map; map.setGeometry(Length(8.1, 5.1), 1.0, Position(0.0, 0.0)); // bufferSize(8, 5) map.add("layer", 0.0); map.setBasicLayers(map.getLayers()); std::vector regions; map.move(Position(-3.0, -2.0), regions); Index startIndex = map.getStartIndex(); EXPECT_EQ(3, startIndex(0)); EXPECT_EQ(2, startIndex(1)); Eigen::Matrix isValidExpected; isValidExpected << false, false, false, false, false, // clang-format off false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, false, false, true, true, true, false, false, true, true, true, false, false, true, true, true, false, false, true, true, true; // clang-format on for(int row{0}; row < 8; row++){ for(int col{0}; col < 5; col++){ EXPECT_EQ(map.isValid(Index(row, col)), isValidExpected(row, col)) << "Value of map.isValid at ["< stringVector; stringVector.emplace_back("nan"); map1.addDataFrom(map2, true, false, false, stringVector); Index index; map1.getIndex(Position(-2, -2), index); EXPECT_FALSE(map1.exists("two")); EXPECT_TRUE(map1.isInside(Position(4.0, 4.0))); EXPECT_DOUBLE_EQ(8.0, map1.getLength().x()); EXPECT_DOUBLE_EQ(8.0, map1.getLength().y()); EXPECT_DOUBLE_EQ(1.0, map1.getPosition().x()); EXPECT_DOUBLE_EQ(1.0, map1.getPosition().y()); EXPECT_FALSE(map1.isValid(index, "nan")); EXPECT_DOUBLE_EQ(1.0, map1.atPosition("one", Position(0.0, 0.0))); EXPECT_DOUBLE_EQ(1.0, map1.atPosition("nan", Position(3.0, 3.0))); } TEST(AddDataFrom, CopyData) { GridMap map1; GridMap map2; map1.setGeometry(Length(5.1, 5.1), 1.0, Position(0.0, 0.0)); // bufferSize(5, 5) map1.add("zero", 0.0); map1.add("one"); map1.setBasicLayers(map1.getLayers()); map2.setGeometry(Length(3.1, 3.1), 1.0, Position(2.0, 2.0)); map2.add("one", 1.0); map2.add("two", 2.0); map2.setBasicLayers(map1.getLayers()); map1.addDataFrom(map2, false, false, true); Index index; map1.getIndex(Position(-2, -2), index); EXPECT_TRUE(map1.exists("two")); EXPECT_FALSE(map1.isInside(Position(3.0, 3.0))); EXPECT_DOUBLE_EQ(5.0, map1.getLength().x()); EXPECT_DOUBLE_EQ(5.0, map1.getLength().y()); EXPECT_DOUBLE_EQ(0.0, map1.getPosition().x()); EXPECT_DOUBLE_EQ(0.0, map1.getPosition().y()); EXPECT_DOUBLE_EQ(1.0, map1.atPosition("one", Position(2, 2))); EXPECT_FALSE(map1.isValid(index, "one")); EXPECT_DOUBLE_EQ(0.0, map1.atPosition("zero", Position(0.0, 0.0))); } TEST(ValueAtPosition, NearestNeighbor) { GridMap map( { "types" }); map.setGeometry(Length(3.0, 3.0), 1.0, Position(0.0, 0.0)); map.at("types", Index(0,0)) = 0.5; map.at("types", Index(0,1)) = 3.8; map.at("types", Index(0,2)) = 2.0; map.at("types", Index(1,0)) = 2.1; map.at("types", Index(1,1)) = 1.0; map.at("types", Index(1,2)) = 2.0; map.at("types", Index(2,0)) = 1.0; map.at("types", Index(2,1)) = 2.0; map.at("types", Index(2,2)) = 2.0; double value = map.atPosition("types", Position(1.35,-0.4)); EXPECT_DOUBLE_EQ((float)3.8, value); value = map.atPosition("types", Position(-0.3,0.0)); EXPECT_DOUBLE_EQ(1.0, value); } TEST(ValueAtPosition, LinearInterpolated) { GridMap map( { "types" }); map.setGeometry(Length(3.0, 3.0), 1.0, Position(0.0, 0.0)); map.at("types", Index(0,0)) = 0.5; map.at("types", Index(0,1)) = 3.8; map.at("types", Index(0,2)) = 2.0; map.at("types", Index(1,0)) = 2.1; map.at("types", Index(1,1)) = 1.0; map.at("types", Index(1,2)) = 2.0; map.at("types", Index(2,0)) = 1.0; map.at("types", Index(2,1)) = 2.0; map.at("types", Index(2,2)) = 2.0; // Close to the border -> reverting to INTER_NEAREST. double value = map.atPosition("types", Position(-0.5,-1.2), InterpolationMethods::INTER_LINEAR); EXPECT_DOUBLE_EQ(2.0, value); // In between 1.0 and 2.0 field. value = map.atPosition("types", Position(-0.5,0.0), InterpolationMethods::INTER_LINEAR); EXPECT_DOUBLE_EQ(1.5, value); // Calculated "by Hand". value = map.atPosition("types", Position(0.69,0.38), InterpolationMethods::INTER_LINEAR); EXPECT_NEAR(2.1963200, value, 0.0000001); } } // namespace grid_map