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 
22 
23 using namespace mp2p_icp_filters;
24 
26  const mrpt::containers::yaml& c, FilterMerge& parent)
27 {
28  MCP_LOAD_REQ(c, input_pointcloud_layer);
29  MCP_LOAD_REQ(c, target_layer);
30  MCP_LOAD_OPT(c, input_layer_in_local_coordinates);
31 
32  if (c.has("robot_pose"))
33  {
34  ASSERT_(
35  c["robot_pose"].isSequence() &&
36  c["robot_pose"].asSequence().size() == 6);
37 
38  auto cc = c["robot_pose"].asSequence();
39 
40  for (int i = 0; i < 6; i++)
42  cc.at(i).as<std::string>(), robot_pose[i]);
43  }
44 }
45 
47 {
48  mrpt::system::COutputLogger::setLoggerName("FilterMerge");
49 }
50 
51 void FilterMerge::initialize(const mrpt::containers::yaml& c)
52 {
53  MRPT_START
54 
55  MRPT_LOG_DEBUG_STREAM("Loading these params:\n" << c);
56  params_.load_from_yaml(c, *this);
57 
58  MRPT_END
59 }
60 
62 {
63  MRPT_START
64 
66 
67  // In:
68  ASSERTMSG_(
69  inOut.layers.count(params_.input_pointcloud_layer) != 0,
70  mrpt::format(
71  "Input layer '%s' not found.",
73 
74  const auto mapPtr = inOut.layers.at(params_.input_pointcloud_layer);
75  ASSERT_(mapPtr);
76 
77  const auto pcPtr = mp2p_icp::MapToPointsMap(*mapPtr);
78  ASSERTMSG_(
79  pcPtr, mrpt::format(
80  "Input point cloud layer '%s' could not be converted into a "
81  "point cloud (class='%s')",
83  mapPtr->GetRuntimeClass()->className));
84 
85  // Out:
86  ASSERT_(!params_.target_layer.empty());
87  ASSERTMSG_(
88  inOut.layers.count(params_.target_layer) != 0,
89  mrpt::format(
90  "Target map layer '%s' not found.", params_.target_layer.c_str()));
91 
92  mrpt::maps::CMetricMap::Ptr out = inOut.layers.at(params_.target_layer);
93 
94  // Create fake observation for insertion:
95  mrpt::obs::CObservationPointCloud obs;
96  auto pts = mrpt::maps::CSimplePointsMap::Create();
97  obs.pointcloud = pts;
98 
99  // Copy the input layer here, as seen from the robot (hence the "-"):
100  const auto robotPose = mrpt::poses::CPose3D(params_.robot_pose);
101 
103  {
104  pts->insertAnotherMap(pcPtr, mrpt::poses::CPose3D::Identity());
105  }
106  else
107  {
108  const auto invRobotPose = -robotPose;
109  pts->insertAnotherMap(pcPtr, invRobotPose);
110  }
111 
112  // Merge into map:
113  out->insertObservation(obs, robotPose);
114 
115  MRPT_END
116 }
mp2p_icp::Parameterizable::checkAllParametersAreRealized
void checkAllParametersAreRealized() const
Definition: Parameterizable.cpp:138
mp2p_icp_filters::FilterMerge::Parameters::target_layer
std::string target_layer
Definition: FilterMerge.h:62
mp2p_icp_filters::FilterMerge::initialize
void initialize(const mrpt::containers::yaml &c) override
Definition: FilterMerge.cpp:51
IMPLEMENTS_MRPT_OBJECT
IMPLEMENTS_MRPT_OBJECT(FilterMerge, mp2p_icp_filters::FilterBase, mp2p_icp_filters) using namespace mp2p_icp_filters
mp2p_icp_filters::FilterMerge
Definition: FilterMerge.h:44
mp2p_icp_filters::FilterMerge::FilterMerge
FilterMerge()
Definition: FilterMerge.cpp:46
mp2p_icp_filters::FilterMerge::filter
void filter(mp2p_icp::metric_map_t &inOut) const override
Definition: FilterMerge.cpp:61
testing::internal::string
::std::string string
Definition: gtest.h:1979
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:74
mp2p_icp::MapToPointsMap
const mrpt::maps::CPointsMap * MapToPointsMap(const mrpt::maps::CMetricMap &map)
Definition: metricmap.cpp:648
mp2p_icp_filters::FilterBase
Definition: FilterBase.h:46
mp2p_icp_filters::FilterMerge::Parameters::input_pointcloud_layer
std::string input_pointcloud_layer
Definition: FilterMerge.h:61
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:49
mp2p_icp_filters::FilterMerge::Parameters::load_from_yaml
void load_from_yaml(const mrpt::containers::yaml &c, FilterMerge &parent)
Definition: FilterMerge.cpp:25
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:76
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:65
mp2p_icp_filters::FilterMerge::params_
Parameters params_
Definition: FilterMerge.h:78


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