sm2mm.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  * ------------------------------------------------------------------------- */
16 #include <mp2p_icp_filters/sm2mm.h>
17 #include <mrpt/core/Clock.h>
18 #include <mrpt/system/progress.h>
19 #include <mrpt/version.h>
20 
21 #include <iostream>
22 
24  const mrpt::maps::CSimpleMap& sm, mp2p_icp::metric_map_t& mm,
25  const mrpt::containers::yaml& yamlData, const sm2mm_options_t& options)
26 {
27  mm.clear();
28 
29  // Generators:
31  if (yamlData.has("generators"))
32  {
33  generators =
34  mp2p_icp_filters::generators_from_yaml(yamlData["generators"], options.verbosity);
35  }
36  else
37  {
38  std::cout << "[sm2mm] Warning: no generators defined in the pipeline, "
39  "using default generator."
40  << std::endl;
41 
42  auto defaultGen = mp2p_icp_filters::Generator::Create();
43  defaultGen->setMinLoggingLevel(options.verbosity);
44  defaultGen->initialize({});
45  generators.push_back(defaultGen);
46  }
47 
48  // Filters:
50  if (yamlData.has("filters"))
51  {
52  filters =
53  mp2p_icp_filters::filter_pipeline_from_yaml(yamlData["filters"], options.verbosity);
54  }
55  else
56  {
57  std::cout << "[sm2mm] Warning: no filters defined in the pipeline." << std::endl;
58  }
59 
60  // Final, overall filters for the whole metric map:
62  if (yamlData.has("final_filters"))
63  {
65  yamlData["final_filters"], options.verbosity);
66  }
67 
68  // sm2mm core code:
69 
70  // Parameters for twist, and possibly other user-provided variables.
74 
75  // Default values for twist variables:
76  ps.updateVariables({{"vx", .0}, {"vy", .0}, {"vz", .0}, {"wx", .0}, {"wy", .0}, {"wz", .0}});
77  ps.updateVariables(
78  {{"robot_x", .0},
79  {"robot_y", .0},
80  {"robot_z", .0},
81  {"robot_yaw", .0},
82  {"robot_pitch", .0},
83  {"robot_roll", .0}});
84  ps.updateVariables(options.customVariables);
85  ps.realize();
86 
87  // progress bar:
88  if (options.showProgressBar) std::cout << "\n"; // Needed for the VT100 codes below.
89 
90  const double tStart = mrpt::Clock::nowDouble();
91 
92  size_t nKFs = sm.size();
93  if (options.end_index.has_value()) mrpt::keep_min(nKFs, *options.end_index + 1);
94 
95  size_t curKF = 0;
96  if (options.start_index.has_value()) mrpt::keep_max(curKF, *options.start_index);
97 
98  for (; curKF < nKFs; curKF++)
99  {
100 #if MRPT_VERSION >= 0x020b05
101  const auto& [pose, sf, twist] = sm.get(curKF);
102  if (twist.has_value())
103  {
104  ps.updateVariables(
105  {{"vx", twist->vx},
106  {"vy", twist->vy},
107  {"vz", twist->vz},
108  {"wx", twist->wx},
109  {"wy", twist->wy},
110  {"wz", twist->wz}});
111  }
112 #else
113  const auto& [pose, sf] = sm.get(curKF);
114 #endif
115  ASSERT_(pose);
116  ASSERT_(sf);
117  const mrpt::poses::CPose3D robotPose = pose->getMeanVal();
118 
119  // Update pose variables:
120  ps.updateVariables(
121  {{"robot_x", robotPose.x()},
122  {"robot_y", robotPose.y()},
123  {"robot_z", robotPose.z()},
124  {"robot_yaw", robotPose.yaw()},
125  {"robot_pitch", robotPose.pitch()},
126  {"robot_roll", robotPose.roll()}});
127  ps.realize();
128 
129  for (const auto& obs : *sf)
130  {
131  ASSERT_(obs);
132  obs->load();
133 
134  bool handled = mp2p_icp_filters::apply_generators(generators, *obs, mm, robotPose);
135 
136  if (!handled) continue;
137 
138  // process it:
140  obs->unload();
141  }
142 
143 #if 0
144  // sanity checks:
145  for (const auto& [name, map] : mm.layers)
146  {
147  const auto* pc = mp2p_icp::MapToPointsMap(*map);
148  if (!pc) continue; // not a point map
149  const bool sanityPassed = mp2p_icp::pointcloud_sanity_check(*pc);
150  ASSERTMSG_(
151  sanityPassed,
152  mrpt::format(
153  "Sanity check did not pass for layer: '%s'", name.c_str()));
154  }
155 #endif
156 
157  // progress bar:
158  if (options.showProgressBar)
159  {
160  const size_t N = nKFs;
161  const double pc = (1.0 * curKF) / N;
162 
163  const double tNow = mrpt::Clock::nowDouble();
164  const double ETA = pc > 0 ? (tNow - tStart) * (1.0 / pc - 1) : .0;
165  const double totalTime = ETA + (tNow - tStart);
166 
167  std::cout << "\033[A\33[2KT\r" // VT100 codes: cursor up and clear
168  // line
169  << mrpt::system::progress(pc, 30)
170  << mrpt::format(
171  " %6zu/%6zu (%.02f%%) ETA=%s / T=%s\n", curKF, N, 100 * pc,
172  mrpt::system::formatTimeInterval(ETA).c_str(),
173  mrpt::system::formatTimeInterval(totalTime).c_str());
174  std::cout.flush();
175  }
176  } // end for each KF.
177 
178  // Final optional filtering:
179  if (!finalFilters.empty())
180  {
181  std::cout << "Applying 'final_filters'..." << std::endl;
182 
183  mp2p_icp_filters::apply_filter_pipeline(finalFilters, mm);
184 
185  std::cout << "Done with 'final_filters'." << std::endl;
186  }
187 }
mp2p_icp::ParameterSource
Definition: Parameterizable.h:42
generators
static mp2p_icp_filters::GeneratorSet generators
Definition: apps/icp-run/main.cpp:130
mp2p_icp_filters::sm2mm_options_t::customVariables
std::vector< std::pair< std::string, double > > customVariables
Definition: sm2mm.h:37
mp2p_icp_filters::sm2mm_options_t::showProgressBar
bool showProgressBar
Definition: sm2mm.h:36
mp2p_icp_filters::apply_filter_pipeline
void apply_filter_pipeline(const FilterPipeline &filters, mp2p_icp::metric_map_t &inOut, const mrpt::optional_ref< mrpt::system::CTimeLogger > &profiler=std::nullopt)
Definition: FilterBase.cpp:24
mp2p_icp_filters::simplemap_to_metricmap
void simplemap_to_metricmap(const mrpt::maps::CSimpleMap &sm, mp2p_icp::metric_map_t &outMap, const mrpt::containers::yaml &pipeline, const sm2mm_options_t &options={})
Definition: sm2mm.cpp:23
mp2p_icp::metric_map_t::clear
virtual void clear()
Definition: metricmap.cpp:365
mp2p_icp::pointcloud_sanity_check
bool pointcloud_sanity_check(const mrpt::maps::CPointsMap &pc, bool printWarnings=true)
Definition: pointcloud_sanity_check.cpp:19
pointcloud_sanity_check.h
Checks for consistent length of field vectors.
mp2p_icp::ParameterSource::realize
void realize()
Definition: Parameterizable.cpp:37
Generator.h
Base virtual class for point cloud filters.
mp2p_icp_filters::sm2mm_options_t::verbosity
mrpt::system::VerbosityLevel verbosity
Definition: sm2mm.h:35
mp2p_icp_filters::filter_pipeline_from_yaml
FilterPipeline filter_pipeline_from_yaml(const mrpt::containers::yaml &c, const mrpt::system::VerbosityLevel &vLevel=mrpt::system::LVL_INFO)
Definition: FilterBase.cpp:39
mp2p_icp::MapToPointsMap
const mrpt::maps::CPointsMap * MapToPointsMap(const mrpt::maps::CMetricMap &map)
Definition: metricmap.cpp:624
mp2p_icp_filters::sm2mm_options_t
Options for simplemap_to_metricmap()
Definition: sm2mm.h:30
mp2p_icp_filters::FilterPipeline
std::vector< FilterBase::Ptr > FilterPipeline
Definition: FilterBase.h:75
mp2p_icp_filters::GeneratorSet
std::vector< Generator::Ptr > GeneratorSet
Definition: Generator.h:190
sm2mm.h
simplemap-to-metricmap utility function
FilterBase.h
Base virtual class for point cloud filters.
mp2p_icp::ParameterSource::updateVariables
void updateVariables(const std::vector< std::pair< std::string, double >> &nameValuePairs)
Definition: Parameterizable.h:54
mp2p_icp_filters::sm2mm_options_t::start_index
std::optional< size_t > start_index
Definition: sm2mm.h:38
mp2p_icp::metric_map_t
Generic container of pointcloud(s), extracted features and other maps.
Definition: metricmap.h:55
mp2p_icp_filters::apply_generators
bool apply_generators(const GeneratorSet &generators, const mrpt::obs::CObservation &obs, mp2p_icp::metric_map_t &output, const std::optional< mrpt::poses::CPose3D > &robotPose=std::nullopt)
Definition: Generator.cpp:242
mp2p_icp::AttachToParameterSource
void AttachToParameterSource(std::vector< std::shared_ptr< T >> &setObjects, ParameterSource &source)
Definition: Parameterizable.h:129
mp2p_icp::metric_map_t::layers
std::map< layer_name_t, mrpt::maps::CMetricMap::Ptr > layers
Definition: metricmap.h:82
mp2p_icp_filters::sm2mm_options_t::end_index
std::optional< size_t > end_index
Definition: sm2mm.h:39
mp2p_icp_filters::generators_from_yaml
GeneratorSet generators_from_yaml(const mrpt::containers::yaml &c, const mrpt::system::VerbosityLevel &vLevel=mrpt::system::LVL_INFO)
Definition: Generator.cpp:298


mp2p_icp
Author(s):
autogenerated on Mon May 26 2025 02:45:50