metricmap.cpp
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------
2  * A repertory of multi primitive-to-primitive (MP2P) ICP algorithms in C++
3  * Copyright (C) 2018-2024 Jose Luis Blanco, University of Almeria
4  * See LICENSE for license information.
5  * ------------------------------------------------------------------------- */
13 #include <mp2p_icp/metricmap.h>
14 #include <mrpt/io/CFileGZInputStream.h>
15 #include <mrpt/io/CFileGZOutputStream.h>
16 #include <mrpt/maps/CVoxelMap.h>
17 #include <mrpt/maps/CVoxelMapRGB.h>
18 #include <mrpt/math/CHistogram.h>
19 #include <mrpt/math/distributions.h> // confidenceIntervals()
20 #include <mrpt/opengl/CGridPlaneXY.h>
21 #include <mrpt/opengl/CPointCloud.h>
22 #include <mrpt/opengl/CPointCloudColoured.h>
23 #include <mrpt/opengl/CSetOfLines.h>
24 #include <mrpt/opengl/CSetOfObjects.h>
25 #include <mrpt/serialization/CArchive.h>
26 #include <mrpt/serialization/optional_serialization.h>
27 #include <mrpt/serialization/stl_serialization.h>
28 #include <mrpt/system/string_utils.h> // unitsFormat()
29 
30 #include <algorithm>
31 #include <iterator>
32 
34  metric_map_t, mrpt::serialization::CSerializable, mp2p_icp)
35 
36 using namespace mp2p_icp;
37 
38 // Implementation of the CSerializable virtual interface:
39 uint8_t metric_map_t::serializeGetVersion() const { return 3; }
40 void metric_map_t::serializeTo(mrpt::serialization::CArchive& out) const
41 {
42  out << lines;
43 
44  out.WriteAs<uint32_t>(planes.size());
45  for (const auto& p : planes) out << p.plane << p.centroid;
46 
47  out.WriteAs<uint32_t>(lines.size());
48  for (const auto& l : lines) out << l;
49 
50  out.WriteAs<uint32_t>(layers.size());
51  for (const auto& l : layers) out << l.first << *l.second.get();
52 
53  out << id << label; // new in v1
54 
55  // new in v2:
56  out.WriteAs<bool>(georeferencing.has_value());
57  if (georeferencing)
58  {
59  out << georeferencing->geo_coord.lat.decimal_value
60  << georeferencing->geo_coord.lon.decimal_value
61  << georeferencing->geo_coord.height << georeferencing->T_enu_to_map;
62  // v3: T_enu_to_map: mrpt::poses::CPose3D =>
63  // mrpt::poses::CPose3DPDFGaussian
64  }
65 
66  // Optional user data:
68 }
69 void metric_map_t::serializeFrom(
70  mrpt::serialization::CArchive& in, uint8_t version)
71 {
72  switch (version)
73  {
74  case 0:
75  case 1:
76  case 2:
77  case 3:
78  {
79  in >> lines;
80  const auto nPls = in.ReadAs<uint32_t>();
81  planes.resize(nPls);
82  for (auto& pl : planes) in >> pl.plane >> pl.centroid;
83 
84  const auto nLins = in.ReadAs<uint32_t>();
85  lines.resize(nLins);
86  for (auto& l : lines) in >> l;
87 
88  const auto nPts = in.ReadAs<uint32_t>();
89  layers.clear();
90  for (std::size_t i = 0; i < nPts; i++)
91  {
92  std::string name;
93  in >> name;
94  layers[name] = mrpt::ptr_cast<mrpt::maps::CMetricMap>::from(
95  in.ReadObject());
96  }
97 
98  if (version >= 1) { in >> id >> label; }
99  else
100  {
101  id.reset();
102  label.reset();
103  }
104 
105  if (version >= 2 && in.ReadAs<bool>())
106  {
107  auto& g = georeferencing.emplace();
108  in >> g.geo_coord.lat.decimal_value >>
109  g.geo_coord.lon.decimal_value >> g.geo_coord.height;
110  if (version >= 3) { in >> g.T_enu_to_map; }
111  else { in >> g.T_enu_to_map.mean; }
112  }
113  else
114  georeferencing.reset();
115 
116  // Optional user data:
118  }
119  break;
120  default:
121  MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(version);
122  };
123 }
124 
126  -> std::shared_ptr<mrpt::opengl::CSetOfObjects>
127 {
128  MRPT_START
129  auto o = mrpt::opengl::CSetOfObjects::Create();
130 
131  get_visualization_planes(*o, p.planes);
132  get_visualization_lines(*o, p.lines);
133  get_visualization_points(*o, p.points);
134 
135  return o;
136  MRPT_END
137 }
138 
140  mrpt::opengl::CSetOfObjects& o, const render_params_planes_t& p) const
141 {
142  MRPT_START
143  if (!p.visible) return;
144 
145  const float pw = p.halfWidth, pf = p.gridSpacing;
146 
147  for (const auto& plane : planes)
148  {
149  auto gl_pl =
150  mrpt::opengl::CGridPlaneXY::Create(-pw, pw, -pw, pw, .0, pf);
151  gl_pl->setColor_u8(p.color);
152  mrpt::math::TPose3D planePose;
153  plane.plane.getAsPose3DForcingOrigin(plane.centroid, planePose);
154  gl_pl->setPose(planePose);
155  o.insert(gl_pl);
156  }
157 
158  MRPT_END
159 }
160 
162  mrpt::opengl::CSetOfObjects& o, const render_params_lines_t& p) const
163 {
164  MRPT_START
165 
166  auto glLin = mrpt::opengl::CSetOfLines::Create();
167  glLin->setColor_u8(p.color);
168 
169  for (size_t idxLine = 0; idxLine < lines.size(); idxLine++)
170  {
171  const auto& line = lines[idxLine];
172  double linLen = p.length;
173  const auto halfSeg = line.director * (0.5 * linLen);
174  glLin->appendLine(line.pBase - halfSeg, line.pBase + halfSeg);
175  }
176  o.insert(glLin);
177 
178  MRPT_END
179 }
180 
182  mrpt::opengl::CSetOfObjects& o, const render_params_points_t& p) const
183 {
184  MRPT_START
185  // Planes:
186  if (!p.visible) return;
187 
188  if (!p.perLayer.empty())
189  {
190  // render only these layers:
191  for (const auto& kv : p.perLayer)
192  {
193  const auto itPts = layers.find(kv.first);
194  if (itPts == layers.end())
195  THROW_EXCEPTION_FMT(
196  "Rendering parameters given for layer '%s' which does not "
197  "exist in this metric_map_t object",
198  kv.first.c_str());
199 
200  get_visualization_map_layer(o, kv.second, itPts->second);
201  }
202  }
203  else
204  {
205  // render all layers with the same params:
206  for (const auto& kv : layers)
207  {
208  get_visualization_map_layer(o, p.allLayers, kv.second);
209  }
210  }
211 
212  MRPT_END
213 }
214 
216  mrpt::opengl::CSetOfObjects& o, const render_params_point_layer_t& p,
217  const mrpt::maps::CMetricMap::Ptr& map)
218 {
219  mrpt::maps::CPointsMap::Ptr pts;
220 
221  auto voxelMap = std::dynamic_pointer_cast<mrpt::maps::CVoxelMap>(map);
222  auto voxelRGBMap = std::dynamic_pointer_cast<mrpt::maps::CVoxelMapRGB>(map);
223  if (voxelMap || voxelRGBMap)
224  {
226  {
227  // get occupied voxel XYZ coordinates only:
228  if (voxelMap) pts = voxelMap->getOccupiedVoxels();
229  if (voxelRGBMap) pts = voxelRGBMap->getOccupiedVoxels();
230  }
231  else
232  {
233  // Render as real voxelmaps:
234  if (voxelMap)
235  {
236  voxelMap->renderingOptions.generateFreeVoxels =
238  }
239  else if (voxelRGBMap)
240  {
241  voxelRGBMap->renderingOptions.generateFreeVoxels =
243  }
244 
245  // regular render method:
246  map->getVisualizationInto(o);
247  return;
248  }
249  }
250  else { pts = std::dynamic_pointer_cast<mrpt::maps::CPointsMap>(map); }
251 
252  if (!pts ||
253  (p.colorMode.has_value() && p.colorMode->keep_original_cloud_color))
254  {
255  // Not convertible to point maps or user selected their original colors,
256  // use its own default renderer:
257  map->getVisualizationInto(o);
258 
259  // apply the point size, if possible:
260  if (auto glPtsCol = o.getByClass<mrpt::opengl::CPointCloudColoured>();
261  glPtsCol)
262  {
263  glPtsCol->setPointSize(p.pointSize);
264  }
265  else if (auto glPts = o.getByClass<mrpt::opengl::CPointCloud>(); glPts)
266  {
267  glPts->setPointSize(p.pointSize);
268  }
269 
270  return;
271  }
272 
273  if (pts && pts->empty()) return; // quick return if empty point cloud
274 
275  if (p.colorMode.has_value())
276  {
277  // color point cloud:
278  auto glPts = mrpt::opengl::CPointCloudColoured::Create();
279  glPts->loadFromPointsMap(pts.get());
280 
281  glPts->setPointSize(p.pointSize);
282 
283  mrpt::math::TBoundingBoxf bb;
284 
285  const bool hasToAutoFindBB =
286  (!p.colorMode->colorMapMinCoord.has_value() ||
287  !p.colorMode->colorMapMaxCoord.has_value());
288 
289  if (hasToAutoFindBB) bb = pts->boundingBox();
290 
291  ASSERT_(p.colorMode->recolorizeByCoordinate.has_value());
292 
293  const unsigned int coordIdx = static_cast<unsigned int>(
294  p.colorMode->recolorizeByCoordinate.value());
295  ASSERT_(coordIdx < 3);
296 
297  float min = bb.min[coordIdx], max = bb.max[coordIdx];
298 
299  if (hasToAutoFindBB &&
300  p.colorMode->autoBoundingBoxOutliersPercentile.has_value())
301  {
302  const float confidenceInterval =
303  *p.colorMode->autoBoundingBoxOutliersPercentile;
304 
305  // handle planar maps (avoids error in histogram below):
306  for (int i = 0; i < 3; i++)
307  if (bb.max[i] == bb.min[i]) bb.max[i] = bb.min[i] + 0.1f;
308 
309  // Use a histogram to discard outliers from the colormap extremes:
310  constexpr size_t nBins = 100;
311  // for x,y,z
312  std::array<mrpt::math::CHistogram, 3> hists = {
313  mrpt::math::CHistogram(bb.min.x, bb.max.x, nBins),
314  mrpt::math::CHistogram(bb.min.y, bb.max.y, nBins),
315  mrpt::math::CHistogram(bb.min.z, bb.max.z, nBins)};
316 
317  const auto lambdaVisitPoints =
318  [&hists](const mrpt::math::TPoint3Df& pt)
319  {
320  for (int i = 0; i < 3; i++) hists[i].add(pt[i]);
321  };
322 
323  for (size_t i = 0; i < pts->size(); i++)
324  {
325  mrpt::math::TPoint3Df pt;
326  pts->getPoint(i, pt.x, pt.y, pt.z);
327  lambdaVisitPoints(pt);
328  }
329 
330  // Analyze the histograms and get confidence intervals:
331  std::vector<double> coords;
332  std::vector<double> hits;
333 
334  hists[coordIdx].getHistogramNormalized(coords, hits);
335  mrpt::math::confidenceIntervalsFromHistogram(
336  coords, hits, min, max, confidenceInterval);
337 
338  } // end compute outlier limits
339 
340  const float coordMin = p.colorMode->colorMapMinCoord.has_value()
341  ? *p.colorMode->colorMapMinCoord
342  : min;
343 
344  const float coordMax = p.colorMode->colorMapMaxCoord.has_value()
345  ? *p.colorMode->colorMapMaxCoord
346  : max;
347 
348  glPts->recolorizeByCoordinate(
349  coordMin, coordMax, coordIdx, p.colorMode->colorMap);
350 
351  o.insert(glPts);
352  }
353  else
354  {
355  // uniform color point cloud:
356  auto glPts = mrpt::opengl::CPointCloud::Create();
357  glPts->loadFromPointsMap(pts.get());
358 
359  glPts->setPointSize(p.pointSize);
360  glPts->setColor_u8(p.color);
361 
362  o.insert(glPts);
363  }
364 }
365 
367 {
368  return layers.empty() && lines.empty() && planes.empty();
369 }
370 void metric_map_t::clear() { *this = metric_map_t(); }
371 
372 // TODO(JLBC): Write unit test for mergeWith()
373 
375  const metric_map_t& otherPc,
376  const std::optional<mrpt::math::TPose3D>& otherRelativePose)
377 {
378  mrpt::poses::CPose3D pose;
379  if (otherRelativePose.has_value())
380  pose = mrpt::poses::CPose3D(otherRelativePose.value());
381 
382  // Lines:
383  if (otherRelativePose.has_value())
384  {
385  std::transform(
386  otherPc.lines.begin(), otherPc.lines.end(),
387  std::back_inserter(lines),
388  [&](const mrpt::math::TLine3D& l)
389  {
390  return mrpt::math::TLine3D::FromPointAndDirector(
391  pose.composePoint(l.pBase),
392  pose.rotateVector(l.getDirectorVector()));
393  });
394  }
395  else
396  {
397  std::copy(
398  otherPc.lines.begin(), otherPc.lines.end(),
399  std::back_inserter(lines));
400  }
401 
402  // Planes:
403  if (otherRelativePose.has_value())
404  {
405  std::transform(
406  otherPc.planes.begin(), otherPc.planes.end(),
407  std::back_inserter(planes),
408  [&](const plane_patch_t& l)
409  {
410  plane_patch_t g;
411  g.centroid = pose.composePoint(l.centroid);
412 
413  // TODO(JLBC): Finish rotating planes
414  // ...
415  THROW_EXCEPTION("To-do");
416  return g;
417  });
418  }
419  else
420  {
421  std::copy(
422  otherPc.planes.begin(), otherPc.planes.end(),
423  std::back_inserter(planes));
424  }
425 
426  // Points:
427  for (const auto& layer : otherPc.layers)
428  {
429  const auto& name = layer.first;
430  const auto& otherMap = layer.second;
431 
432  // New layer?
433  if (layers.count(name) == 0)
434  {
435  // Make a copy and transform (if applicable):
436  layers[name] = std::dynamic_pointer_cast<mrpt::maps::CMetricMap>(
437  otherMap->duplicateGetSmartPtr());
438 
439  if (otherRelativePose.has_value())
440  {
441  if (auto pts =
442  std::dynamic_pointer_cast<mrpt::maps::CPointsMap>(
443  layers[name]);
444  pts)
445  {
446  // Transform:
447  pts->changeCoordinatesReference(pose);
448  }
449  else
450  {
451  THROW_EXCEPTION(
452  "Merging with SE(3) transform only available for "
453  "metric maps of point cloud types.");
454  }
455  }
456  }
457  else
458  {
459  // merge with existing layer:
460  if (auto pts = std::dynamic_pointer_cast<mrpt::maps::CPointsMap>(
461  layers[name]);
462  pts)
463  {
464  pts->insertAnotherMap(
465  std::dynamic_pointer_cast<mrpt::maps::CPointsMap>(otherMap)
466  .get(),
467  pose);
468  }
469  else
470  {
471  THROW_EXCEPTION(
472  "Merging with SE(3) transform only available for "
473  "metric maps of point cloud types.");
474  }
475  }
476  }
477 }
478 
479 size_t metric_map_t::size() const
480 {
481  size_t n = 0;
482 
483  n += lines.size();
484  n += planes.size();
485  n += size_points_only();
486 
487  return n;
488 }
490 {
491  size_t n = 0;
492  for (const auto& layer : layers)
493  {
494  if (auto pts =
495  std::dynamic_pointer_cast<mrpt::maps::CPointsMap>(layer.second);
496  pts)
497  {
498  n += pts->size();
499  }
500  }
501  return n;
502 }
503 
505 {
506  using namespace std::string_literals;
507 
508  std::string ret;
509 
510  if (id) ret += "id="s + std::to_string(*id) + " "s;
511  if (label) ret += "label='"s + *label + "' "s;
512 
513  if (georeferencing)
514  ret += "georeferenced: lat="s +
515  georeferencing->geo_coord.lat.getAsString() + " lon="s +
516  georeferencing->geo_coord.lon.getAsString() + " h="s +
517  std::to_string(georeferencing->geo_coord.height) +
518  " T_enu_map="s + georeferencing->T_enu_to_map.asString();
519 
520  if (empty()) return {ret + "empty"s};
521 
522  const auto retAppend = [&ret](const std::string& s)
523  {
524  if (!ret.empty()) ret += ", "s;
525  ret += s;
526  };
527 
528  if (!lines.empty()) retAppend(std::to_string(lines.size()) + " lines"s);
529  if (!planes.empty()) retAppend(std::to_string(planes.size()) + " planes"s);
530 
531  size_t nPts = 0, nVoxels = 0;
532  bool otherLayers = false;
533  for (const auto& layer : layers)
534  {
535  ASSERT_(layer.second);
536  if (auto pts =
537  std::dynamic_pointer_cast<mrpt::maps::CPointsMap>(layer.second);
538  pts)
539  {
540  nPts += pts->size();
541  }
542  else if (auto vxs = std::dynamic_pointer_cast<mrpt::maps::CVoxelMap>(
543  layer.second);
544  vxs)
545  {
546  nVoxels += vxs->grid().activeCellsCount();
547  }
548  else
549  otherLayers = true;
550  }
551 
552  if (nPts != 0 || nVoxels != 0 || otherLayers)
553  {
554  retAppend(
555  mrpt::system::unitsFormat(static_cast<double>(nPts), 2, false) +
556  " points, "s +
557  mrpt::system::unitsFormat(static_cast<double>(nVoxels), 2, false) +
558  " voxels in "s + std::to_string(layers.size()) + " layers ("s);
559 
560  for (const auto& layer : layers)
561  {
562  ret +=
563  "\""s + layer.first + "\":"s + layer.second->asString() + " "s;
564  }
565  ret += ")";
566  }
567 
568  return ret;
569 }
570 
571 bool metric_map_t::save_to_file(const std::string& fileName) const
572 {
573  auto f = mrpt::io::CFileGZOutputStream(fileName);
574  if (!f.is_open()) return false;
575 
576  auto arch = mrpt::serialization::archiveFrom(f);
577  arch << *this;
578 
579  return true;
580 }
581 
583 {
584  auto f = mrpt::io::CFileGZInputStream(fileName);
585  if (!f.is_open()) return false;
586 
587  auto arch = mrpt::serialization::archiveFrom(f);
588  arch >> *this;
589 
590  return true;
591 }
592 
594 {
595  try
596  {
597  return shared_from_this();
598  }
599  catch (const std::bad_weak_ptr&)
600  {
601  // Not created as a shared_ptr.
602  return {};
603  }
604 }
605 
607 {
608  Ptr ret = get_shared_from_this();
609  if (!ret) ret = std::make_shared<metric_map_t>(*this);
610  return ret;
611 }
612 
613 metric_map_t::ConstPtr metric_map_t::get_shared_from_this() const
614 {
615  try
616  {
617  return shared_from_this();
618  }
619  catch (const std::bad_weak_ptr&)
620  {
621  // Not created as a shared_ptr.
622  return {};
623  }
624 }
625 
626 metric_map_t::ConstPtr metric_map_t::get_shared_from_this_or_clone() const
627 {
628  ConstPtr ret = get_shared_from_this();
629  if (!ret) ret = std::make_shared<metric_map_t>(*this);
630  return ret;
631 }
632 
633 mrpt::maps::CPointsMap::Ptr metric_map_t::point_layer(
634  const layer_name_t& name) const
635 {
636  auto it = layers.find(name);
637  if (it == layers.end())
638  THROW_EXCEPTION_FMT("Layer '%s' does not exist.", name.c_str());
639 
640  const auto& ptr = it->second;
641  if (!ptr) return {}; // empty shared_ptr.
642 
643  auto ret = std::dynamic_pointer_cast<mrpt::maps::CPointsMap>(ptr);
644  if (!ret)
645  THROW_EXCEPTION_FMT(
646  "Layer '%s' is not a point cloud (actual class:'%s').",
647  name.c_str(), ptr->GetRuntimeClass()->className);
648 
649  return ret;
650 }
651 
652 const mrpt::maps::CPointsMap* mp2p_icp::MapToPointsMap(
653  const mrpt::maps::CMetricMap& map)
654 {
655  if (auto ptsMap = dynamic_cast<const mrpt::maps::CPointsMap*>(&map); ptsMap)
656  {
657  return ptsMap;
658  }
659  if (auto voxelMap = dynamic_cast<const mrpt::maps::CVoxelMap*>(&map);
660  voxelMap)
661  {
662  return voxelMap->getOccupiedVoxels().get();
663  }
664  if (auto voxelRGBMap = dynamic_cast<const mrpt::maps::CVoxelMapRGB*>(&map);
665  voxelRGBMap)
666  {
667  return voxelRGBMap->getOccupiedVoxels().get();
668  }
669  return {};
670 }
671 
672 mrpt::maps::CPointsMap* mp2p_icp::MapToPointsMap(mrpt::maps::CMetricMap& map)
673 {
674  if (auto ptsMap = dynamic_cast<mrpt::maps::CPointsMap*>(&map); ptsMap)
675  {
676  return ptsMap;
677  }
678  if (auto voxelMap = dynamic_cast<mrpt::maps::CVoxelMap*>(&map); voxelMap)
679  {
680  return voxelMap->getOccupiedVoxels().get();
681  }
682  if (auto voxelRGBMap = dynamic_cast<mrpt::maps::CVoxelMapRGB*>(&map);
683  voxelRGBMap)
684  {
685  return voxelRGBMap->getOccupiedVoxels().get();
686  }
687  return {};
688 }
689 
690 const mrpt::maps::NearestNeighborsCapable* mp2p_icp::MapToNN(
691  const mrpt::maps::CMetricMap& map, bool throwIfNotImplemented)
692 {
693  const auto* ptr =
694  dynamic_cast<const mrpt::maps::NearestNeighborsCapable*>(&map);
695 
696  if (ptr) return ptr;
697  if (!throwIfNotImplemented) return nullptr;
698 
699  THROW_EXCEPTION_FMT(
700  "The map of type '%s' does not implement the expected interface "
701  "mrpt::maps::NearestNeighborsCapable",
702  map.GetRuntimeClass()->className);
703 }
min
int min(int a, int b)
mp2p_icp
Definition: covariance.h:17
mp2p_icp::metric_map_t::empty
virtual bool empty() const
Definition: metricmap.cpp:366
mp2p_icp::metric_map_t::get_visualization_map_layer
static void get_visualization_map_layer(mrpt::opengl::CSetOfObjects &o, const render_params_point_layer_t &p, const mrpt::maps::CMetricMap::Ptr &map)
Definition: metricmap.cpp:215
s
XmlRpcServer s
mp2p_icp::render_params_point_layer_t::render_voxelmaps_as_points
bool render_voxelmaps_as_points
Definition: render_params.h:139
kitti-run-seq.f
string f
Definition: kitti-run-seq.py:12
mp2p_icp::render_params_point_layer_t
Definition: render_params.h:124
mp2p_icp::layer_name_t
std::string layer_name_t
Definition: layer_name_t.h:22
mp2p_icp::render_params_planes_t::visible
bool visible
Definition: render_params.h:36
mp2p_icp::metric_map_t::save_to_file
bool save_to_file(const std::string &fileName) const
Definition: metricmap.cpp:571
mp2p_icp::metric_map_t::get_visualization_points
void get_visualization_points(mrpt::opengl::CSetOfObjects &o, const render_params_points_t &p) const
Definition: metricmap.cpp:181
mp2p_icp::metric_map_t::derivedSerializeTo
virtual void derivedSerializeTo([[maybe_unused]] mrpt::serialization::CArchive &out) const
Definition: metricmap.h:221
mp2p_icp::metric_map_t::clear
virtual void clear()
Definition: metricmap.cpp:370
mp2p_icp::render_params_planes_t
Definition: render_params.h:32
testing::internal::string
::std::string string
Definition: gtest.h:1979
mp2p_icp::render_params_lines_t::length
double length
all lines with same length
Definition: render_params.h:59
mp2p_icp::metric_map_t::label
std::optional< std::string > label
Definition: metricmap.h:96
mp2p_icp::render_params_planes_t::halfWidth
double halfWidth
Definition: render_params.h:37
kitti-batch-convert.out
string out
Definition: kitti-batch-convert.py:7
mp2p_icp::metric_map_t::derivedSerializeFrom
virtual void derivedSerializeFrom([[maybe_unused]] mrpt::serialization::CArchive &in)
Definition: metricmap.h:227
mp2p_icp::render_params_point_layer_t::render_voxelmaps_free_space
bool render_voxelmaps_free_space
Definition: render_params.h:140
mp2p_icp::render_params_lines_t
Definition: render_params.h:53
mp2p_icp::render_params_points_t::allLayers
render_params_point_layer_t allLayers
Definition: render_params.h:166
mp2p_icp::metric_map_t::planes
std::vector< plane_patch_t > planes
Definition: metricmap.h:81
mp2p_icp::render_params_point_layer_t::color
mrpt::img::TColor color
Definition: render_params.h:133
mp2p_icp::render_params_point_layer_t::pointSize
float pointSize
Definition: render_params.h:130
mp2p_icp::MapToPointsMap
const mrpt::maps::CPointsMap * MapToPointsMap(const mrpt::maps::CMetricMap &map)
Definition: metricmap.cpp:652
mp2p_icp::render_params_planes_t::gridSpacing
double gridSpacing
Definition: render_params.h:38
mp2p_icp::metric_map_t::lines
std::vector< mrpt::math::TLine3D > lines
Definition: metricmap.h:78
mp2p_icp::metric_map_t::point_layer
mrpt::maps::CPointsMap::Ptr point_layer(const layer_name_t &name) const
Definition: metricmap.cpp:633
mp2p_icp::metric_map_t::merge_with
virtual void merge_with(const metric_map_t &otherPc, const std::optional< mrpt::math::TPose3D > &otherRelativePose=std::nullopt)
Definition: metricmap.cpp:374
mp2p_icp::metric_map_t::contents_summary
virtual std::string contents_summary() const
Definition: metricmap.cpp:504
mp2p_icp::render_params_t
Definition: render_params.h:184
mp2p_icp::metric_map_t::size
virtual size_t size() const
Definition: metricmap.cpp:479
mp2p_icp::metric_map_t::get_visualization
virtual auto get_visualization(const render_params_t &p=render_params_t()) const -> std::shared_ptr< mrpt::opengl::CSetOfObjects >
Definition: metricmap.cpp:125
mp2p_icp::metric_map_t::get_visualization_lines
void get_visualization_lines(mrpt::opengl::CSetOfObjects &o, const render_params_lines_t &p) const
Definition: metricmap.cpp:161
mp2p_icp::metric_map_t::load_from_file
bool load_from_file(const std::string &fileName)
Definition: metricmap.cpp:582
mp2p_icp::render_params_points_t::perLayer
std::map< layer_name_t, render_params_point_layer_t > perLayer
Definition: render_params.h:170
add
bool add(const actionlib::TwoIntsGoal &req, actionlib::TwoIntsResult &res)
mp2p_icp::plane_patch_t
Definition: plane_patch.h:22
PointMatcherSupport::get
const M::mapped_type & get(const M &m, const typename M::key_type &k)
Definition: Bibliography.cpp:57
mp2p_icp::render_params_points_t
Definition: render_params.h:156
mp2p_icp::render_params_point_layer_t::colorMode
std::optional< color_mode_t > colorMode
Definition: render_params.h:137
mp2p_icp::render_params_lines_t::color
mrpt::img::TColor color
Definition: render_params.h:58
boost::posix_time
metricmap.h
Generic representation of pointcloud(s) and/or extracted features.
mp2p_icp::metric_map_t
Generic container of pointcloud(s), extracted features and other maps.
Definition: metricmap.h:48
mp2p_icp::metric_map_t::get_visualization_planes
void get_visualization_planes(mrpt::opengl::CSetOfObjects &o, const render_params_planes_t &p) const
Definition: metricmap.cpp:139
mp2p_icp::metric_map_t::georeferencing
std::optional< Georeferencing > georeferencing
Definition: metricmap.h:116
mp2p_icp::metric_map_t::get_shared_from_this
Ptr get_shared_from_this()
Definition: metricmap.cpp:593
mp2p_icp::metric_map_t::size_points_only
virtual size_t size_points_only() const
Definition: metricmap.cpp:489
IMPLEMENTS_MRPT_OBJECT
IMPLEMENTS_MRPT_OBJECT(metric_map_t, mrpt::serialization::CSerializable, mp2p_icp) using namespace mp2p_icp
mp2p_icp::render_params_planes_t::color
mrpt::img::TColor color
Definition: render_params.h:39
mp2p_icp::metric_map_t::get_shared_from_this_or_clone
Ptr get_shared_from_this_or_clone()
Definition: metricmap.cpp:606
mp2p_icp::MapToNN
const mrpt::maps::NearestNeighborsCapable * MapToNN(const mrpt::maps::CMetricMap &map, bool throwIfNotImplemented)
Definition: metricmap.cpp:690
mp2p_icp::metric_map_t::layers
std::map< layer_name_t, mrpt::maps::CMetricMap::Ptr > layers
Definition: metricmap.h:75
mp2p_icp::render_params_points_t::visible
bool visible
Definition: render_params.h:162


mp2p_icp
Author(s): Jose-Luis Blanco-Claraco
autogenerated on Wed Jun 26 2024 02:47:09