Main MRPT website > C++ reference for MRPT 1.9.9
PTGs_unittest.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2017, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
11 #include <mrpt/utils/CConfigFile.h>
12 #include <mrpt/system/filesystem.h>
13 #include <gtest/gtest.h>
14 
15 // Defined in tests/test_main.cpp
16 namespace mrpt
17 {
18 namespace utils
19 {
21 }
22 }
23 
24 TEST(NavTests, PTGs_tests)
25 {
26  using namespace std;
27  using namespace mrpt;
28  using namespace mrpt::nav;
29 
30  const string sFil = mrpt::utils::MRPT_GLOBAL_UNITTEST_SRC_DIR +
31  string("/tests/PTGs_for_tests.ini");
32  if (!mrpt::system::fileExists(sFil))
33  {
34  cerr << "**WARNING* Skipping tests since file cannot be found: '"
35  << sFil << "'\n";
36  return;
37  }
38 
39  mrpt::utils::CConfigFile cfg(sFil);
40 
41  const unsigned int PTG_COUNT =
42  cfg.read_int("PTG_UNIT_TESTS", "PTG_COUNT", 0, true);
43  EXPECT_TRUE(PTG_COUNT > 0);
44  vector<CParameterizedTrajectoryGenerator*> PTGs(PTG_COUNT);
45 
46  for (unsigned int n = 0; n < PTG_COUNT; n++)
47  {
48  // Factory:
49  const string sPTGName = cfg.read_string(
50  "PTG_UNIT_TESTS", format("PTG%u_Type", n), "", true);
51  PTGs[n] = CParameterizedTrajectoryGenerator::CreatePTG(
52  sPTGName, cfg, "PTG_UNIT_TESTS", format("PTG%u_", n));
53  EXPECT_TRUE(PTGs[n] != nullptr) << "Failed creating PTG #" << n << endl;
54 
55  try
56  {
57  PTGs[n]->initialize(string(), false /*verbose */);
58  }
59  catch (std::exception& e)
60  {
61  GTEST_FAIL() << "Failed initializing PTG #" << n << endl
62  << e.what() << endl;
63  }
64  }
65 
66  // Run tests:
67  // ---------------------------------------------------------
68  for (unsigned int n = 0; n < PTG_COUNT; n++)
69  {
71 
72  const std::string sPTGDesc = ptg->getDescription();
73  const double refDist = ptg->getRefDistance();
74  const size_t num_paths = ptg->getPathCount();
75  size_t num_tests_run = 0;
76 
77  // TEST: step <-> dist match
78  {
79  for (double dist = 0.1; dist < refDist * 0.5; dist += 0.2)
80  {
81  bool any_good = false;
82  for (size_t k = 0; k < num_paths; k++)
83  {
84  uint32_t step;
85 
86  if (ptg->getPathStepForDist(k, dist, step))
87  {
88  any_good = true;
89  double d = ptg->getPathDist(k, step);
90  EXPECT_NEAR(d, dist, 0.05)
91  << "Test: step <-> dist match\n PTG: " << sPTGDesc
92  << endl
93  << "dist:" << dist << endl;
94  num_tests_run++;
95  }
96  }
97  EXPECT_TRUE(any_good)
98  << "Test: step <-> dist match\n PTG: " << sPTGDesc << endl
99  << "dist:" << dist << endl;
100  }
101  }
102 
103  // TEST: inverseMap_WS2TP
104  {
105  bool any_ok = false;
106  bool skip_this_ptg = false;
107  for (double tx = -refDist * 0.5;
108  !skip_this_ptg && tx < refDist * 0.5; tx += 0.1)
109  {
110  for (double ty = -refDist * 0.5;
111  !skip_this_ptg && ty < refDist * 0.5; ty += 0.1)
112  {
113  if (std::abs(tx) < 1e-2 && std::abs(ty) < 1e-2)
114  continue; // TP-Space does not include the WS point
115  // (0,0) in its domain
116 
117  const double tolerance_dist = std::max(
118  0.10, 10.0 * std::sqrt(tx * tx + ty * ty) * M_PI * 2 /
119  ptg->getPathCount());
120 
121  int k;
122  double normalized_d;
123  bool valid = ptg->inverseMap_WS2TP(tx, ty, k, normalized_d);
124  if (valid && normalized_d < 1.0)
125  {
126  any_ok = true;
127  // Now, do the inverse operation:
128  uint32_t step;
129  bool step_ok = ptg->getPathStepForDist(
130  k, normalized_d * refDist, step);
131  EXPECT_TRUE(step_ok)
132  << "PTG: " << sPTGDesc << endl
133  << "(tx,ty): " << tx << " " << ty << " k= " << k
134  << " normalized_d=" << normalized_d << endl;
135  if (step_ok)
136  {
137  mrpt::math::TPose2D pose;
138  ptg->getPathPose(k, step, pose);
139  EXPECT_NEAR(pose.x, tx, tolerance_dist)
140  << "Test: inverseMap_WS2TP\n PTG#" << n << ": "
141  << sPTGDesc << endl
142  << "(tx,ty): " << tx << " " << ty << " k= " << k
143  << " normalized_d=" << normalized_d << endl;
144  EXPECT_NEAR(pose.y, ty, tolerance_dist)
145  << "Test: inverseMap_WS2TP\n PTG#" << n << ": "
146  << sPTGDesc << endl
147  << "(tx,ty): " << tx << " " << ty << " k= " << k
148  << " normalized_d=" << normalized_d << endl;
149 
150  if (std::abs(pose.x - tx) >= tolerance_dist ||
151  std::abs(pose.y - ty) >= tolerance_dist)
152  skip_this_ptg = true;
153  else
154  num_tests_run++;
155  }
156  }
157  }
158  }
159  EXPECT_TRUE(any_ok) << "PTG: " << sPTGDesc << endl;
160  }
161 
162  // TEST: TP_obstacles
163  {
164  bool skip_this_ptg = false;
165  bool any_change_all = false;
166  for (double ox = -refDist * 0.5;
167  !skip_this_ptg && ox < refDist * 0.5; ox += 0.1)
168  {
169  for (double oy = -refDist * 0.5;
170  !skip_this_ptg && oy < refDist * 0.5; oy += 0.1)
171  {
172  if (std::abs(ox) < 1e-2 && std::abs(oy) < 1e-2)
173  continue; // TP-Space does not include the WS point
174  // (0,0) in its domain
175 
176  std::vector<double> TP_obstacles;
177  ptg->initTPObstacles(TP_obstacles);
178 
179  const std::vector<double> TP_obstacles_org = TP_obstacles;
180  ptg->updateTPObstacle(ox, oy, TP_obstacles);
181 
182  const bool any_change = (TP_obstacles_org != TP_obstacles);
183  if (any_change) any_change_all = true;
184  num_tests_run++;
185  }
186  }
187  EXPECT_TRUE(any_change_all);
188  }
189 
190  printf(
191  "PTG `%50s` run %6u tests.\n", sPTGDesc.c_str(),
192  (unsigned int)num_tests_run);
193 
194  } // for each ptg
195 
196  // Clean up:
197  for (unsigned int n = 0; n < PTG_COUNT; n++) delete PTGs[n];
198 }
virtual bool getPathStepForDist(uint16_t k, double dist, uint32_t &out_step) const =0
Access path k ([0,N-1]=>[-pi,pi] in alpha): largest step count for which the traversed distance is < ...
std::string MRPT_GLOBAL_UNITTEST_SRC_DIR
double x
X,Y coordinates.
This class allows loading and storing values and vectors of different types from ".ini" files easily.
Definition: CConfigFile.h:35
GLenum GLsizei n
Definition: glext.h:5074
void initTPObstacles(std::vector< double > &TP_Obstacles) const
Resizes and populates the initial appropriate contents in a vector of tp-obstacles (collision-free ra...
bool fileExists(const std::string &fileName)
Test if a given file (or directory) exists.
Definition: filesystem.cpp:127
std::string read_string(const std::string &section, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
STL namespace.
#define M_PI
Definition: bits.h:92
uint16_t getPathCount() const
Get the number of different, discrete paths in this family.
virtual double getPathDist(uint16_t k, uint32_t step) const =0
Access path k ([0,N-1]=>[-pi,pi] in alpha): traversed distance at discrete step step.
virtual void getPathPose(uint16_t k, uint32_t step, mrpt::math::TPose2D &p) const =0
Access path k ([0,N-1]=>[-pi,pi] in alpha): pose of the vehicle at discrete step step.
int read_int(const std::string &section, const std::string &name, int defaultValue, bool failIfNotFound=false) const
This is the base class for any user-defined PTG.
GLbyte ty
Definition: glext.h:6092
GLsizei const GLchar ** string
Definition: glext.h:4101
virtual void updateTPObstacle(double ox, double oy, std::vector< double > &tp_obstacles) const =0
Updates the radial map of closest TP-Obstacles given a single obstacle point at (ox,oy)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
Lightweight 2D pose.
GLenum GLsizei GLenum format
Definition: glext.h:3531
TEST(NavTests, PTGs_tests)
unsigned __int32 uint32_t
Definition: rptypes.h:47
virtual bool inverseMap_WS2TP(double x, double y, int &out_k, double &out_normalized_d, double tolerance_dist=0.10) const =0
Computes the closest (alpha,d) TP coordinates of the trajectory point closest to the Workspace (WS) C...
virtual std::string getDescription() const =0
Gets a short textual description of the PTG and its parameters.



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: ae4571287 Thu Nov 23 00:06:53 2017 +0100 at dom oct 27 23:51:55 CET 2019