13 #include <gtest/gtest.h> 16 namespace mrpt {
namespace utils {
30 cerr <<
"**WARNING* Skipping tests since file cannot be found: '" << sFil <<
"'\n";
36 const unsigned int PTG_COUNT = cfg.
read_int(
"PTG_UNIT_TESTS",
"PTG_COUNT",0,
true );
37 EXPECT_TRUE(PTG_COUNT>0);
38 vector<CParameterizedTrajectoryGenerator *> PTGs(PTG_COUNT);
40 for (
unsigned int n=0;
n<PTG_COUNT;
n++)
43 const string sPTGName = cfg.
read_string(
"PTG_UNIT_TESTS",
format(
"PTG%u_Type",
n ),
"",
true );
44 PTGs[
n] = CParameterizedTrajectoryGenerator::CreatePTG(sPTGName,cfg,
"PTG_UNIT_TESTS",
format(
"PTG%u_",
n) );
45 EXPECT_TRUE(PTGs[
n]!=NULL) <<
"Failed creating PTG #" <<
n << endl;
49 PTGs[
n]->initialize(
string(),
false );
50 }
catch (std::exception &e)
52 GTEST_FAIL() <<
"Failed initializing PTG #" <<
n << endl << e.what() << endl;
58 for (
unsigned int n=0;
n<PTG_COUNT;
n++)
65 size_t num_tests_run = 0;
69 for (
double dist=0.1;dist<refDist*0.5;dist+=0.2)
71 bool any_good =
false;
72 for (
size_t k=0;k<num_paths;k++)
80 EXPECT_NEAR(d,dist, 0.05) <<
"Test: step <-> dist match\n PTG: " << sPTGDesc << endl <<
"dist:" << dist << endl;
84 EXPECT_TRUE(any_good) <<
"Test: step <-> dist match\n PTG: " << sPTGDesc << endl <<
"dist:" << dist << endl;
91 bool skip_this_ptg =
false;
92 for (
double tx=-refDist*0.5;!skip_this_ptg && tx<refDist*0.5;tx+=0.1)
94 for (
double ty=-refDist*0.5;!skip_this_ptg &&
ty<refDist*0.5;
ty+=0.1)
96 if (std::abs(tx)<1e-2 && std::abs(
ty)<1e-2)
99 const double tolerance_dist = std::max(0.10, 10.0 * std::sqrt( tx*tx+
ty*
ty ) *
M_PI *2 / ptg->
getPathCount() );
104 if (valid && normalized_d<1.0)
110 EXPECT_TRUE(step_ok) <<
"PTG: " << sPTGDesc << endl <<
"(tx,ty): " << tx <<
" " <<
ty <<
" k= " << k <<
" normalized_d=" << normalized_d << endl;
115 EXPECT_NEAR(pose.
x, tx, tolerance_dist) <<
"Test: inverseMap_WS2TP\n PTG#"<<
n<<
": " << sPTGDesc << endl <<
"(tx,ty): " << tx <<
" " <<
ty <<
" k= " << k <<
" normalized_d=" << normalized_d << endl;
116 EXPECT_NEAR(pose.
y,
ty, tolerance_dist) <<
"Test: inverseMap_WS2TP\n PTG#"<<
n<<
": " << sPTGDesc << endl <<
"(tx,ty): " << tx <<
" " <<
ty <<
" k= " << k <<
" normalized_d=" << normalized_d << endl;
118 if (std::abs(pose.
x-tx)>=tolerance_dist ||std::abs(pose.
y-
ty)>=tolerance_dist)
119 skip_this_ptg =
true;
120 else num_tests_run++;
125 EXPECT_TRUE(any_ok) <<
"PTG: " << sPTGDesc << endl;
130 bool skip_this_ptg =
false;
131 bool any_change_all =
false;
132 for (
double ox=-refDist*0.5;!skip_this_ptg && ox<refDist*0.5;ox+=0.1)
134 for (
double oy=-refDist*0.5;!skip_this_ptg && oy<refDist*0.5;oy+=0.1)
136 if (std::abs(ox)<1e-2 && std::abs(oy)<1e-2)
139 std::vector<double> TP_obstacles;
142 const std::vector<double> TP_obstacles_org = TP_obstacles;
145 const bool any_change = (TP_obstacles_org!=TP_obstacles);
146 if (any_change) any_change_all=
true;
150 EXPECT_TRUE(any_change_all);
154 printf(
"PTG `%50s` run %6u tests.\n", sPTGDesc.c_str(), (
unsigned int)num_tests_run );
159 for (
unsigned int n=0;
n<PTG_COUNT;
n++)
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 getRefDistance() const
This class allows loading and storing values and vectors of different types from ".ini" files easily.
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 BASE_IMPEXP fileExists(const std::string &fileName)
Test if a given file (or directory) exists.
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
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 §ion, const std::string &name, int defaultValue, bool failIfNotFound=false) const
This is the base class for any user-defined PTG.
GLsizei const GLchar ** string
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.
GLenum GLsizei GLenum format
TEST(NavTests, PTGs_tests)
unsigned __int32 uint32_t
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.