Main MRPT website > C++ reference for MRPT 1.9.9
test.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-2018, 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/random.h>
12 #include <mrpt/poses/CPose2D.h>
14 #include <mrpt/poses/CPosePDFSOG.h>
15 #include <mrpt/math/geometry.h>
17 #include <mrpt/system/CTicTac.h>
21 #include <mrpt/tfest/se2.h>
23 #include <iostream>
24 
25 // Method explained in paper:
26 // J.L. Blanco, J. Gonzalez-Jimenez, J.A. Fernandez-Madrigal,
27 // "A Robust, Multi-Hypothesis Approach to Matching Occupancy Grid Maps",
28 // Robotica, 2013.
29 // http://dx.doi.org/10.1017/S0263574712000732
30 
31 // ============= PARAMETERS ===================
32 const size_t NUM_OBSERVATIONS_TO_SIMUL = 10;
33 const size_t RANSAC_MINIMUM_INLIERS = 9; // Min. # of inliers to accept
34 
35 #define LOAD_MAP_FROM_FILE 0 // 1: load from "sMAP_FILE", 0: random map.
36 #define SHOW_POINT_LABELS 0
37 
38 const float normalizationStd = 0.15f; // 1 sigma noise (meters)
39 const float ransac_mahalanobisDistanceThreshold = 5.0f;
40 const size_t MINIMUM_RANSAC_ITERS = 100000;
41 
42 #if !LOAD_MAP_FROM_FILE
43 const size_t NUM_MAP_FEATS = 100;
44 const double MAP_SIZE_X = 50;
45 const double MAP_SIZE_Y = 25;
46 #else
47 // Expected format of the 2D map is, for each line (one per landmark):
48 // ID X Y
49 const std::string sMAP_FILE = string("./DLRMap.txt");
50 #endif
51 // ==============================================
52 
53 using namespace mrpt;
54 using namespace mrpt::math;
55 using namespace mrpt::random;
56 using namespace mrpt::maps;
57 using namespace mrpt::tfest;
58 using namespace mrpt::img;
59 using namespace std;
60 
61 struct TObs
62 {
63  size_t ID; // Ground truth ID
64  double x, y;
65 };
66 
67 // ------------------------------------------------------
68 // TestRANSAC
69 // ------------------------------------------------------
70 void TestRANSAC()
71 {
73  "MRPT example: ransac-data-association", 800, 600);
74 
75  mrpt::system::CTimeLogger timelog; // For dumping stats at the end
77 
78  getRandomGenerator().randomize(); // randomize with time
79 
80  // --------------------------------
81  // Load feature map:
82  // --------------------------------
83  CSimplePointsMap the_map;
84 #if LOAD_MAP_FROM_FILE
85  {
86  CMatrixDouble M;
87  M.loadFromTextFile(sMAP_FILE); // Launch except. on error
88  ASSERT_(M.cols() == 3 && M.rows() > 2)
89 
90  const size_t nPts = M.rows();
91  the_map.resize(nPts);
92  for (size_t i = 0; i < nPts; i++) the_map.setPoint(i, M(i, 1), M(i, 2));
93  }
94 #else
95  // Generate random MAP:
96  the_map.resize(NUM_MAP_FEATS);
97  for (size_t i = 0; i < NUM_MAP_FEATS; i++)
98  {
99  the_map.setPoint(
100  i, getRandomGenerator().drawUniform(0, MAP_SIZE_X),
101  getRandomGenerator().drawUniform(0, MAP_SIZE_Y));
102  }
103 #endif
104 
105  const size_t nMapPts = the_map.size();
106  cout << "Loaded/generated map with " << nMapPts << " landmarks.\n";
107 
108  const size_t nObs = NUM_OBSERVATIONS_TO_SIMUL;
109 
110  mrpt::opengl::CPointCloud::Ptr gl_obs_map =
111  mrpt::make_aligned_shared<mrpt::opengl::CPointCloud>();
113  mrpt::make_aligned_shared<mrpt::opengl::CPointCloud>();
115  mrpt::make_aligned_shared<mrpt::opengl::CSetOfObjects>();
117  mrpt::make_aligned_shared<mrpt::opengl::CSetOfObjects>();
119  mrpt::make_aligned_shared<mrpt::opengl::CSetOfLines>();
120  {
121  mrpt::opengl::COpenGLScene::Ptr& scene = win.get3DSceneAndLock();
122 
123  scene->getViewport("main")->setCustomBackgroundColor(
124  TColorf(0.8f, 0.8f, 0.8f));
125  win.setCameraPointingToPoint(MAP_SIZE_X * 0.5, MAP_SIZE_Y * 0.5, 0);
126  win.setCameraZoom(2 * MAP_SIZE_X);
127 
128  //
130 
131  //
133  mrpt::make_aligned_shared<mrpt::opengl::CPointCloud>();
134  gl_map->loadFromPointsMap(&the_map);
135  gl_map->setColor(0, 0, 1);
136  gl_map->setPointSize(3);
137 
138  scene->insert(gl_map);
139 
140 #if SHOW_POINT_LABELS
141  for (size_t i = 0; i < the_map.size(); i++)
142  {
143  mrpt::opengl::CText::Ptr gl_txt =
144  mrpt::make_aligned_shared<mrpt::opengl::CText>(
145  mrpt::format("%u", static_cast<unsigned int>(i)));
146  double x, y;
147  the_map.getPoint(i, x, y);
148  gl_txt->setLocation(x + 0.05, y + 0.05, 0.01);
149 
150  scene->insert(gl_txt);
151  }
152 #endif
153 
154  //
155  scene->insert(gl_lines);
156 
157  //
158  gl_obs_map->setColor(1, 0, 0);
159  gl_obs_map->setPointSize(5);
160 
161  gl_result->setColor(0, 1, 0);
162  gl_result->setPointSize(4);
163 
164  //
165  gl_obs->insert(mrpt::opengl::stock_objects::CornerXYZ(0.6f));
166  gl_obs->insert(gl_obs_map);
167  gl_obs->insert(gl_obs_txts);
168  scene->insert(gl_obs);
169  scene->insert(gl_result);
170 
171  win.unlockAccess3DScene();
172  win.repaint();
173  }
174 
175  // Repeat for each set of observations in the input file
176  while (win.isOpen())
177  {
178  // Read the observations themselves:
179  vector<TObs> observations;
180  observations.resize(nObs);
181 
182  const mrpt::poses::CPose2D GT_pose(
183  mrpt::random::getRandomGenerator().drawUniform(
184  -10, 10 + MAP_SIZE_X),
185  mrpt::random::getRandomGenerator().drawUniform(
186  -10, 10 + MAP_SIZE_Y),
187  mrpt::random::getRandomGenerator().drawUniform(-M_PI, M_PI));
188 
189  const mrpt::poses::CPose2D GT_pose_inv = -GT_pose;
190 
191  std::vector<std::pair<size_t, float>> idxs;
192  the_map.kdTreeRadiusSearch2D(GT_pose.x(), GT_pose.y(), 1000, idxs);
193  ASSERT_(idxs.size() >= nObs);
194 
195  for (size_t i = 0; i < nObs; i++)
196  {
197  double gx, gy;
198  the_map.getPoint(idxs[i].first, gx, gy);
199 
200  double lx, ly;
201  GT_pose_inv.composePoint(gx, gy, lx, ly);
202 
203  observations[i].ID = idxs[i].first;
204  observations[i].x =
205  lx +
207  0, normalizationStd);
208  observations[i].y =
209  ly +
211  0, normalizationStd);
212  }
213 
214  // ----------------------------------------------------
215  // Generate list of individual-compatible pairings
216  // ----------------------------------------------------
217  TMatchingPairList all_correspondences;
218 
219  all_correspondences.reserve(nMapPts * nObs);
220 
221  // ALL possibilities:
222  for (size_t j = 0; j < nObs; j++)
223  {
224  TMatchingPair match;
225 
226  match.other_idx = j;
227  match.other_x = observations[j].x;
228  match.other_y = observations[j].y;
229 
230  for (size_t i = 0; i < nMapPts; i++)
231  {
232  match.this_idx = i;
233  the_map.getPoint(i, match.this_x, match.this_y);
234 
235  all_correspondences.push_back(match);
236  }
237  }
238  cout << "Generated " << all_correspondences.size()
239  << " potential pairings.\n";
240 
241  // ----------------------------------------------------
242  // Run RANSAC-based D-A
243  // ----------------------------------------------------
244  timelog.enter("robustRigidTransformation");
245  timer.Tic();
246 
249 
250  params.ransac_minSetSize =
251  RANSAC_MINIMUM_INLIERS; // ransac_minSetSize (to add the solution
252  // to the SOG)
253  params.ransac_maxSetSize =
254  all_correspondences
255  .size(); // ransac_maxSetSize: Test with all data points
256  params.ransac_mahalanobisDistanceThreshold =
258  params.ransac_nSimulations = 0; // 0=auto
259  params.ransac_fuseByCorrsMatch = true;
260  params.ransac_fuseMaxDiffXY = 0.01f;
261  params.ransac_fuseMaxDiffPhi = DEG2RAD(0.1);
262  params.ransac_algorithmForLandmarks = true;
263  params.probability_find_good_model = 0.999999;
264  params.ransac_min_nSimulations =
265  MINIMUM_RANSAC_ITERS; // (a lower limit to the auto-detected value
266  // of ransac_nSimulations)
267  params.verbose = true;
268 
269  // Run ransac data-association:
271  all_correspondences, normalizationStd, params, results);
272 
273  timelog.leave("robustRigidTransformation");
274 
275  mrpt::poses::CPosePDFSOG& best_poses = results.transformation;
276  TMatchingPairList& out_best_pairings = results.largestSubSet;
277 
278  const double tim = timer.Tac();
279  cout << "RANSAC time: " << mrpt::system::formatTimeInterval(tim)
280  << endl;
281 
282  cout << "# of SOG modes: " << best_poses.size() << endl;
283  cout << "Best match has " << out_best_pairings.size() << " features:\n";
284  for (size_t i = 0; i < out_best_pairings.size(); i++)
285  cout << out_best_pairings[i].this_idx << " <-> "
286  << out_best_pairings[i].other_idx << endl;
287  cout << endl;
288 
289  // Generate "association vector":
290  vector<int> obs2map_pairings(nObs, -1);
291  for (size_t i = 0; i < out_best_pairings.size(); i++)
292  obs2map_pairings[out_best_pairings[i].other_idx] =
293  out_best_pairings[i].this_idx == ((unsigned int)-1)
294  ? -1
295  : out_best_pairings[i].this_idx;
296 
297  cout << "1\n";
298  for (size_t i = 0; i < nObs; i++) cout << obs2map_pairings[i] << " ";
299  cout << endl;
300 
301  gl_result->clear();
302 
303  // Reconstruct the SE(2) transformation for these pairings:
304  mrpt::poses::CPosePDFGaussian solution_pose;
305  mrpt::tfest::se2_l2(out_best_pairings, solution_pose);
306 
307  // Normalized covariance: scale!
308  solution_pose.cov *= square(normalizationStd);
309 
310  cout << "Solution pose: " << solution_pose.mean << endl;
311  cout << "Ground truth pose: " << GT_pose << endl;
312 
313  {
314  // mrpt::opengl::COpenGLScene::Ptr &scene =
315  win.get3DSceneAndLock();
316 
317  win.addTextMessage(
318  5, 5,
319  "Blue: map landmarks | Red: Observations | White lines: Found "
320  "correspondences",
321  mrpt::img::TColorf(0, 0, 0), "mono", 12, mrpt::opengl::NICE, 0);
322 
323  //
324  gl_obs_map->clear();
325  for (size_t k = 0; k < nObs; k++)
326  gl_obs_map->insertPoint(
327  observations[k].x, observations[k].y, 0.0);
328 
329  gl_obs->setPose(solution_pose.mean);
330 
331 #if SHOW_POINT_LABELS
332  gl_obs_txts->clear();
333  for (size_t i = 0; i < nObs; i++)
334  {
335  mrpt::opengl::CText::Ptr gl_txt =
336  mrpt::make_aligned_shared<mrpt::opengl::CText>(
337  mrpt::format("%u", static_cast<unsigned int>(i)));
338  const double x = observations[i].x;
339  const double y = observations[i].y;
340  gl_txt->setLocation(x + 0.05, y + 0.05, 0.01);
341  gl_obs_txts->insert(gl_txt);
342  }
343 #endif
344 
345  //
346  gl_lines->clear();
347  double sqerr = 0;
348  size_t nPairs = 0;
349  for (size_t k = 0; k < nObs; k++)
350  {
351  int map_idx = obs2map_pairings[k];
352  if (map_idx < 0) continue;
353  nPairs++;
354 
355  double map_x, map_y;
356  the_map.getPoint(map_idx, map_x, map_y);
357 
358  double obs_x, obs_y;
359  solution_pose.mean.composePoint(
360  observations[k].x, observations[k].y, obs_x, obs_y);
361 
362  const double z = 0;
363 
364  gl_lines->appendLine(map_x, map_y, 0, obs_x, obs_y, z);
365 
366  sqerr += mrpt::math::distanceSqrBetweenPoints<double>(
367  map_x, map_y, obs_x, obs_y);
368  }
369 
370  win.addTextMessage(
371  5, 20, "Ground truth pose : " + GT_pose.asString(),
372  mrpt::img::TColorf(0, 0, 0), "mono", 12, mrpt::opengl::NICE, 1);
373  win.addTextMessage(
374  5, 35,
375  "RANSAC estimated pose: " + solution_pose.mean.asString() +
376  mrpt::format(" | RMSE=%f", (nPairs ? sqerr / nPairs : 0.0)),
377  mrpt::img::TColorf(0, 0, 0), "mono", 12, mrpt::opengl::NICE, 2);
378 
379  win.unlockAccess3DScene();
380  win.repaint();
381 
382  cout << "nPairings: " << nPairs
383  << " RMSE = " << (nPairs ? sqerr / nPairs : 0.0) << endl;
384 
385  win.waitForKey();
386  }
387 
388  } // end of for each set of observations
389 }
390 
391 // ------------------------------------------------------
392 // MAIN
393 // ------------------------------------------------------
394 int main()
395 {
396  try
397  {
398  TestRANSAC();
399  return 0;
400  }
401  catch (std::exception& e)
402  {
403  std::cout << "MRPT exception caught: " << e.what() << std::endl;
404  return -1;
405  }
406  catch (...)
407  {
408  printf("Untyped exception!!");
409  return -1;
410  }
411 }
CSetOfLines.h
mrpt::tfest::TSE2RobustParams
Parameters for se2_l2_robust().
Definition: se2.h:73
mrpt::opengl::CSetOfLines::Ptr
std::shared_ptr< CSetOfLines > Ptr
Definition: CSetOfLines.h:35
ransac_mahalanobisDistanceThreshold
const float ransac_mahalanobisDistanceThreshold
Definition: se3_ransac_unittest.cpp:38
MINIMUM_RANSAC_ITERS
const size_t MINIMUM_RANSAC_ITERS
Definition: se3_ransac_unittest.cpp:39
mrpt::maps::CPointsMap::size
size_t size() const
Returns the number of stored points in the map.
Definition: CPointsMap.h:408
geometry.h
mrpt::system::CTicTac
A high-performance stopwatch, with typical resolution of nanoseconds.
Definition: system/CTicTac.h:19
mrpt::system::CTimeLogger
A versatile "profiler" that logs the time spent within each pair of calls to enter(X)-leave(X),...
Definition: system/CTimeLogger.h:43
CPosePDFSOG.h
mrpt::opengl::NICE
@ NICE
renders glyphs filled with antialiased outlines
Definition: opengl_fonts.h:40
MAP_SIZE_Y
const double MAP_SIZE_Y
Definition: se3_ransac_unittest.cpp:43
mrpt::tfest::TMatchingPair::other_idx
uint32_t other_idx
Definition: TMatchingPair.h:64
mrpt::poses::CPosePDFGaussian::cov
mrpt::math::CMatrixDouble33 cov
The 3x3 covariance matrix.
Definition: CPosePDFGaussian.h:48
mrpt::tfest
Functions for estimating the optimal transformation between two frames of references given measuremen...
Definition: indiv-compat-decls.h:16
mrpt
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
Definition: CKalmanFilterCapable.h:30
mrpt::tfest::TMatchingPair
A structure for holding correspondences between two sets of points or points-like entities in 2D or 3...
Definition: TMatchingPair.h:33
ASSERT_
#define ASSERT_(f)
Defines an assertion mechanism.
Definition: exceptions.h:113
stock_objects.h
CPointCloud.h
mrpt::square
T square(const T x)
Inline function for the square of a number.
Definition: core/include/mrpt/core/bits_math.h:18
CPose2D.h
mrpt::system::CTimeLogger::enter
void enter(const char *func_name)
Start of a named section.
Definition: system/CTimeLogger.h:116
mrpt::poses::CPose2D::composePoint
void composePoint(double lx, double ly, double &gx, double &gy) const
An alternative, slightly more efficient way of doing with G and L being 2D points and P this 2D pose...
Definition: CPose2D.cpp:175
mrpt::opengl::CPointCloud::Ptr
std::shared_ptr< CPointCloud > Ptr
Definition: CPointCloud.h:50
CDisplayWindow3D.h
results
map< string, CVectorDouble > results
Definition: vision_stereo_rectify/test.cpp:33
random.h
mrpt::system::CTimeLogger::leave
double leave(const char *func_name)
End of a named section.
Definition: system/CTimeLogger.h:122
mrpt::poses::CPosePDFGaussian::mean
CPose2D mean
The mean value.
Definition: CPosePDFGaussian.h:46
mrpt::random::CRandomGenerator::randomize
void randomize(const uint32_t seed)
Initialize the PRNG from the given random seed.
Definition: RandomGenerator.cpp:32
mrpt::system::CTicTac::Tac
double Tac() noexcept
Stops the stopwatch.
Definition: CTicTac.cpp:90
MAP_SIZE_X
const double MAP_SIZE_X
Definition: se3_ransac_unittest.cpp:42
mrpt::math::CMatrixTemplateNumeric< double >
main
int main()
Definition: vision_stereo_rectify/test.cpp:78
M_PI
#define M_PI
Definition: core/include/mrpt/core/bits_math.h:38
TObs
Definition: se3_ransac_unittest.cpp:46
normalizationStd
const float normalizationStd
Definition: se3_ransac_unittest.cpp:37
TestRANSAC
void TestRANSAC()
Definition: vision_stereo_rectify/test.cpp:70
mrpt::img
Definition: CCanvas.h:17
mrpt::maps::CPointsMap::getPoint
unsigned long getPoint(size_t index, float &x, float &y, float &z) const
Access to a given point from map, as a 2D point.
Definition: CPointsMap.cpp:211
mrpt::tfest::TMatchingPair::this_x
float this_x
Definition: TMatchingPair.h:65
mrpt::tfest::TMatchingPair::this_idx
uint32_t this_idx
Definition: TMatchingPair.h:63
win
mrpt::gui::CDisplayWindow3D::Ptr win
Definition: vision_stereo_rectify/test.cpp:31
mrpt::format
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
Definition: format.cpp:16
mrpt::poses::CPose2D
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle.
Definition: CPose2D.h:40
mrpt::tfest::TMatchingPair::other_y
float other_y
Definition: TMatchingPair.h:66
mrpt::img::TColorf
A RGB color - floats in the range [0,1].
Definition: TColor.h:79
mrpt::math::KDTreeCapable::kdTreeRadiusSearch2D
size_t kdTreeRadiusSearch2D(const num_t x0, const num_t y0, const num_t maxRadiusSqr, std::vector< std::pair< size_t, num_t >> &out_indices_dist) const
KD Tree-based search for all the points within a given radius of some 2D point.
Definition: KDTreeCapable.h:661
mrpt::poses::CPose2D::asString
void asString(std::string &s) const
Returns a human-readable textual representation of the object (eg: "[x y yaw]", yaw in degrees)
Definition: CPose2D.cpp:418
mrpt::maps::CSimplePointsMap
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans.
Definition: CSimplePointsMap.h:31
NUM_OBSERVATIONS_TO_SIMUL
const size_t NUM_OBSERVATIONS_TO_SIMUL
Definition: se3_ransac_unittest.cpp:34
mrpt::system::CTicTac::Tic
void Tic() noexcept
Starts the stopwatch.
Definition: CTicTac.cpp:79
se2.h
mrpt::opengl::CSetOfObjects::Ptr
std::shared_ptr< CSetOfObjects > Ptr
Definition: CSetOfObjects.h:30
mrpt::system::formatTimeInterval
std::string formatTimeInterval(const double timeSeconds)
Returns a formated string with the given time difference (passed as the number of seconds),...
Definition: datetime.cpp:232
mrpt::tfest::TMatchingPair::this_y
float this_y
Definition: TMatchingPair.h:65
mrpt::maps::CPointsMap::setPoint
void setPoint(size_t index, float x, float y, float z)
Changes a given point from map, with Z defaulting to 0 if not provided.
Definition: CPointsMap.h:462
mrpt::poses::CPosePDFSOG::size
size_t size() const
Return the number of Gaussian modes.
Definition: CPosePDFSOG.h:87
mrpt::opengl::stock_objects::CornerXYZ
CSetOfObjects::Ptr CornerXYZ(float scale=1.0)
Returns three arrows representing a X,Y,Z 3D corner.
Definition: StockObjects.cpp:209
mrpt::random::getRandomGenerator
CRandomGenerator & getRandomGenerator()
A static instance of a CRandomGenerator class, for use in single-thread applications.
Definition: RandomGenerator.cpp:19
CTicTac.h
CPosePDFGaussian.h
CTimeLogger.h
mrpt::tfest::TSE2RobustResult
Output placeholder for se2_l2_robust()
Definition: se2.h:144
mrpt::tfest::se2_l2
bool se2_l2(const mrpt::tfest::TMatchingPairList &in_correspondences, mrpt::math::TPose2D &out_transformation, mrpt::math::CMatrixDouble33 *out_estimateCovariance=nullptr)
Least-squares (L2 norm) solution to finding the optimal SE(2) (x,y,yaw) between two reference frames.
Definition: se2_l2.cpp:45
mrpt::math
This base provides a set of functions for maths stuff.
Definition: math/include/mrpt/math/bits_math.h:13
NUM_MAP_FEATS
const size_t NUM_MAP_FEATS
Definition: se3_ransac_unittest.cpp:41
mrpt::tfest::TMatchingPairList
A list of TMatchingPair.
Definition: TMatchingPair.h:83
z
GLdouble GLdouble z
Definition: glext.h:3872
string
GLsizei const GLchar ** string
Definition: glext.h:4101
mrpt::opengl::COpenGLScene::Ptr
std::shared_ptr< COpenGLScene > Ptr
Definition: COpenGLScene.h:61
mrpt::random
A namespace of pseudo-random numbers generators of diferent distributions.
Definition: random_shuffle.h:17
mrpt::maps::CSimplePointsMap::resize
virtual void resize(size_t newLength) override
Resizes all point buffers so they can hold the given number of points: newly created points are set t...
Definition: CSimplePointsMap.cpp:73
mrpt::maps
Definition: CBeacon.h:24
mrpt::poses::CPosePDFGaussian
Declares a class that represents a Probability Density function (PDF) of a 2D pose .
Definition: CPosePDFGaussian.h:31
mrpt::random::CRandomGenerator::drawGaussian1D
double drawGaussian1D(const double mean, const double std)
Generate a normally distributed pseudo-random number.
Definition: RandomGenerators.h:162
RANSAC_MINIMUM_INLIERS
const size_t RANSAC_MINIMUM_INLIERS
Definition: se3_ransac_unittest.cpp:35
CSimplePointsMap.h
mrpt::tfest::se2_l2_robust
bool se2_l2_robust(const mrpt::tfest::TMatchingPairList &in_correspondences, const double in_normalizationStd, const TSE2RobustParams &in_ransac_params, TSE2RobustResult &out_results)
Robust least-squares (L2 norm) solution to finding the optimal SE(2) (x,y,yaw) between two reference ...
Definition: se2_l2_ransac.cpp:78
y
GLenum GLint GLint y
Definition: glext.h:3538
mrpt::gui::CDisplayWindow3D
A graphical user interface (GUI) for efficiently rendering 3D scenes in real-time.
Definition: CDisplayWindow3D.h:117
x
GLenum GLint x
Definition: glext.h:3538
first
GLint * first
Definition: glext.h:3827
mrpt::tfest::TMatchingPair::other_x
float other_x
Definition: TMatchingPair.h:66
params
GLenum const GLfloat * params
Definition: glext.h:3534
mrpt::poses::CPosePDFSOG
Declares a class that represents a Probability Density function (PDF) of a 2D pose .
Definition: CPosePDFSOG.h:37
mrpt::opengl::CText::Ptr
std::shared_ptr< CText > Ptr
Definition: CText.h:40
mrpt::DEG2RAD
double DEG2RAD(const double x)
Degrees to radians.
Definition: core/include/mrpt/core/bits_math.h:42



Page generated by Doxygen 1.8.17 for MRPT 1.9.9 Git: ad3a9d8ae Tue May 1 23:10:22 2018 -0700 at miƩ 12 jul 2023 10:03:34 CEST