GridMapPclLoaderTest.cpp
Go to the documentation of this file.
1 /*
2  * FlatGroundTest.cpp
3  *
4  * Created on: Nov 4, 2019
5  * Author: Edo Jelavic
6  * Institute: ETH Zurich, Robotic Systems Lab
7  */
8 
9 #include <gtest/gtest.h>
10 #include <cstdlib>
11 
13 
14 #include "PointcloudCreator.hpp"
15 #include "test_helpers.hpp"
16 
17 namespace grid_map {
18 namespace grid_map_pcl_test {
19 
20 TEST(GridMapPclLoaderTest, FlatGroundRealDataset) // NOLINT
21 {
23 
24  grid_map::GridMapPclLoader gridMapPclLoader;
27  gridMapPclLoader.preProcessInputCloud();
28  gridMapPclLoader.initializeGridMapGeometryFromInputCloud();
30 
31  const auto& gridMap = gridMapPclLoader.getGridMap();
32  const auto elevationValues = grid_map_pcl_test::getNonNanElevationValues(gridMap);
33 
34  EXPECT_TRUE(!elevationValues.empty());
35 
36  // test that all the elevation values are equal
37  // allow for some difference (2cm) since the input cloud is noisy (real dataset)
38  double referenceElevation = elevationValues.front();
39  for (const auto& elevation : elevationValues) {
40  EXPECT_NEAR(elevation, referenceElevation, 2e-2);
41  }
42 }
43 
44 TEST(GridMapPclLoaderTest, PerfectPlane) // NOLINT
45 {
47  const auto seed = rand();
49 
50  const int numTests = 10;
51  for (int i = 0; i < numTests; ++i) {
52  double height;
54  grid_map::GridMapPclLoader gridMapPclLoader;
56  const auto elevationValues = grid_map_pcl_test::getNonNanElevationValues(gridMapPclLoader.getGridMap());
57 
58  EXPECT_TRUE(!elevationValues.empty());
59 
60  const double tolerance = 1e-5;
61  for (const auto& elevation : elevationValues) {
62  EXPECT_NEAR(elevation, height, tolerance);
63  }
64  }
65 
66  if (::testing::Test::HasFailure()) {
67  std::cout << "\n Test PerfectPlane failed with seed: " << seed << std::endl;
68  }
69 }
70 
71 TEST(GridMapPclLoaderTest, NoisyPlane) // NOLINT
72 {
74  const auto seed = rand();
76 
77  const int numTests = 10;
78  for (int i = 0; i < numTests; ++i) {
79  double height;
80  double stdDevZ;
81  auto cloud = grid_map_pcl_test::PointcloudCreator::createNoisyPlane(&height, &stdDevZ);
82  grid_map::GridMapPclLoader gridMapPclLoader;
84  const auto elevationValues = grid_map_pcl_test::getNonNanElevationValues(gridMapPclLoader.getGridMap());
85 
86  EXPECT_TRUE(!elevationValues.empty());
87  for (const auto& elevation : elevationValues) {
88  EXPECT_NEAR(elevation, height, 3 * stdDevZ);
89  }
90  }
91 
92  if (::testing::Test::HasFailure()) {
93  std::cout << "\n Test NoisyPlane failed with seed: " << seed << std::endl;
94  }
95 }
96 
97 TEST(GridMapPclLoaderTest, NoisyDoublePlane) // NOLINT
98 {
100  const auto seed = rand();
102 
103  double minZ, stdDevZ;
105  grid_map::GridMapPclLoader gridMapPclLoader;
106  grid_map_pcl_test::runGridMapPclLoaderOnInputCloud(cloud, &gridMapPclLoader);
107  const auto elevationValues = grid_map_pcl_test::getNonNanElevationValues(gridMapPclLoader.getGridMap());
108 
109  EXPECT_TRUE(!elevationValues.empty());
110  for (const auto& elevation : elevationValues) {
111  EXPECT_NEAR(elevation, minZ, 3 * stdDevZ);
112  }
113 
114  if (::testing::Test::HasFailure()) {
115  std::cout << "\n Test NoisyDoublePlane failed with seed: " << seed << std::endl;
116  }
117 }
118 
119 TEST(GridMapPclLoaderTest, InitializeGeometry) // NOLINT
120 {
122  const auto seed = rand();
124 
125  const unsigned int numTests = 1000;
126  for (unsigned int i = 0; i < numTests; ++i) {
127  double xLocation, yLocation;
128  auto cloud = grid_map_pcl_test::PointcloudCreator::createVerticesOfASquare(&xLocation, &yLocation);
129  grid_map::GridMapPclLoader gridMapPclLoader;
131  gridMapPclLoader.setInputCloud(cloud);
132  gridMapPclLoader.initializeGridMapGeometryFromInputCloud();
133  auto gridMap = gridMapPclLoader.getGridMap();
134  auto center = gridMap.getPosition();
135 
136  const double tolerance = 1e-5;
137  EXPECT_NEAR(center.x(), 0.0, tolerance);
138  EXPECT_NEAR(center.y(), 0.0, tolerance);
139  auto length = gridMap.getLength();
140  EXPECT_NEAR(length.x(), std::round(2 * xLocation), tolerance);
141  EXPECT_NEAR(length.y(), std::round(2 * yLocation), tolerance);
142 
143  cloud->clear();
144  }
145 
146  if (::testing::Test::HasFailure()) {
147  std::cout << "\n Test InitializeGeometry failed with seed: " << seed << std::endl;
148  }
149 }
150 
151 TEST(GridMapPclLoaderTest, NoisyStepTerrain) // NOLINT
152 {
154  const auto seed = rand();
156 
157  const int numTests = 10;
158  for (int i = 0; i < numTests; ++i) {
159  double stepLocationX, zHigh, zLow, stdDevZ;
160  const auto cloud = grid_map_pcl_test::PointcloudCreator::createNoisyPointcloudOfStepTerrain(&stepLocationX, &zHigh, &zLow, &stdDevZ);
161  grid_map::GridMapPclLoader gridMapPclLoader;
162  grid_map_pcl_test::runGridMapPclLoaderOnInputCloud(cloud, &gridMapPclLoader);
163  const auto coordinates = grid_map_pcl_test::getNonNanElevationValuesWithCoordinates(gridMapPclLoader.getGridMap());
164 
165  EXPECT_TRUE(!coordinates.empty());
166  for (const auto& coordinate : coordinates) {
167  if (coordinate.x() > stepLocationX) {
168  EXPECT_NEAR(coordinate.z(), zHigh, 3 * stdDevZ);
169  }
170  if (coordinate.x() < stepLocationX) {
171  EXPECT_NEAR(coordinate.z(), zLow, 3 * stdDevZ);
172  }
173  }
174  }
175 
176  if (::testing::Test::HasFailure()) {
177  std::cout << "\n Test NoisyStepTerrain failed with seed: " << seed << std::endl;
178  }
179 
180 } // end StepTerrainPointcloud test
181 
182 TEST(GridMapPclLoaderTest, CalculateElevation) // NOLINT
183 {
185  const auto seed = rand();
187 
188  const unsigned int numTests = 10;
189  for (unsigned int i = 0; i < numTests; ++i) {
190  double minZ, stdDevZ;
191  int nBlobs;
192  auto cloud = grid_map_pcl_test::PointcloudCreator::createNBlobsAboveEachOther(&minZ, &stdDevZ, &nBlobs);
193  grid_map::GridMapPclLoader gridMapPclLoader;
195  gridMapPclLoader.setInputCloud(cloud);
196 
197  std::vector<float> clusterHeights;
198  gridMapPclLoader.calculateElevationFromPointsInsideGridMapCell(cloud, clusterHeights);
199  const float elevation = *std::min_element(clusterHeights.begin(), clusterHeights.end());
200  EXPECT_NEAR(elevation, minZ, 3 * stdDevZ);
201  }
202 
203  if (::testing::Test::HasFailure()) {
204  std::cout << "\n Test CalculateElevation failed with seed: " << seed << std::endl;
205  }
206 }
207 
208 TEST(GridMapPclLoaderTest, SavePointclouds) // NOLINT
209 {
211  return;
212  }
213 
215  const auto seed = rand();
217 
218  double dummyDouble1, dummyDouble2, dummyDouble3, dummyDouble4;
219  int dummyInt;
220 
221  grid_map::GridMapPclLoader gridMapPclLoader;
223 
224  // perfect plane
225  std::string filename = grid_map_pcl_test::getTestDataFolderPath() + "/perfectPlane.pcd";
227  gridMapPclLoader.setInputCloud(cloud);
228  gridMapPclLoader.savePointCloudAsPcdFile(filename);
229 
230  // n blobs
231  filename = grid_map_pcl_test::getTestDataFolderPath() + "/Nblobs.pcd";
232  cloud = grid_map_pcl_test::PointcloudCreator::createNBlobsAboveEachOther(&dummyDouble1, &dummyDouble2, &dummyInt);
233  gridMapPclLoader.setInputCloud(cloud);
234  gridMapPclLoader.savePointCloudAsPcdFile(filename);
235 
236  // 4 points
237  filename = grid_map_pcl_test::getTestDataFolderPath() + "/4pointSquare.pcd";
238  cloud = grid_map_pcl_test::PointcloudCreator::createVerticesOfASquare(&dummyDouble1, &dummyDouble2);
239  gridMapPclLoader.setInputCloud(cloud);
240  gridMapPclLoader.savePointCloudAsPcdFile(filename);
241 
242  // blob
243  filename = grid_map_pcl_test::getTestDataFolderPath() + "/blob.pcd";
244  cloud = grid_map_pcl_test::PointcloudCreator::createBlobOfPoints(&dummyDouble1, &dummyDouble2);
245  gridMapPclLoader.setInputCloud(cloud);
246  gridMapPclLoader.savePointCloudAsPcdFile(filename);
247 
248  // step terrain
249  filename = grid_map_pcl_test::getTestDataFolderPath() + "/stepTerrain.pcd";
250  cloud =
251  grid_map_pcl_test::PointcloudCreator::createNoisyPointcloudOfStepTerrain(&dummyDouble1, &dummyDouble2, &dummyDouble3, &dummyDouble4);
252  gridMapPclLoader.setInputCloud(cloud);
253  gridMapPclLoader.savePointCloudAsPcdFile(filename);
254 
255  // noisy plane
256  filename = grid_map_pcl_test::getTestDataFolderPath() + "/noisyPlane.pcd";
257  cloud = grid_map_pcl_test::PointcloudCreator::createNoisyPlane(&dummyDouble1, &dummyDouble2);
258  gridMapPclLoader.setInputCloud(cloud);
259  gridMapPclLoader.savePointCloudAsPcdFile(filename);
260 
261  // noisy double plane
262  filename = grid_map_pcl_test::getTestDataFolderPath() + "/doublePlane.pcd";
263  cloud = grid_map_pcl_test::PointcloudCreator::createNoisyDoublePlane(&dummyDouble1, &dummyDouble2);
264  gridMapPclLoader.setInputCloud(cloud);
265  gridMapPclLoader.savePointCloudAsPcdFile(filename);
266 }
267 
268 } /*namespace grid_map_pcl_test */
269 
270 } // namespace grid_map
static Pointcloud::Ptr createNoisyPlane(double *height, double *stdDevZ)
std::vector< Eigen::Vector3d > getNonNanElevationValuesWithCoordinates(const grid_map::GridMap &gridMap)
void loadParameters(const std::string &filename)
filename
bool getPosition(const Index &index, Position &position) const
static Pointcloud::Ptr createNBlobsAboveEachOther(double *minZ, double *stdDevZ, int *nBlobs)
void calculateElevationFromPointsInsideGridMapCell(Pointcloud::ConstPtr cloud, std::vector< float > &heights) const
void runGridMapPclLoaderOnInputCloud(Pointcloud::ConstPtr inputCloud, grid_map::GridMapPclLoader *gridMapPclLoader)
void loadCloudFromPcdFile(const std::string &filename)
TEST(GridMapPclLoaderTest, FlatGroundRealDataset)
static Pointcloud::Ptr createNoisyPointcloudOfStepTerrain(double *stepLocation, double *zHigh, double *zLow, double *stdDev)
std::vector< double > getNonNanElevationValues(const grid_map::GridMap &gridMap)
static Pointcloud::Ptr createNoisyDoublePlane(double *minZ, double *stdDevZ)
void addLayerFromInputCloud(const std::string &layer)
void setInputCloud(Pointcloud::ConstPtr inputCloud)
void setVerbosityLevel(ros::console::levels::Level level)
static const bool savePointclouds
static const std::string layerName
void savePointCloudAsPcdFile(const std::string &filename) const
static Pointcloud::Ptr createPerfectPlane(double *height)
static Pointcloud::Ptr createVerticesOfASquare(double *x, double *y)
static Pointcloud::Ptr createBlobOfPoints(double *mean, double *stdDev)
std::string getTestDataFolderPath()
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
const grid_map::GridMap & getGridMap() const


grid_map_pcl
Author(s): Dominic Jud , Edo Jelavic
autogenerated on Tue Jun 1 2021 02:13:43