SubmapIteratorTest.cpp
Go to the documentation of this file.
1 /*
2  * SubmapIteratorTest.cpp
3  *
4  * Created on: Sep 15, 2014
5  * Author: Péter Fankhauser
6  * Institute: ETH Zurich, ANYbotics
7  */
8 
11 
12 // Eigen
13 #include <Eigen/Core>
14 
15 // gtest
16 #include <gtest/gtest.h>
17 
18 // Vector
19 #include <vector>
20 
21 using std::vector;
22 using std::string;
23 
24 namespace grid_map{
25 
26 TEST(SubmapIterator, Simple) {
27  Eigen::Array2i submapTopLeftIndex(3, 1);
28  Eigen::Array2i submapBufferSize(3, 2);
29  Eigen::Array2i index;
30  Eigen::Array2i submapIndex;
31 
32  vector<string> types;
33  types.emplace_back("type");
34  GridMap map(types);
35  map.setGeometry(Eigen::Array2d(8.1, 5.1), 1.0, Eigen::Vector2d(0.0, 0.0)); // bufferSize(8, 5)
36 
37  SubmapIterator iterator(map, submapTopLeftIndex, submapBufferSize);
38 
39  EXPECT_FALSE(iterator.isPastEnd());
40  EXPECT_EQ(submapTopLeftIndex(0), (*iterator)(0));
41  EXPECT_EQ(submapTopLeftIndex(1), (*iterator)(1));
42  EXPECT_EQ(0, iterator.getSubmapIndex()(0));
43  EXPECT_EQ(0, iterator.getSubmapIndex()(1));
44 
45  ++iterator;
46  EXPECT_FALSE(iterator.isPastEnd());
47  EXPECT_EQ(3, (*iterator)(0));
48  EXPECT_EQ(2, (*iterator)(1));
49  EXPECT_EQ(0, iterator.getSubmapIndex()(0));
50  EXPECT_EQ(1, iterator.getSubmapIndex()(1));
51 
52  ++iterator;
53  EXPECT_FALSE(iterator.isPastEnd());
54  EXPECT_EQ(4, (*iterator)(0));
55  EXPECT_EQ(1, (*iterator)(1));
56  EXPECT_EQ(1, iterator.getSubmapIndex()(0));
57  EXPECT_EQ(0, iterator.getSubmapIndex()(1));
58 
59  ++iterator;
60  EXPECT_FALSE(iterator.isPastEnd());
61  EXPECT_EQ(4, (*iterator)(0));
62  EXPECT_EQ(2, (*iterator)(1));
63  EXPECT_EQ(1, iterator.getSubmapIndex()(0));
64  EXPECT_EQ(1, iterator.getSubmapIndex()(1));
65 
66  ++iterator;
67  EXPECT_FALSE(iterator.isPastEnd());
68  EXPECT_EQ(5, (*iterator)(0));
69  EXPECT_EQ(1, (*iterator)(1));
70  EXPECT_EQ(2, iterator.getSubmapIndex()(0));
71  EXPECT_EQ(0, iterator.getSubmapIndex()(1));
72 
73  ++iterator;
74  EXPECT_FALSE(iterator.isPastEnd());
75  EXPECT_EQ(5, (*iterator)(0));
76  EXPECT_EQ(2, (*iterator)(1));
77  EXPECT_EQ(2, iterator.getSubmapIndex()(0));
78  EXPECT_EQ(1, iterator.getSubmapIndex()(1));
79 
80  ++iterator;
81  EXPECT_TRUE(iterator.isPastEnd());
82  EXPECT_EQ(5, (*iterator)(0));
83  EXPECT_EQ(2, (*iterator)(1));
84  EXPECT_EQ(2, iterator.getSubmapIndex()(0));
85  EXPECT_EQ(1, iterator.getSubmapIndex()(1));
86 }
87 
88 TEST(SubmapIterator, CircularBuffer) {
89  Eigen::Array2i submapTopLeftIndex(6, 3);
90  Eigen::Array2i submapBufferSize(2, 4);
91  Eigen::Array2i index;
92  Eigen::Array2i submapIndex;
93 
94  vector<string> types;
95  types.emplace_back("type");
96  GridMap map(types);
97  map.setGeometry(Length(8.1, 5.1), 1.0, Position(0.0, 0.0)); // bufferSize(8, 5)
98  map.move(Position(-3.0, -2.0)); // bufferStartIndex(3, 2)
99 
100  SubmapIterator iterator(map, submapTopLeftIndex, submapBufferSize);
101 
102  EXPECT_FALSE(iterator.isPastEnd());
103  EXPECT_EQ(submapTopLeftIndex(0), (*iterator)(0));
104  EXPECT_EQ(submapTopLeftIndex(1), (*iterator)(1));
105  EXPECT_EQ(0, iterator.getSubmapIndex()(0));
106  EXPECT_EQ(0, iterator.getSubmapIndex()(1));
107 
108  ++iterator;
109  EXPECT_FALSE(iterator.isPastEnd());
110  EXPECT_EQ(6, (*iterator)(0));
111  EXPECT_EQ(4, (*iterator)(1));
112  EXPECT_EQ(0, iterator.getSubmapIndex()(0));
113  EXPECT_EQ(1, iterator.getSubmapIndex()(1));
114 
115  ++iterator;
116  EXPECT_FALSE(iterator.isPastEnd());
117  EXPECT_EQ(6, (*iterator)(0));
118  EXPECT_EQ(0, (*iterator)(1));
119  EXPECT_EQ(0, iterator.getSubmapIndex()(0));
120  EXPECT_EQ(2, iterator.getSubmapIndex()(1));
121 
122  ++iterator;
123  EXPECT_FALSE(iterator.isPastEnd());
124  EXPECT_EQ(6, (*iterator)(0));
125  EXPECT_EQ(1, (*iterator)(1));
126  EXPECT_EQ(0, iterator.getSubmapIndex()(0));
127  EXPECT_EQ(3, iterator.getSubmapIndex()(1));
128 
129  ++iterator;
130  EXPECT_FALSE(iterator.isPastEnd());
131  EXPECT_EQ(7, (*iterator)(0));
132  EXPECT_EQ(3, (*iterator)(1));
133  EXPECT_EQ(1, iterator.getSubmapIndex()(0));
134  EXPECT_EQ(0, iterator.getSubmapIndex()(1));
135 
136  ++iterator;
137  EXPECT_FALSE(iterator.isPastEnd());
138  EXPECT_EQ(7, (*iterator)(0));
139  EXPECT_EQ(4, (*iterator)(1));
140  EXPECT_EQ(1, iterator.getSubmapIndex()(0));
141  EXPECT_EQ(1, iterator.getSubmapIndex()(1));
142 
143  ++iterator;
144  EXPECT_FALSE(iterator.isPastEnd());
145  EXPECT_EQ(7, (*iterator)(0));
146  EXPECT_EQ(0, (*iterator)(1));
147  EXPECT_EQ(1, iterator.getSubmapIndex()(0));
148  EXPECT_EQ(2, iterator.getSubmapIndex()(1));
149 
150  ++iterator;
151  EXPECT_FALSE(iterator.isPastEnd());
152  EXPECT_EQ(7, (*iterator)(0));
153  EXPECT_EQ(1, (*iterator)(1));
154  EXPECT_EQ(1, iterator.getSubmapIndex()(0));
155  EXPECT_EQ(3, iterator.getSubmapIndex()(1));
156 
157  ++iterator;
158  EXPECT_TRUE(iterator.isPastEnd());
159  EXPECT_EQ(7, (*iterator)(0));
160  EXPECT_EQ(1, (*iterator)(1));
161  EXPECT_EQ(1, iterator.getSubmapIndex()(0));
162  EXPECT_EQ(3, iterator.getSubmapIndex()(1));
163 }
164 
193 TEST(SubmapIterator, InterleavedExecutionWithMove) {
194  grid_map::Index submapTopLeftIndex(3, 1);
195  grid_map::Size submapSize(2, 2);
196 
197  GridMap map({"layer"});
198 
199  map.setGeometry(Length(10, 10), 1.0, Position(0.0, 0.0)); // bufferSize(8, 5)
200 
201  auto& layer = map.get("layer");
202 
203  // Initialize the layer as sketched.
204  for (long colIndex = 0; colIndex < layer.cols(); colIndex++) {
205  layer.col(colIndex).setConstant(static_cast<DataType>(colIndex));
206  }
207 
208  std::cout << "(4,7) contains " << map.at("layer", {4, 7}) << std::endl;
209  // Instantiate the submap iterator as sketched.
210  SubmapIterator iterator(map, submapTopLeftIndex, submapSize);
211 
212  // check that the submap iterator returns {1,1,2,2}
213  auto checkCorrectValues = [](std::array<double, 4> given) {
214  int countOnes = 0;
215  int countTwos = 0;
216  for (auto& value : given) {
217  if (std::abs(value - 1.0) < 1e-6) {
218  countOnes++;
219  } else if (std::abs(value - 2.0) < 1e-6) {
220  countTwos++;
221  } else {
222  FAIL() << "Submap iterator returned unexpected value.";
223  }
224  }
225  EXPECT_EQ(countOnes, 2);
226  EXPECT_EQ(countTwos, 2);
227  };
228 
229  std::array<double, 4> returnedSequence{};
230  returnedSequence.fill(0);
231 
232  for (size_t submapIndex = 0; submapIndex < 4; submapIndex++) {
233  returnedSequence.at(submapIndex) = map.at("layer", *iterator);
234  ++iterator;
235  }
236 
237  checkCorrectValues(returnedSequence);
238 
239  // Reset the iterator and now check that it still returns the same sequence when we move the map interleaved with iterating.
240  iterator = SubmapIterator(map, submapTopLeftIndex, submapSize);
241  returnedSequence.fill(0);
242  for (size_t submapIndex = 0; submapIndex < 4; submapIndex++) {
243  if (submapIndex == 2) {
244  // Now move the map as depicted.
245  map.move(Position(2.0, 2.0));
246  }
247  returnedSequence.at(submapIndex) = map.at("layer", *iterator);
248  ++iterator;
249  }
250  checkCorrectValues(returnedSequence);
251 
252  // TODO (mwulf, mgaertner): This behavior is not yet implemented:
253  //
254  // // Reset the iterator and now check that the iterator throws? if the submap moved out of range.
255  // iterator = SubmapIterator(map, submapTopLeftIndex, submapSize);
256  //
257  // EXPECT_ANY_THROW(for (size_t submapIndex = 0; submapIndex < 4; submapIndex++) {
258  // if (submapIndex == 2) {
259  // // Now move the map so that the submap gets out of range.
260  // map.move(Position(20.0, 20.0));
261  // }
262  // returnedSequence.at(submapIndex) = map.at("layer", *iterator);
263  // ++iterator;
264  // });
265 }
266 
267 } // namespace grid_map
void setGeometry(const Length &length, const double resolution, const Position &position=Position::Zero())
Definition: GridMap.cpp:44
const Index & getSubmapIndex() const
bool move(const Position &position, std::vector< BufferRegion > &newRegions)
Definition: GridMap.cpp:442
Eigen::Vector2d Position
Definition: TypeDefs.hpp:18
Eigen::Array2i Index
Definition: TypeDefs.hpp:22
Eigen::Array2i Size
Definition: TypeDefs.hpp:23
Eigen::Array2d Length
Definition: TypeDefs.hpp:24
TEST(PositionFromIndex, Simple)


grid_map_core
Author(s): Péter Fankhauser
autogenerated on Wed Jul 5 2023 02:23:35