test/test_map.cpp
Go to the documentation of this file.
1 #include <gtest/gtest.h>
2 #include "sensor_map.hpp"
3 #include "init_vars.hpp"
4 #include <ros/ros.h>
6 
7 #define GTEST_COUT std::cerr << "[ INFO ] "
8 
9 TEST(SensorMap, active)
10 {
11  EXPECT_EQ(0, 0);
12 }
13 
14 TEST(SensorMap, friendClass)
15 {
16  // Basic test to make sure friend class functionality is working
17 
18  MapTestEnv env;
19 
20  // Send and compare configs
21  ros::NodeHandle nh("~");
24  EXPECT_TRUE(testMap.CheckConfigEqual(map, env.defaultConfig_));
25 }
26 
27 // Test bad filter chain namespace
28 // @TODO: Apparently filter chain doesnt return an error occured
29 // on nonexistent. Not sure how else to see this will happen
30 // {
31 // MapTestEnv env;
32 // env.defaultConfig_.filterNs = "nonexistent";
33 
34 // ros::NodeHandle nh("~");
35 // mitre_fast_layered_map::SensorMap map(&nh, env.defaultConfig_);
36 // EXPECT_EQ(-1, map.init());
37 // }
38 
39 // Test map has appropriate frame and geometry
40 TEST(SensorMap, correctMapGeometry)
41 {
42  MapTestEnv env;
44 
45  ros::NodeHandle nh("~");
47  map.init();
48 
49  EXPECT_TRUE(testMap.CheckGeometry(map, env.defaultConfig_.len, env.defaultConfig_.resolution));
50  EXPECT_TRUE(testMap.CheckFrame(map, env.defaultConfig_.mapFrameId));
51 }
52 
53 TEST(SensorMap, irregularGeometry)
54 {
55  MapTestEnv env;
57 
58  // Length is 50 but resolution is 0.3 which doesn't divide evenly
59  // we expect length to be set to 50.1
60  env.defaultConfig_.resolution = 0.3;
61 
62  ros::NodeHandle nh("~");
64  map.init();
65 
66  EXPECT_TRUE(testMap.CheckGeometry(map, grid_map::Length(50.1, 50.1), env.defaultConfig_.resolution));
67  EXPECT_TRUE(testMap.CheckFrame(map, env.defaultConfig_.mapFrameId));
68 }
69 
70 // Test run before using init
71 TEST(SensorMap, runBeforeinit)
72 {
73  MapTestEnv env;
74 
75  ros::NodeHandle nh("~");
77  EXPECT_EQ(-1, map.once());
78 }
79 
80 // Test run after init
81 TEST(SensorMap, runAfterinit)
82 {
83  MapTestEnv env;
84 
85  ros::NodeHandle nh("~");
87  EXPECT_EQ(0, map.init());
88  EXPECT_EQ(0, map.once());
89 }
90 
91 // Test odomCb
92 TEST(SensorMap, odomCb)
93 {
94  MapTestEnv env;
96  ros::NodeHandle nh("~");
98 
99  EXPECT_EQ(0, map.init());
100  // Create odom msg
101  nav_msgs::Odometry odomMsg;
102  odomMsg.pose.pose.position.x = 100;
103  odomMsg.pose.pose.position.y = 100;
104  nav_msgs::Odometry::ConstPtr odomPtr = boost::make_shared<nav_msgs::Odometry>(odomMsg);
105  EXPECT_NO_FATAL_FAILURE(map.odomCb(odomPtr));
106  // // Check it moved to the correct area
107  EXPECT_TRUE(testMap.CheckPosition(map, odomMsg.pose.pose.position.x,
108  odomMsg.pose.pose.position.y));
109 
110 }
111 
112 // Test updating map very quickly (faster than the update time)
113 // TODO: Unable to be implemented until update rate is a configuration variable
114 // TEST(SensorMap, fastOdomCb)
115 // {
116 // MapTestEnv env;
117 // mitre_fast_layered_map::TestMap testMap;
118 // ros::NodeHandle nh("~");
119 // mitre_fast_layered_map::SensorMap map(&nh, env.defaultConfig_);
120 
121 // EXPECT_EQ(0, map.init());
122 // // Create odom msg
123 // nav_msgs::Odometry odomMsg;
124 // odomMsg.pose.pose.position.x = 10;
125 // odomMsg.pose.pose.position.y = 10;
126 // nav_msgs::Odometry::ConstPtr odomPtr = boost::make_shared<nav_msgs::Odometry>(odomMsg);
127 // EXPECT_NO_FATAL_FAILURE(map.odomCb(odomPtr));
128 // // // Check it moved to the correct area
129 // EXPECT_TRUE(testMap.CheckPosition(map, odomMsg.pose.pose.position.x,
130 // odomMsg.pose.pose.position.y));
131 
132 // // WARNING: Possible race condition. We expect this to be faster
133 // // than 1/10th sec, but if not the test will fail
134 // odomMsg.pose.pose.position.x = 20;
135 // odomMsg.pose.pose.position.y = 20;
136 // odomPtr = boost::make_shared<nav_msgs::Odometry>(odomMsg);
137 // EXPECT_NO_FATAL_FAILURE(map.odomCb(odomPtr));
138 // // // Check it moved to the correct area
139 // EXPECT_FALSE(testMap.CheckPosition(map, odomMsg.pose.pose.position.x,
140 // odomMsg.pose.pose.position.y));
141 // }
142 
143 // Test moving map out of bounds of current map
144 TEST(SensorMap, odomCbOutOfMapBounds)
145 {
146  MapTestEnv env;
148  ros::NodeHandle nh("~");
150 
151  EXPECT_EQ(0, map.init());
152  // Create odom msg
153  nav_msgs::Odometry odomMsg;
154  odomMsg.pose.pose.position.x = 100;
155  odomMsg.pose.pose.position.y = 100;
156  nav_msgs::Odometry::ConstPtr odomPtr = boost::make_shared<nav_msgs::Odometry>(odomMsg);
157  EXPECT_NO_FATAL_FAILURE(map.odomCb(odomPtr));
158  // // Check it moved to the correct area
159  EXPECT_TRUE(testMap.CheckPosition(map, odomMsg.pose.pose.position.x,
160  odomMsg.pose.pose.position.y));
161 }
162 
163 // Test move map doesn't have any nans
164 TEST(SensorMap, noNans)
165 {
166  MapTestEnv env;
168  ros::NodeHandle nh("~");
170 
171  EXPECT_EQ(0, map.init());
172 
173  EXPECT_EQ(0, map.moveMap(10, 10));
174  // Check it moved to the correct area
175  EXPECT_TRUE(testMap.CheckPosition(map, 10, 10));
176  // We don't want to find any nans in the map after moving
177  EXPECT_TRUE(testMap.CheckNans(map));
178 }
179 
180 // Test move map returns 1 on outside of current map bounds
181 TEST(SensorMap, moveMapOutOfMapBounds)
182 {
183  MapTestEnv env;
185  ros::NodeHandle nh("~");
187 
188  EXPECT_EQ(0, map.init());
189 
190  EXPECT_EQ(1, map.moveMap(100, 100));
191  // // Check it moved to the correct area
192  EXPECT_TRUE(testMap.CheckPosition(map, 100, 100));
193  // We don't want to find any nans in the map after moving
194  EXPECT_TRUE(testMap.CheckNans(map));
195 }
196 
197 // For now we assume the point cloud callbacks work since all they do is transform
198 // the point clouds into the correct frame. Below we test the update functions
199 // along with the corresponding filter chains.
200 
201 // FILTERS EACH HAVE THEIR OWN SEPERATE TEST FILES
202 // SEE THOSE FOR FULL FUNCTIONALITY TESTS
203 
204 // Send ground points and see that the cells are set to 0
205 TEST(SensorMap, groundPoints)
206 {
207  MapTestEnv env;
209  ros::NodeHandle nh("~");
211  EXPECT_EQ(0, map.init());
212  EXPECT_TRUE(testMap.CheckPosition(map, 0, 0));
213 
214  // Create point cloud for input
216  cloud.width = 6;
217  cloud.height = 1;
218  // We have a 5mx5m map, so put points within that map
219  // Uses FLU so x is forward and back, y is sideways
220  cloud.points.push_back(pcl::PointXYZ(2, -2, 0)); // (0, 4)
221  cloud.points.push_back(pcl::PointXYZ(1, -1, 0)); // (1, 3)
222  cloud.points.push_back(pcl::PointXYZ(0, 0, 0)); // (2, 2)
223  cloud.points.push_back(pcl::PointXYZ(0, 0, 0)); // (2, 2)
224  cloud.points.push_back(pcl::PointXYZ(-2, 1, 0)); // (4,1)
225  cloud.points.push_back(pcl::PointXYZ(1, 1, 0)); // (1, 1)
226  cloud.points.push_back(pcl::PointXYZ(-1, -2, 0)); // (3, 4)
227 
228  Eigen::MatrixXi answerMat(5,5);
229  answerMat <<
230  0, 0, 0, 0, 1,
231  0, 1, 0, 1, 0,
232  0, 0, 2, 0, 0,
233  0, 0, 0, 0, 1,
234  0, 1, 0, 0, 0;
235 
236  // Update ground points
237  map.updateGroundPts(cloud);
238 
239  // Check map against our answer mat
240  EXPECT_TRUE(testMap.TestMapCells(map, "ground", answerMat));
241 }
242 
243 // Send points with elevation make sure cells have lowest elevation
244 TEST(SensorMap, elevationMin)
245 {
246  MapTestEnv env;
248  ros::NodeHandle nh("~");
250  EXPECT_EQ(0, map.init());
251  EXPECT_TRUE(testMap.CheckPosition(map, 0, 0));
252 
253  // Create point cloud for input
255  cloud.width = 7;
256  cloud.height = 1;
257  // We have a 5mx5m map, so put points within that map
258  // Uses FLU so x is forward and back, y is sideways
259  cloud.points.push_back(pcl::PointXYZ(2, -2, 2)); // (0, 4)
260  cloud.points.push_back(pcl::PointXYZ(1, -1, 0)); // (1, 3)
261  cloud.points.push_back(pcl::PointXYZ(0, 0, -2)); // (2, 2)
262  cloud.points.push_back(pcl::PointXYZ(-2, 1, 1)); // (4,1)
263  cloud.points.push_back(pcl::PointXYZ(1, 1, 5)); // (1, 1)
264  cloud.points.push_back(pcl::PointXYZ(1, 1, 2)); // Should take lower of two heights
265  cloud.points.push_back(pcl::PointXYZ(-1, -2, 0)); // (3, 4)
266 
267  // -1 denotes a nan
268  Eigen::MatrixXf answerMat(5,5);
269  answerMat <<
270  FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX, 2,
271  FLT_MAX, 2, FLT_MAX, 0, FLT_MAX,
272  FLT_MAX, FLT_MAX, -2, FLT_MAX, FLT_MAX,
273  FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX, 0,
274  FLT_MAX, 1, FLT_MAX, FLT_MAX, FLT_MAX;
275 
276  // Update ground points
277  map.updateGroundPts(cloud);
278 
279  // Check map against our answer mat
280  EXPECT_TRUE(testMap.TestMapCells(map, "elevation_min", answerMat));
281 }
282 
283  // Test that ground points show as obstacles
284 TEST(SensorMap, nongroundPoints)
285 {
286  MapTestEnv env;
288  ros::NodeHandle nh("~");
289  // Small map for this test
290  env.smallMap_.len = grid_map::Length(3, 3);
292  EXPECT_EQ(0, map.init());
293  EXPECT_TRUE(testMap.CheckPosition(map, 0, 0));
294 
295  // Create point cloud for input
297  cloud.width = 33;
298  cloud.height = 1;
299  // We have a 3mx3m map, so put points within that map
300  // Uses FLU so x is forward and back, y is sideways
301  // See answer matrix for where all points are expected to land
302  Eigen::MatrixXi cloudPointStorage(7, 3);
303  // x, y, num times
304  cloudPointStorage <<
305  1, 1, 1, // (0, 0)
306  1, 0, 2, // (0, 1)
307  1, -1, 3, // (0, 2)
308  0, 0, 1, // (1, 1)
309  0, -1, 2, // (1, 2)
310  -1, 1, 9, // (2, 0)
311  -1, -1, 15; // (2, 2)
312 
313  // Build our point cloud
314  for (int i = 0; i < cloudPointStorage.rows(); i++)
315  {
316  auto row = cloudPointStorage.row(i);
317  for (int j = 0; j < row(2); j++)
318  {
319  cloud.points.push_back(pcl::PointXYZ(row(0), row(1), 0));
320  }
321  }
322 
323  // FRAME 1
324 
325  // Number of hits we expect to see on the points in cell layer
326  Eigen::MatrixXi history0Answers(3,3);
327  history0Answers <<
328  1, 2, 3,
329  0, 1, 2,
330  9, 0, 15;
331 
332  // Update ground points
333  map.updateNongroundPts(cloud);
334 
335  // Check map against our answer mat
336  EXPECT_TRUE(testMap.TestMapCells(map, "history_0", history0Answers));
337 
338  // FRAME 2
339  // Move first row out of scope
340  EXPECT_EQ(0, map.moveMap(-1, 0));
341 
342  // As we move, the map should mark that these cells have no valid readings now
343  history0Answers <<
344  -1, -1, -1,
345  0, 1, 2,
346  9, 0, 15;
347 
348  EXPECT_TRUE(testMap.TestMapCells(map, "history_0", history0Answers));
349 
350  // The answer matrices may not be what you expect.
351  // Remember that grid map has a rolling grid, so the movement above
352  // has the affect of the top row moving to the bottom of the gridmap
353  // but eigen doesn't do that.
354 
355  history0Answers <<
356  -1, -1, -1,
357  0, 1, 2,
358  9, 0, 15;
359 
360  Eigen::MatrixXi history1Answers(3,3);
361  history1Answers <<
362  0, 0, 0,
363  0, 1, 2,
364  9, 0, 15;
365 
366  map.updateNongroundPts(cloud);
367 
368  // Check map against our answer mats
369  EXPECT_TRUE(testMap.TestMapCells(map, "history_0", history0Answers));
370  EXPECT_TRUE(testMap.TestMapCells(map, "history_1", history1Answers));
371 
372 }
373 
374 // Test doing a lot of non ground updates and
375 // make sure we get expected results
376 TEST(SensorMap, nongroundManyFrames)
377 {
378  MapTestEnv env;
380  ros::NodeHandle nh("~");
381  // Small map for this test
382  env.smallMap_.len = grid_map::Length(3, 3);
384  EXPECT_EQ(0, map.init());
385  EXPECT_TRUE(testMap.CheckPosition(map, 0, 0));
386 
387  // Create point cloud for input
389  cloud.width = 33;
390  cloud.height = 1;
391  // We have a 3mx3m map, so put points within that map
392  // Uses FLU so x is forward and back, y is sideways
393  // See answer matrix for where all points are expected to land
394  Eigen::MatrixXi cloudPointStorage(7, 3);
395  // x, y, num times
396  cloudPointStorage <<
397  1, 1, 1, // (0, 0)
398  1, 0, 2, // (0, 1)
399  1, -1, 3, // (0, 2)
400  0, 0, 1, // (1, 1)
401  0, -1, 2, // (1, 2)
402  -1, 1, 9, // (2, 0)
403  -1, -1, 15; // (2, 2)
404 
405  // Build our point cloud
406  for (int i = 0; i < cloudPointStorage.rows(); i++)
407  {
408  auto row = cloudPointStorage.row(i);
409  for (int j = 0; j < row(2); j++)
410  {
411  cloud.points.push_back(pcl::PointXYZ(row(0), row(1), 0));
412  }
413  }
414 
415  // FRAME 1
416 
417  // Number of hits we expect to see on the points in cell layer
418  Eigen::MatrixXi historyAnswers(3,3);
419  historyAnswers <<
420  1, 2, 3,
421  0, 1, 2,
422  9, 0, 15;
423 
424  // Run 5 iterations of updating nonground points
425  for (int i = 0; i < 5; i++)
426  {
427  map.updateNongroundPts(cloud);
428  }
429 
430  // Check map against our answer mat
431  EXPECT_TRUE(testMap.TestMapCells(map, "history_0", historyAnswers));
432  EXPECT_TRUE(testMap.TestMapCells(map, "history_1", historyAnswers));
433  EXPECT_TRUE(testMap.TestMapCells(map, "history_2", historyAnswers));
434  EXPECT_TRUE(testMap.TestMapCells(map, "history_3", historyAnswers));
435  EXPECT_TRUE(testMap.TestMapCells(map, "history_4", historyAnswers));
436 
437  // Run a lot more times, all frames should have the same points
438  for (int i = 1; i < 100; i++)
439  {
440  map.updateNongroundPts(cloud);
441  if (i % 20 == 0)
442  {
443  for (int j = 0; j < env.smallMap_.numHistoryLayers; j++)
444  {
445  std::string layerName = env.smallMap_.historyLayerPrefix + std::to_string(j);
446  EXPECT_TRUE(testMap.TestMapCells(map, layerName, historyAnswers));
447  }
448  }
449  }
450 
451 }
452 
453 /*****************
454  * NOTE: THIS TEST SEEMS TO FAIL RANDOMLY DUE TO A BAD MALLOC. I HAVEN'T
455  * BEEN ABLE TO IDENTIFY IF THIS IS A MEMORY LEAK OR SOMETHING ELSE.
456  *****************/
457 
463 TEST(SensorMap, fullPipeline)
464 {
465  MapTestEnv env;
467  ros::NodeHandle nh("~");
468  env.smallMap_.obstacleFilterNs = "mitre_fast_layered_map_obstacle_filters";
469  env.smallMap_.mapOperationsFilterNs = "mitre_fast_layered_map_map_operations";
471  EXPECT_EQ(0, map.init());
472  EXPECT_TRUE(testMap.CheckPosition(map, 0, 0));
473 
474  // Create point cloud for input
476  cloud.width = 37;
477  cloud.height = 1;
478 
479 
480  // Points cloud builder.
481  Eigen::MatrixXi cloudPointStorage(8, 3);
482  // Format: x, y, num times
483  cloudPointStorage <<
484  1, 1, 9, // (1, 1)
485  1, -1, 1, // (1, 3)
486  0, -1, 2, // (2, 3)
487  -1, -1, 4, // (3, 3)
488  -1, 0, 6, // (3, 2)
489  -1, 1, 7, // (3, 1)
490  0, 1, 8, // (2, 1)
491  0, 0, 0; // Filler, we use this below
492 
493  // Build our point cloud
494  for (int i = 0; i < cloudPointStorage.rows(); i++)
495  {
496  auto row = cloudPointStorage.row(i);
497  for (int j = 0; j < row(2); j++)
498  {
499  cloud.points.push_back(pcl::PointXYZ(row(0), row(1), 0));
500  }
501  }
502 
503  // FRAME 1
504 
505  // Number of hits we expect to see on the points in cell layer
506  Eigen::MatrixXi history0Answers(5,5);
507  history0Answers <<
508  0, 0, 0, 0, 0,
509  0, 9, 0, 1, 0,
510  0, 8, 0, 2, 0,
511  0, 7, 6, 4, 0,
512  0, 0, 0, 0, 0;
513 
514  Eigen::MatrixXi nongroundLayerAnswers(5, 5);
515  nongroundLayerAnswers <<
516  30, 30, 30, 0, 0,
517  30, 100, 30, 0, 0,
518  30, 100, 30, 30, 30,
519  30, 100, 100, 100, 30,
520  30, 30, 30, 30, 30;
521 
522  map.updateNongroundPts(cloud);
523 
524  // Check map against our answer mat
525  EXPECT_TRUE(testMap.TestMapCells(map, "history_0", history0Answers));
526  EXPECT_TRUE(testMap.TestMapCells(map, "nonground", nongroundLayerAnswers));
527 
528  // Create point cloud for input
530  cloud2.width = 36;
531  cloud2.height = 1;
532 
533  // x, y, num times
534  cloudPointStorage <<
535  1, 1, 8, // (1, 1)
536  1, 0, 1, // (1, 2)
537  1, -1, 2, // (1, 3)
538  0, -1, 3, // (2, 3)
539  -1, -1, 4, // (3, 3)
540  -1, 0, 5, // (3, 2)
541  -1, 1, 6, // (3, 1)
542  0, 1, 7; // (2, 1)
543 
544  // Build our point cloud
545  for (int i = 0; i < cloudPointStorage.rows(); i++)
546  {
547  auto row = cloudPointStorage.row(i);
548  for (int j = 0; j < row(2); j++)
549  {
550  cloud2.points.push_back(pcl::PointXYZ(row(0), row(1), 0));
551  }
552  }
553 
554  // Number of hits we expect to see on the points in cell layer
555  Eigen::MatrixXi history1Answers(5,5);
556  history1Answers <<
557  0, 0, 0, 0, 0,
558  0, 8, 1, 2, 0,
559  0, 7, 0, 3, 0,
560  0, 6, 5, 4, 0,
561  0, 0, 0, 0, 0;
562 
563  nongroundLayerAnswers <<
564  30, 30, 30, 30, 30,
565  30, 100, 30, 100, 30,
566  30, 100, 30, 100, 30,
567  30, 100, 100, 100, 30,
568  30, 30, 30, 30, 30;
569 
570  map.updateNongroundPts(cloud2);
571 
572  // Check map against our answer mat
573  EXPECT_TRUE(testMap.TestMapCells(map, "history_0", history0Answers));
574  EXPECT_TRUE(testMap.TestMapCells(map, "history_1", history1Answers));
575  EXPECT_TRUE(testMap.TestMapCells(map, "nonground", nongroundLayerAnswers));
576 
577 
578 }
579 
580 // Height filter, make sure cloud points above a certain threshold are filtered out
581 // Since enabling 3d height filtering we would need to publish some frame transforms
582 // thus this test has been disabled until we take time to setup the tf tree.
583 // TEST(SensorMap, heightFilter)
584 // {
585 // MapTestEnv env;
586 // mitre_fast_layered_map::TestMap testMap;
587 // ros::NodeHandle nh("~");
588 // mitre_fast_layered_map::SensorMap map(&nh, env.smallMap_);
589 // EXPECT_EQ(0, map.init());
590 // EXPECT_TRUE(testMap.CheckPosition(map, 0, 0));
591 
592 // // Create point cloud for input
593 // mitre_fast_layered_map::PointCloud cloud;
594 // cloud.width = 6;
595 // cloud.height = 1;
596 // // We have a 5mx5m map, so put points within that map
597 // // Uses FLU so x is forward and back, y is sideways
598 // cloud.points.push_back(pcl::PointXYZ(2, -2, -100)); // (0, 4)
599 // cloud.points.push_back(pcl::PointXYZ(1, -1, 3)); // (1, 3) filtered
600 // cloud.points.push_back(pcl::PointXYZ(0, 0, 0)); // (2, 2)
601 // cloud.points.push_back(pcl::PointXYZ(-2, 1, 1.5)); // (4,1)
602 // cloud.points.push_back(pcl::PointXYZ(1, 1, -1)); // (1, 1)
603 // cloud.points.push_back(pcl::PointXYZ(-1, -2, 100)); // (3, 4) filtered
604 
605 // int nan = -1; // Grid map will store nans
606 // // -1 denotes a nan
607 // Eigen::MatrixXi answerMat(5,5);
608 // answerMat <<
609 // 0, 0, 0, 0, 100,
610 // 0, 100, 0, 0, 0,
611 // 0, 0, 100, 0, 0,
612 // 0, 0, 0, 0, 0,
613 // 0, 100, 0, 0, 0;
614 
615 // // Update ground points
616 // map.updateNongroundPts(cloud);
617 
618 // // Check map against our answer mat
619 // EXPECT_TRUE(testMap.TestMapCells(map, "nonground", answerMat));
620 // }
bool TestMapCells(SensorMap &, std::string, Eigen::MatrixXi)
std::string obstacleFilterNs
Filter chain for filtering sensor data into obstacles.
Definition: sensor_map.hpp:65
void odomCb(const nav_msgs::Odometry::ConstPtr)
Odometry callback function to update map position.
Definition: sensor_map.cpp:166
std::string mapFrameId
TF frame that the map should use.
Definition: sensor_map.hpp:50
grid_map::Length len
Size of the map, assumed to be square.
Definition: sensor_map.hpp:51
int updateNongroundPts(const PointCloud &)
Updates cells in the map that may have nonground (obstacle) points.
Definition: sensor_map.cpp:371
double resolution
Cell size of map.
Definition: sensor_map.hpp:52
bool CheckGeometry(SensorMap &, grid_map::Length, double resolution)
TEST(SensorMap, active)
int updateGroundPts(const PointCloud &)
Records cells in the gridmap where the ground points landed.
Definition: sensor_map.cpp:311
std::string historyLayerPrefix
Prefix to use for history layers.
Definition: sensor_map.hpp:53
int numHistoryLayers
Number of layers to hold for history.
Definition: sensor_map.hpp:54
bool CheckConfigEqual(SensorMap &, MapConfiguration &)
mitre_fast_layered_map::MapConfiguration defaultConfig_
Definition: init_vars.hpp:15
bool CheckPosition(SensorMap &, double x, double y)
bool CheckFrame(SensorMap &, std::string)
int moveMap(double, double)
Move the center of the map to follow ego.
Definition: sensor_map.cpp:195
std::string mapOperationsFilterNs
Filter chain for map operations after obstacles have been determined.
Definition: sensor_map.hpp:66
Eigen::Array2d Length
mitre_fast_layered_map::MapConfiguration smallMap_
Definition: init_vars.hpp:16
pcl::PointCloud< pcl::PointXYZ > PointCloud
Definition: sensor_map.hpp:102


mitre_fast_layered_map
Author(s):
autogenerated on Thu Mar 11 2021 03:06:49