MRPT  1.9.9
StockObjects.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | https://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2019, Individual contributors, see AUTHORS file |
6  | See: https://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See: https://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "opengl-precomp.h" // Precompiled header
11 
13 #include <mrpt/opengl/CArrow.h>
14 #include <mrpt/opengl/CBox.h>
15 #include <mrpt/opengl/CCylinder.h>
21 
22 using namespace mrpt::opengl;
23 using namespace mrpt::poses;
24 using namespace mrpt::math;
25 using namespace std;
26 
27 /*---------------------------------------------------------------
28  RobotPioneer
29  ---------------------------------------------------------------*/
31 {
32  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
33 
34  ret->setName("theRobot");
35 
36  CSetOfTriangles::Ptr obj = std::make_shared<CSetOfTriangles>();
37 
38  // Add triangles:
40 
41  trian.r[0] = trian.r[1] = trian.r[2] = 1;
42  trian.g[0] = trian.g[1] = trian.g[2] = 0;
43  trian.b[0] = trian.b[1] = trian.b[2] = 0;
44  trian.a[0] = trian.a[1] = trian.a[2] = 1;
45 
46  trian.x[0] = 0.10f;
47  trian.x[1] = -0.20f;
48  trian.x[2] = -0.20f;
49  trian.y[0] = -0.10f;
50  trian.y[1] = 0.10f;
51  trian.y[2] = -0.10f;
52  trian.z[0] = 0.20f;
53  trian.z[1] = 0.25f;
54  trian.z[2] = 0.25f;
55  obj->insertTriangle(trian); // 0
56  trian.x[0] = 0.10f;
57  trian.x[1] = 0.10f;
58  trian.x[2] = -0.20f;
59  trian.y[0] = -0.10f;
60  trian.y[1] = 0.10f;
61  trian.y[2] = 0.10f;
62  trian.z[0] = 0.20f;
63  trian.z[1] = 0.20f;
64  trian.z[2] = 0.25f;
65  obj->insertTriangle(trian); // 1
66 
67  // trian.r = 0.9f; trian.g = 0; trian.b = 0; trian.a = 1;
68 
69  trian.x[0] = 0.10f;
70  trian.x[1] = 0.10f;
71  trian.x[2] = 0.10f;
72  trian.y[0] = -0.10f;
73  trian.y[1] = -0.10f;
74  trian.y[2] = 0.10f;
75  trian.z[0] = 0.05f;
76  trian.z[1] = 0.20f;
77  trian.z[2] = 0.20f;
78  obj->insertTriangle(trian); // 2
79  trian.x[0] = 0.10f;
80  trian.x[1] = 0.10f;
81  trian.x[2] = 0.10f;
82  trian.y[0] = -0.10f;
83  trian.y[1] = 0.10f;
84  trian.y[2] = 0.10f;
85  trian.z[0] = 0.05f;
86  trian.z[1] = 0.05f;
87  trian.z[2] = 0.20f;
88  obj->insertTriangle(trian); // 3
89 
90  trian.x[0] = -0.20f;
91  trian.x[1] = -0.20f;
92  trian.x[2] = -0.20f;
93  trian.y[0] = -0.10f;
94  trian.y[1] = -0.10f;
95  trian.y[2] = 0.10f;
96  trian.z[0] = 0.05f;
97  trian.z[1] = 0.25f;
98  trian.z[2] = 0.25f;
99  obj->insertTriangle(trian); // 2b
100  trian.x[0] = -0.20f;
101  trian.x[1] = -0.20f;
102  trian.x[2] = -0.20f;
103  trian.y[0] = -0.10f;
104  trian.y[1] = 0.10f;
105  trian.y[2] = 0.10f;
106  trian.z[0] = 0.05f;
107  trian.z[1] = 0.05f;
108  trian.z[2] = 0.25f;
109  obj->insertTriangle(trian); // 3b
110 
111  // trian.r = 0.8f; trian.g = 0; trian.b = 0; trian.a = 1;
112  trian.x[0] = 0.10f;
113  trian.x[1] = -0.20f;
114  trian.x[2] = -0.20f;
115  trian.y[0] = -0.10f;
116  trian.y[1] = -0.10f;
117  trian.y[2] = -0.10f;
118  trian.z[0] = 0.20f;
119  trian.z[1] = 0.25f;
120  trian.z[2] = 0.05f;
121  obj->insertTriangle(trian); // 4
122  trian.x[0] = 0.10f;
123  trian.x[1] = 0.10f;
124  trian.x[2] = -0.20f;
125  trian.y[0] = -0.10f;
126  trian.y[1] = -0.10f;
127  trian.y[2] = -0.10f;
128  trian.z[0] = 0.20f;
129  trian.z[1] = 0.05f;
130  trian.z[2] = 0.05f;
131  obj->insertTriangle(trian); // 5
132 
133  trian.x[0] = 0.10f;
134  trian.x[1] = -0.20f;
135  trian.x[2] = -0.20f;
136  trian.y[0] = 0.10f;
137  trian.y[1] = 0.10f;
138  trian.y[2] = 0.10f;
139  trian.z[0] = 0.20f;
140  trian.z[1] = 0.25f;
141  trian.z[2] = 0.05f;
142  obj->insertTriangle(trian); // 6
143  trian.x[0] = 0.10f;
144  trian.x[1] = 0.10f;
145  trian.x[2] = -0.20f;
146  trian.y[0] = 0.10f;
147  trian.y[1] = 0.10f;
148  trian.y[2] = 0.10f;
149  trian.z[0] = 0.20f;
150  trian.z[1] = 0.05f;
151  trian.z[2] = 0.05f;
152  obj->insertTriangle(trian); // 7
153 
154  trian.r[0] = trian.r[1] = trian.r[2] = 0.05f;
155  trian.g[0] = trian.g[1] = trian.g[2] = 0.05f;
156  trian.b[0] = trian.b[1] = trian.b[2] = 0.05f;
157  trian.a[0] = trian.a[1] = trian.a[2] = 1;
158 
159  trian.x[0] = 0.00f;
160  trian.x[1] = 0.00f;
161  trian.x[2] = 0.05f;
162  trian.y[0] = 0.11f;
163  trian.y[1] = 0.11f;
164  trian.y[2] = 0.11f;
165  trian.z[0] = 0.00f;
166  trian.z[1] = 0.10f;
167  trian.z[2] = 0.05f;
168  obj->insertTriangle(trian); // 8
169  trian.x[0] = 0.00f;
170  trian.x[1] = 0.00f;
171  trian.x[2] = -0.05f;
172  trian.y[0] = 0.11f;
173  trian.y[1] = 0.11f;
174  trian.y[2] = 0.11f;
175  trian.z[0] = 0.00f;
176  trian.z[1] = 0.10f;
177  trian.z[2] = 0.05f;
178  obj->insertTriangle(trian); // 9
179 
180  trian.x[0] = 0.00f;
181  trian.x[1] = 0.00f;
182  trian.x[2] = 0.05f;
183  trian.y[0] = -0.11f;
184  trian.y[1] = -0.11f;
185  trian.y[2] = -0.11f;
186  trian.z[0] = 0.00f;
187  trian.z[1] = 0.10f;
188  trian.z[2] = 0.05f;
189  obj->insertTriangle(trian); // 10
190  trian.x[0] = 0.00f;
191  trian.x[1] = 0.00f;
192  trian.x[2] = -0.05f;
193  trian.y[0] = -0.11f;
194  trian.y[1] = -0.11f;
195  trian.y[2] = -0.11f;
196  trian.z[0] = 0.00f;
197  trian.z[1] = 0.10f;
198  trian.z[2] = 0.05f;
199  obj->insertTriangle(trian); // 11
200 
201  ret->insert(obj);
202 
203  return ret;
204 }
205 
206 /*---------------------------------------------------------------
207  CornerXYZ
208  ---------------------------------------------------------------*/
210 {
211  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
212 
214  0, 0, 0, scale, 0, 0, 0.25f * scale, 0.02f * scale, 0.05f * scale);
215 
216  obj->setColor(1, 0, 0);
217 
218  ret->insert(obj);
219 
221  0, 0, 0, 0, scale, 0, 0.25f * scale, 0.02f * scale, 0.05f * scale);
222  obj->setColor(0, 1, 0);
223 
224  ret->insert(obj);
225 
227  0, 0, 0, 0, 0, scale, 0.25f * scale, 0.02f * scale, 0.05f * scale);
228  obj->setColor(0, 0, 1);
229 
230  ret->insert(obj);
231 
232  return ret;
233 }
234 
235 /*---------------------------------------------------------------
236  RobotRhodon
237  ---------------------------------------------------------------*/
239 {
240  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
241  float height = 0;
242 
243  vector<TPoint2D> level1;
244  level1.emplace_back(0.31, 0);
245  level1.emplace_back(0.22, 0.24);
246  level1.emplace_back(-0.22, 0.24);
247  level1.emplace_back(-0.31, 0);
248  level1.emplace_back(-0.22, -0.24);
249  level1.emplace_back(0.22, -0.24);
250 
251  CPolyhedron::Ptr obj1 =
253  obj1->setLocation(0, 0, height);
254  height += 0.38f;
255  obj1->setColor(0.6, 0.6, 0.6);
256  ret->insert(obj1);
257 
258  vector<TPoint2D> level2;
259  level2.emplace_back(0.16, 0.21);
260  level2.emplace_back(-0.16, 0.21);
261  level2.emplace_back(-0.16, -0.21);
262  level2.emplace_back(0.16, -0.21);
263 
264  CPolyhedron::Ptr obj2 =
266  obj2->setLocation(0, 0, height);
267  height += 0.35f;
268  obj2->setColor(0.2, 0.2, 0.2);
269  ret->insert(obj2);
270 
271  vector<TPoint2D> level3;
272  level3.emplace_back(-0.12, 0.12);
273  level3.emplace_back(-0.16, 0.12);
274  level3.emplace_back(-0.16, -0.12);
275  level3.emplace_back(-0.12, -0.12);
276 
278  obj3->setLocation(0, 0, height);
279  // height+=1;
280  obj3->setColor(0.6, 0.6, 0.6);
281  ret->insert(obj3);
282 
284  std::make_shared<opengl::CCylinder>(0.05f, 0.05f, 0.4f, 20, 20);
285  obj4->setLocation(0, 0, 0.73);
286  obj4->setColor(0, 0, 0.9);
287  ret->insert(obj4);
288 
290  std::make_shared<opengl::CCylinder>(0.05f, 0.05f, 0.4f, 20, 20);
291  obj5->setPose(CPose3D(0.32, 0, 0.89, 0, -1, 0));
292  obj5->setColor(0, 0, 0.9);
293  ret->insert(obj5);
294 
295  return ret;
296 }
297 
298 /*---------------------------------------------------------------
299  RobotGiraff
300  ---------------------------------------------------------------*/
302 {
303  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
304  float height = 0;
305 
306  // Base
307  vector<TPoint2D> level1;
308  level1.emplace_back(0.31, 0);
309  level1.emplace_back(0.22, 0.24);
310  level1.emplace_back(-0.22, 0.24);
311  level1.emplace_back(-0.31, 0);
312  level1.emplace_back(-0.22, -0.24);
313  level1.emplace_back(0.22, -0.24);
314 
315  CPolyhedron::Ptr obj1 =
317  obj1->setLocation(0, 0, height);
318  height += 0.23f;
319  obj1->setColor(1.0, 0.6, 0.0);
320  ret->insert(obj1);
321 
322  // Electronic's cage
323  vector<TPoint2D> level2;
324  level2.emplace_back(0.13, 0.1);
325  level2.emplace_back(-0.13, 0.1);
326  level2.emplace_back(-0.13, -0.1);
327  level2.emplace_back(0.13, -0.1);
328 
329  CPolyhedron::Ptr obj2 =
331  obj2->setLocation(0, 0, height);
332  height += 0.45f;
333  obj2->setColor(1.0, 0.6, 0.2);
334  ret->insert(obj2);
335 
336  // Neck
337  vector<TPoint2D> level3;
338  level3.emplace_back(0.03, 0.03);
339  level3.emplace_back(-0.03, 0.03);
340  level3.emplace_back(-0.03, -0.03);
341  level3.emplace_back(0.03, -0.03);
342 
343  CPolyhedron::Ptr obj3 =
345  obj3->setLocation(0, 0, height);
346  height += 0.55f;
347  obj3->setColor(0.6, 0.6, 0.6);
348  ret->insert(obj3);
349 
350  // Screen
351  vector<TPoint2D> level4;
352  level4.emplace_back(0.03, 0.11);
353  level4.emplace_back(-0.03, 0.11);
354  level4.emplace_back(-0.03, -0.11);
355  level4.emplace_back(0.03, -0.11);
356 
358  obj4->setLocation(0, 0, height);
359  obj4->setColor(1.0, 0.6, 0.0);
360  ret->insert(obj4);
361 
362  return ret;
363 }
364 
366 {
367  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
368  CPose3D rotation;
369 
370  CArrow::Ptr obj = CArrow::Create(0, 0, 0, 1.0, 0, 0, 0.25f, 0.02f, 0.05f);
371 
372  obj->setColor(1, 0, 0);
373 
374  ret->insert(obj);
375 
376  obj = CArrow::Create(0, 0, 0, 0, 1.0, 0, 0.25f, 0.02f, 0.05f);
377  obj->setColor(0, 1, 0);
378 
379  ret->insert(obj);
380 
381  obj = CArrow::Create(0, 0, -1.0, 0, 0, 0, 0.25f, 0.02f, 0.05f);
382  obj->setColor(0, 0, 1);
383 
384  ret->insert(obj);
385 
386  return ret;
387 }
388 
389 /*---------------------------------------------------------------
390  BumblebeeCamera
391  ---------------------------------------------------------------*/
393 {
394  CSetOfObjects::Ptr camera = std::make_shared<opengl::CSetOfObjects>();
395 
397  -0.02, 0.14, -0.02, 0.02, 0, -0.04);
398  rect->setColor(1, 0.8, 0);
399 
400  camera->insert(rect);
401 
402  CCylinder::Ptr lCam =
403  std::make_shared<opengl::CCylinder>(0.01f, 0.01f, 0.003f, 10, 10);
404  lCam->setColor(1, 0, 0);
405 
406  CCylinder::Ptr rCam =
407  std::make_shared<opengl::CCylinder>(0.01f, 0.01f, 0.003f, 10, 10);
408  rCam->setPose(CPose3D(0.12, 0, 0));
409  rCam->setColor(0, 0, 0);
410 
411  camera->insert(lCam);
412  camera->insert(rCam);
413 
414  return camera;
415 }
416 
418 {
419  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
420 
421  {
422  CSimpleLine::Ptr lin = std::make_shared<CSimpleLine>();
423  lin->setLineWidth(lineWidth);
424  lin->setColor(1, 0, 0);
425  lin->setLineCoords(0, 0, 0, scale, 0, 0);
426  ret->insert(lin);
427  }
428  {
429  CSimpleLine::Ptr lin = std::make_shared<CSimpleLine>();
430  lin->setLineWidth(lineWidth);
431  lin->setColor(0, 1, 0);
432  lin->setLineCoords(0, 0, 0, 0, scale, 0);
433  ret->insert(lin);
434  }
435  {
436  CSimpleLine::Ptr lin = std::make_shared<CSimpleLine>();
437  lin->setLineWidth(lineWidth);
438  lin->setColor(0, 0, 1);
439  lin->setLineCoords(0, 0, 0, 0, 0, scale);
440  ret->insert(lin);
441  }
442  return ret;
443 }
444 
446 {
447  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
448 
449  {
450  CSimpleLine::Ptr lin = std::make_shared<CSimpleLine>();
451  lin->setLineWidth(lineWidth);
452  lin->setColor(1, 0, 0);
453  lin->setLineCoords(0, 0, 0, scale, 0, 0);
454  ret->insert(lin);
455  }
456  {
457  CSimpleLine::Ptr lin = std::make_shared<CSimpleLine>();
458  lin->setLineWidth(lineWidth);
459  lin->setColor(0, 1, 0);
460  lin->setLineCoords(0, 0, 0, 0, scale, 0);
461  ret->insert(lin);
462  }
463  return ret;
464 }
465 
467 {
468  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
469 
470  {
471  CBox::Ptr base = std::make_shared<CBox>(
472  TPoint3D(-0.025, -0.025, -0.0575), TPoint3D(0.025, 0.025, -0.0185));
473  base->setColor(0.7, 0.7, 0.7);
474  ret->insert(base);
475  }
476  {
477  CCylinder::Ptr cyl1 = std::make_shared<CCylinder>(0.02f, 0.02f, 0.01f);
478  cyl1->setColor(0, 0, 0);
479  cyl1->setLocation(0, 0, -0.014);
480  ret->insert(cyl1);
481  }
482  {
483  CCylinder::Ptr cyl2 =
484  std::make_shared<CCylinder>(0.02f, 0.0175f, 0.01f);
485  cyl2->setColor(0, 0, 0);
486  cyl2->setLocation(0, 0, -0.004);
487  ret->insert(cyl2);
488  }
489  {
490  CCylinder::Ptr cyl3 =
491  std::make_shared<CCylinder>(0.0175f, 0.0175f, 0.01f);
492  cyl3->setColor(0, 0, 0);
493  cyl3->setLocation(0, 0, 0.004);
494  ret->insert(cyl3);
495  }
496 
497  return ret;
498 }
499 
501 {
502  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
503 
504  {
505  CBox::Ptr base = std::make_shared<CBox>(
506  TPoint3D(-0.03, -0.03, -0.055), TPoint3D(0.03, 0.03, -0.014));
507  base->setColor(0, 0, 0);
508  ret->insert(base);
509  }
510  {
511  CCylinder::Ptr cyl1 =
512  std::make_shared<CCylinder>(0.028f, 0.024f, 0.028f);
513  cyl1->setColor(0, 0, 0);
514  cyl1->setPose(CPose3D(0, 0, -0.014));
515  ret->insert(cyl1);
516  }
517  {
518  CCylinder::Ptr cyl2 =
519  std::make_shared<CCylinder>(0.028f, 0.028f, 0.01f);
520  cyl2->setColor(1, 69 / 255.0, 0);
521  cyl2->setLocation(0, 0, 0.014);
522  ret->insert(cyl2);
523  }
524  {
525  CCylinder::Ptr cyl3 =
526  std::make_shared<CCylinder>(0.028f, 0.028f, 0.01f);
527  cyl3->setColor(0, 0, 0);
528  cyl3->setLocation(0, 0, 0.024);
529  ret->insert(cyl3);
530  }
531 
532  return ret;
533 }
534 
536 {
537  CSetOfObjects::Ptr ret = std::make_shared<CSetOfObjects>();
538 
539  {
540  CBox::Ptr cabin = std::make_shared<CBox>(
541  TPoint3D(0.878, 0.723, -0.12), TPoint3D(-0.258, -0.723, -1.690));
542  cabin->setColor(0.7, 0.7, 0.7);
543  ret->insert(cabin);
544  }
545  {
546  CBox::Ptr back = std::make_shared<CBox>(
547  TPoint3D(-0.258, 0.723, -0.72), TPoint3D(-5.938, -0.723, -1.690));
548  back->setColor(1, 1, 1);
549  ret->insert(back);
550  }
551  {
552  CBox::Ptr boomAxis = std::make_shared<CBox>(
553  TPoint3D(-5.938, 0.723, -1.0), TPoint3D(-6.189, -0.723, -1.690));
554  boomAxis->setColor(0, 0, 0);
555  ret->insert(boomAxis);
556  }
557  {
558  CBox::Ptr boom1 = std::make_shared<CBox>(
559  TPoint3D(-5.938, 0.723, -1.0), TPoint3D(-6.189, 11.277, -1.620));
560  boom1->setColor(0, 1, 0);
561  ret->insert(boom1);
562  }
563  {
564  CBox::Ptr boom2 = std::make_shared<CBox>(
565  TPoint3D(-5.938, -0.723, -1.0), TPoint3D(-6.189, -11.277, -1.620));
566  boom2->setColor(0, 1, 0);
567  ret->insert(boom2);
568  }
569  {
570  CCylinder::Ptr cyl1 =
571  std::make_shared<CCylinder>(0.716f, 0.716f, 0.387f, 30);
572  cyl1->setColor(0, 0, 0);
573  cyl1->setPose(CPose3D(-0.710, 0.923, -2.480, 0, 0, 90.0_deg));
574  ret->insert(cyl1);
575  }
576  {
577  CCylinder::Ptr cyl2 =
578  std::make_shared<CCylinder>(0.716f, 0.716f, 0.387f, 30);
579  cyl2->setColor(0, 0, 0);
580  cyl2->setPose(CPose3D(-3.937, 0.923, -2.480, 0, 0, 90.0_deg));
581  ret->insert(cyl2);
582  }
583  {
584  CCylinder::Ptr cyl1 =
585  std::make_shared<CCylinder>(0.716f, 0.716f, 0.387f, 30);
586  cyl1->setColor(0, 0, 0);
587  cyl1->setPose(CPose3D(-0.710, -0.423, -2.480, 0, 0, 90.0_deg));
588  ret->insert(cyl1);
589  }
590  {
591  CCylinder::Ptr cyl2 =
592  std::make_shared<CCylinder>(0.716f, 0.716f, 0.387f, 30);
593  cyl2->setColor(0, 0, 0);
594  cyl2->setPose(CPose3D(-3.937, -0.423, -2.480, 0, 0, 90.0_deg));
595  ret->insert(cyl2);
596  }
597  return ret;
598 }
CSetOfObjects::Ptr Hokuyo_UTM()
Returns a simple 3D model of a Hokuyo UTM scanner.
CSetOfObjects::Ptr CornerXYSimple(float scale=1.0, float lineWidth=1.0)
Returns two arrows representing a X,Y 2D corner (just thick lines, fast to render).
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:6604
CSetOfObjects::Ptr RobotGiraff()
Returns a representation of RobotGiraff.
CSetOfObjects::Ptr RobotRhodon()
Returns a representation of Rhodon.
CSetOfObjects::Ptr Househam_Sprayer()
Returns a simple 3D model of a househam sprayer.
STL namespace.
static CPolyhedron::Ptr CreateCubicPrism(double x1, double x2, double y1, double y2, double z1, double z2)
Creates a cubic prism, given the coordinates of two opposite vertices.
GLsizei GLsizei GLuint * obj
Definition: glext.h:4085
This base provides a set of functions for maths stuff.
static Ptr Create(Args &&... args)
Definition: CArrow.h:30
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
CSetOfObjects::Ptr RobotPioneer()
Returns a representation of a Pioneer II mobile base.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
Definition: CPose3D.h:85
CSetOfObjects::Ptr CornerXYZ(float scale=1.0)
Returns three arrows representing a X,Y,Z 3D corner.
CSetOfObjects::Ptr CornerXYZSimple(float scale=1.0, float lineWidth=1.0)
Returns three arrows representing a X,Y,Z 3D corner (just thick lines instead of complex arrows for f...
The namespace for 3D scene representation and rendering.
Definition: CGlCanvasBase.h:15
CSetOfObjects::Ptr CornerXYZEye()
Returns three arrows representing a X,Y,Z 3D corner.
Lightweight 3D point.
Definition: TPoint3D.h:90
GLenum GLsizei GLsizei height
Definition: glext.h:3558
CSetOfObjects::Ptr BumblebeeCamera()
Returns a simple 3D model of a PointGrey Bumblebee stereo camera.
static CPolyhedron::Ptr CreateCustomPrism(const std::vector< mrpt::math::TPoint2D > &baseVertices, double height)
Creates a custom prism with vertical edges, given any base which will lie on the XY plane...
CSetOfObjects::Ptr Hokuyo_URG()
Returns a simple 3D model of a Hokuyo URG scanner.



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: 1d7b2c899 Thu Nov 14 18:59:07 2019 +0100 at jue nov 14 19:15:09 CET 2019