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


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