FilterByRange.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  * ------------------------------------------------------------------------- */
15 #include <mrpt/containers/yaml.h>
16 #include <mrpt/math/TPoint3D.h>
17 
20 
21 using namespace mp2p_icp_filters;
22 
24  const mrpt::containers::yaml& c, FilterByRange& parent)
25 {
26  MCP_LOAD_REQ(c, input_pointcloud_layer);
27  MCP_LOAD_OPT(c, output_layer_between);
28  MCP_LOAD_OPT(c, output_layer_outside);
31 
32  ASSERTMSG_(
33  !output_layer_between.empty() || !output_layer_outside.empty(),
34  "At least one 'output_layer_between' or "
35  "'output_layer_outside' must be provided.");
36 
37  if (c.has("center"))
38  {
39  ASSERT_(
40  c["center"].isSequence() && c["center"].asSequence().size() == 3);
41 
42  auto cc = c["center"].asSequence();
43 
44  for (int i = 0; i < 3; i++)
46  cc.at(i).as<std::string>(), center[i]);
47  }
48 }
49 
51 {
52  mrpt::system::COutputLogger::setLoggerName("FilterByRange");
53 }
54 
55 void FilterByRange::initialize(const mrpt::containers::yaml& c)
56 {
57  MRPT_START
58 
59  MRPT_LOG_DEBUG_STREAM("Loading these params:\n" << c);
60  params_.load_from_yaml(c, *this);
61 
62  MRPT_END
63 }
64 
66 {
67  MRPT_START
68 
70 
71  // In:
72  const auto pcPtr = inOut.point_layer(params_.input_pointcloud_layer);
73  ASSERTMSG_(
74  pcPtr, mrpt::format(
75  "Input point cloud layer '%s' was not found.",
77 
78  const auto& pc = *pcPtr;
79 
80  // Create if new: Append to existing layer, if already existed.
81  mrpt::maps::CPointsMap::Ptr outBetween = GetOrCreatePointLayer(
82  inOut, params_.output_layer_between, true /*allow empty for nullptr*/,
83  /* create cloud of the same type */
84  pcPtr->GetRuntimeClass()->className);
85 
86  if (outBetween) outBetween->reserve(outBetween->size() + pc.size() / 10);
87 
88  // Optional output layer for deleted points:
89  mrpt::maps::CPointsMap::Ptr outOutside = GetOrCreatePointLayer(
90  inOut, params_.output_layer_outside, true /*allow empty for nullptr*/,
91  /* create cloud of the same type */
92  pcPtr->GetRuntimeClass()->className);
93 
94  if (outOutside) outOutside->reserve(outOutside->size() + pc.size() / 10);
95 
96  const auto& xs = pc.getPointsBufferRef_x();
97  const auto& ys = pc.getPointsBufferRef_y();
98  const auto& zs = pc.getPointsBufferRef_z();
99 
100  const float sqrMin = mrpt::square(params_.range_min);
101  const float sqrMax = mrpt::square(params_.range_max);
102 
103  for (size_t i = 0; i < xs.size(); i++)
104  {
105  const float sqrNorm =
106  (mrpt::math::TPoint3Df(xs[i], ys[i], zs[i]) - params_.center)
107  .sqrNorm();
108 
109  const bool isInside = sqrNorm >= sqrMin && sqrNorm <= sqrMax;
110 
111  auto* targetPc = isInside ? outBetween.get() : outOutside.get();
112 
113  if (targetPc) targetPc->insertPointFrom(pc, i);
114  }
115 
116  MRPT_END
117 }
mp2p_icp::Parameterizable::checkAllParametersAreRealized
void checkAllParametersAreRealized() const
Definition: Parameterizable.cpp:138
mp2p_icp_filters::FilterByRange::Parameters::center
mrpt::math::TPoint3Df center
Definition: FilterByRange.h:76
mp2p_icp_filters::FilterByRange::Parameters::range_max
float range_max
Definition: FilterByRange.h:66
mp2p_icp_filters::FilterByRange::Parameters::input_pointcloud_layer
std::string input_pointcloud_layer
Definition: FilterByRange.h:47
mp2p_icp_filters::FilterByRange::FilterByRange
FilterByRange()
Definition: FilterByRange.cpp:50
testing::internal::string
::std::string string
Definition: gtest.h:1979
mp2p_icp_filters::FilterByRange::Parameters::range_min
float range_min
Definition: FilterByRange.h:65
mp2p_icp_filters::FilterByRange
Definition: FilterByRange.h:30
IMPLEMENTS_MRPT_OBJECT
IMPLEMENTS_MRPT_OBJECT(FilterByRange, mp2p_icp_filters::FilterBase, mp2p_icp_filters) using namespace mp2p_icp_filters
mp2p_icp_filters::FilterByRange::Parameters::output_layer_outside
std::string output_layer_outside
Definition: FilterByRange.h:56
FilterByRange.h
Leaves or removes points by min/max range from the origin.
mp2p_icp_filters::FilterByRange::Parameters::load_from_yaml
void load_from_yaml(const mrpt::containers::yaml &c, FilterByRange &parent)
Definition: FilterByRange.cpp:23
DECLARE_PARAMETER_IN_REQ
#define DECLARE_PARAMETER_IN_REQ(__yaml, __variable, __object)
Definition: Parameterizable.h:167
mp2p_icp_filters::FilterBase
Definition: FilterBase.h:46
mp2p_icp::metric_map_t::point_layer
mrpt::maps::CPointsMap::Ptr point_layer(const layer_name_t &name) const
Definition: metricmap.cpp:629
mp2p_icp_filters::FilterByRange::params_
Parameters params_
Definition: FilterByRange.h:80
mp2p_icp_filters::GetOrCreatePointLayer
mrpt::maps::CPointsMap::Ptr GetOrCreatePointLayer(mp2p_icp::metric_map_t &m, const std::string &layerName, bool allowEmptyName=true, const std::string &classForLayerCreation="mrpt::maps::CSimplePointsMap")
Definition: GetOrCreatePointLayer.cpp:15
mp2p_icp_filters::FilterByRange::initialize
void initialize(const mrpt::containers::yaml &c) override
Definition: FilterByRange.cpp:55
mp2p_icp::Parameterizable::parseAndDeclareParameter
void parseAndDeclareParameter(const std::string &value, double &target)
Definition: Parameterizable.cpp:120
GetOrCreatePointLayer.h
Auxiliary function GetOrCreatePointLayer.
mp2p_icp::metric_map_t
Generic container of pointcloud(s), extracted features and other maps.
Definition: metricmap.h:49
mp2p_icp_filters::FilterByRange::Parameters::output_layer_between
std::string output_layer_between
Definition: FilterByRange.h:52
mp2p_icp_filters
Definition: FilterAdjustTimestamps.h:19
mp2p_icp_filters::FilterByRange::filter
void filter(mp2p_icp::metric_map_t &inOut) const override
Definition: FilterByRange.cpp:65


mp2p_icp
Author(s):
autogenerated on Thu Oct 17 2024 02:45:33