FilterMerge.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/maps/CSimplePointsMap.h>
17 #include <mrpt/math/TPose3D.h>
18 #include <mrpt/obs/CObservationPointCloud.h>
19 
21 
22 using namespace mp2p_icp_filters;
23 
24 void FilterMerge::Parameters::load_from_yaml(const mrpt::containers::yaml& c, FilterMerge& parent)
25 {
26  MCP_LOAD_REQ(c, input_pointcloud_layer);
27  MCP_LOAD_REQ(c, target_layer);
28  MCP_LOAD_OPT(c, input_layer_in_local_coordinates);
29 
30  if (c.has("robot_pose"))
31  {
32  ASSERT_(c["robot_pose"].isSequence() && c["robot_pose"].asSequence().size() == 6);
33 
34  auto cc = c["robot_pose"].asSequence();
35 
36  for (int i = 0; i < 6; i++)
37  parent.parseAndDeclareParameter(cc.at(i).as<std::string>(), robot_pose[i]);
38  }
39 }
40 
41 FilterMerge::FilterMerge() { mrpt::system::COutputLogger::setLoggerName("FilterMerge"); }
42 
43 void FilterMerge::initialize(const mrpt::containers::yaml& c)
44 {
45  MRPT_START
46 
47  MRPT_LOG_DEBUG_STREAM("Loading these params:\n" << c);
48  params_.load_from_yaml(c, *this);
49 
50  MRPT_END
51 }
52 
54 {
55  MRPT_START
56 
58 
59  // In:
60  ASSERTMSG_(
61  inOut.layers.count(params_.input_pointcloud_layer) != 0,
62  mrpt::format("Input layer '%s' not found.", params_.input_pointcloud_layer.c_str()));
63 
64  const auto mapPtr = inOut.layers.at(params_.input_pointcloud_layer);
65  ASSERT_(mapPtr);
66 
67  const auto pcPtr = mp2p_icp::MapToPointsMap(*mapPtr);
68  ASSERTMSG_(
69  pcPtr, mrpt::format(
70  "Input point cloud layer '%s' could not be converted into a "
71  "point cloud (class='%s')",
72  params_.input_pointcloud_layer.c_str(), mapPtr->GetRuntimeClass()->className));
73 
74  // Out:
75  ASSERT_(!params_.target_layer.empty());
76  ASSERTMSG_(
77  inOut.layers.count(params_.target_layer) != 0,
78  mrpt::format("Target map layer '%s' not found.", params_.target_layer.c_str()));
79 
80  mrpt::maps::CMetricMap::Ptr out = inOut.layers.at(params_.target_layer);
81 
82  // Create fake observation for insertion:
83  mrpt::obs::CObservationPointCloud obs;
84  auto pts = mrpt::maps::CSimplePointsMap::Create();
85  obs.pointcloud = pts;
86 
87  // Copy the input layer here, as seen from the robot (hence the "-"):
88  const auto robotPose = mrpt::poses::CPose3D(params_.robot_pose);
89 
91  {
92  pts->insertAnotherMap(pcPtr, mrpt::poses::CPose3D::Identity());
93  }
94  else
95  {
96  const auto invRobotPose = -robotPose;
97  pts->insertAnotherMap(pcPtr, invRobotPose);
98  }
99 
100  // Merge into map:
101  out->insertObservation(obs, robotPose);
102 
103  MRPT_END
104 }
mp2p_icp::Parameterizable::checkAllParametersAreRealized
void checkAllParametersAreRealized() const
Definition: Parameterizable.cpp:135
mp2p_icp_filters::FilterMerge::Parameters::target_layer
std::string target_layer
Definition: FilterMerge.h:61
mp2p_icp_filters::FilterMerge::initialize
void initialize(const mrpt::containers::yaml &c) override
Definition: FilterMerge.cpp:43
mp2p_icp_filters::FilterMerge
Definition: FilterMerge.h:44
mp2p_icp_filters::FilterMerge::FilterMerge
FilterMerge()
Definition: FilterMerge.cpp:41
mp2p_icp_filters::FilterMerge::filter
void filter(mp2p_icp::metric_map_t &inOut) const override
Definition: FilterMerge.cpp:53
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
kitti-batch-convert.out
string out
Definition: kitti-batch-convert.py:7
mp2p_icp_filters::FilterMerge::Parameters::robot_pose
mrpt::math::TPose3D robot_pose
Definition: FilterMerge.h:73
mp2p_icp::MapToPointsMap
const mrpt::maps::CPointsMap * MapToPointsMap(const mrpt::maps::CMetricMap &map)
Definition: metricmap.cpp:624
mp2p_icp_filters::FilterBase
Definition: FilterBase.h:46
mp2p_icp_filters::FilterMerge::Parameters::input_pointcloud_layer
std::string input_pointcloud_layer
Definition: FilterMerge.h:60
mp2p_icp::Parameterizable::parseAndDeclareParameter
void parseAndDeclareParameter(const std::string &value, double &target)
Definition: Parameterizable.cpp:120
mp2p_icp::metric_map_t
Generic container of pointcloud(s), extracted features and other maps.
Definition: metricmap.h:55
mp2p_icp_filters::FilterMerge::Parameters::load_from_yaml
void load_from_yaml(const mrpt::containers::yaml &c, FilterMerge &parent)
Definition: FilterMerge.cpp:24
FilterMerge.h
Takes an input point cloud layer and inserts it into another one of arbitrary metric map type.
mp2p_icp::metric_map_t::layers
std::map< layer_name_t, mrpt::maps::CMetricMap::Ptr > layers
Definition: metricmap.h:82
mp2p_icp_filters
Definition: FilterAdjustTimestamps.h:19
mp2p_icp_filters::FilterMerge::Parameters::input_layer_in_local_coordinates
bool input_layer_in_local_coordinates
Definition: FilterMerge.h:64
mp2p_icp_filters::FilterMerge::params_
Parameters params_
Definition: FilterMerge.h:77


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