MapRegistration.h
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @author Fabian Reister ( fabian dot reister at kit dot edu )
17  * @date 2021
18  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
19  * GNU General Public License
20  */
21 
22 #pragma once
23 
24 #include <array>
25 #include <cmath>
26 #include <cstdint>
27 #include <filesystem>
28 #include <memory>
29 #include <vector>
30 
31 #include <Eigen/Geometry>
32 
33 #include <pcl/point_cloud.h>
34 #include <pcl/point_types.h>
35 
36 #include <SimoxUtility/shapes/OrientedBox.h>
37 
39 #include <ArmarXCore/interface/serialization/Eigen/Eigen_fdi.h>
40 
42 
44 
45 #include "../InterpolatingTimeQueue.h"
46 #include "models.h"
47 
48 namespace cartographer::mapping
49 {
50  class MapBuilderInterface;
51 }
52 
54 {
55 
56  struct TimeRange
57  {
60 
62  duration() const noexcept
63  {
64  return max - min;
65  }
66  };
67 
68  struct RotatedRect
69  {
70  Eigen::Vector2f center;
71  float angle;
72  Eigen::Vector2f extends;
73 
74  std::array<Eigen::Vector2f, 4>
75  boundary() const
76  {
77  const Eigen::Affine2f centerPose =
78  Eigen::Translation2f(center) * Eigen::Rotation2Df(angle);
79 
80  const Eigen::Vector2f e2 = extends / 2.F;
81 
82  return {centerPose * Eigen::Vector2f{e2.x(), e2.y()},
83  centerPose * Eigen::Vector2f{-e2.x(), e2.y()},
84  centerPose * Eigen::Vector2f{-e2.x(), -e2.y()},
85  centerPose * Eigen::Vector2f{e2.x(), -e2.y()}};
86  }
87 
88  Eigen::Isometry3f
89  cornerPose(int i) const
90  {
91  const float cornerAngle = angle + (i - 2) * M_PI_2f32;
92 
93  Eigen::Isometry3f ref_T_corner = Eigen::Isometry3f::Identity();
94  ref_T_corner.translation().template head<2>() = boundary().at(i);
95  ref_T_corner.linear() =
96  Eigen::AngleAxisf(cornerAngle, Eigen::Vector3f::UnitZ()).toRotationMatrix();
97 
98  return ref_T_corner;
99  }
100  };
101 
103  {
104  public:
105  MapRegistration(std::unique_ptr<::cartographer::mapping::MapBuilderInterface> mapBuilder);
106 
108 
109  using Point = pcl::PointXYZ;
110  using PointCloud = pcl::PointCloud<Point>;
111 
112  struct Cluster
113  {
114  PointCloud::Ptr points;
115 
116  pcl::PointXYZ centroid;
117 
118  Cluster(const PointCloud::Ptr& points);
119  };
120 
121  using Clusters = std::vector<Cluster>;
122 
123  Clusters detectClusters(const PointCloud::ConstPtr& cloud) const;
124 
126  {
127  Eigen::Affine2f pose;
129  };
130 
131  // PointCloud::ConstPtr readPointClouds() const;
132 
133  struct Association
134  {
137  };
138 
139  using Associations = std::vector<Association>;
140 
141  Associations matchModelsToClusters(const std::vector<wykobi::Model>& models,
142  const Clusters& clusters,
143  const Eigen::Isometry3f& world_T_map) const;
144 
146  {
147  Eigen::Isometry3f correction;
148 
149  // fraction of points that support the hypothesis
150  float weight;
151 
152  // covariance of the point-projection distance / vectors
154  };
155 
158 
160  const Cluster& cluster,
161  const Eigen::Isometry3f& world_T_map) const;
162 
164  computeCombinedCorrection(const std::vector<wykobi::Model>& models,
165  const std::vector<ModelCorrection>& modelCorrections) const;
166 
167  void visualizeResult(const PointCloud::ConstPtr& cloud,
168  const std::vector<wykobi::Model>& models,
169  const ModelCorrection& combinedCorrection) const;
170 
171  TimeRange mapTimeRange() const;
172 
173  simox::math::InterpolatingTimeQueue<simox::math::PoseStamped> robotPoseQueue() const;
174 
175  std::vector<Eigen::Isometry3f> robotPoses() const;
176 
177  void computeBoundingBox(const PointCloud::ConstPtr& cloud);
178 
179  const RotatedRect&
181  {
182  return boundingBox;
183  }
184 
185  private:
186  std::unique_ptr<::cartographer::mapping::MapBuilderInterface> mapBuilder;
187 
188  const OptimizedGraphData optimizedGraphData;
189 
190  RotatedRect boundingBox;
191  };
192 
193 } // namespace armarx::localization_and_mapping::cartographer_adapter
armarx::wykobi::Model
Definition: models.h:32
armarx::localization_and_mapping::cartographer_adapter::RotatedRect::cornerPose
Eigen::Isometry3f cornerPose(int i) const
Definition: MapRegistration.h:89
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Association
Definition: MapRegistration.h:133
armarx::localization_and_mapping::cartographer_adapter::RotatedRect::extends
Eigen::Vector2f extends
Definition: MapRegistration.h:72
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::ModelCorrection
Definition: MapRegistration.h:145
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Cluster::Cluster
Cluster(const PointCloud::Ptr &points)
Definition: MapRegistration.cpp:422
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::ModelCorrection::covariance
Eigen::Matrix2f covariance
Definition: MapRegistration.h:153
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Cluster
Definition: MapRegistration.h:112
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::getBoundingBox
const RotatedRect & getBoundingBox() const
Definition: MapRegistration.h:180
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Clusters
std::vector< Cluster > Clusters
Definition: MapRegistration.h:121
armarx::localization_and_mapping::cartographer_adapter::TimeRange::duration
IceUtil::Time duration() const noexcept
Definition: MapRegistration.h:62
armarx::localization_and_mapping::cartographer_adapter::TimeRange
Definition: MapRegistration.h:56
armarx::localization_and_mapping::cartographer_adapter::TimeRange::max
IceUtil::Time max
Definition: MapRegistration.h:59
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Association::model
const wykobi::Model model
Definition: MapRegistration.h:136
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::~MapRegistration
~MapRegistration()
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::LocalPointCloud::pointCloud
PointCloud pointCloud
Definition: MapRegistration.h:128
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::matchModelsToClusters
Associations matchModelsToClusters(const std::vector< wykobi::Model > &models, const Clusters &clusters, const Eigen::Isometry3f &world_T_map) const
Definition: MapRegistration.cpp:212
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::detectClusters
Clusters detectClusters(const PointCloud::ConstPtr &cloud) const
Definition: MapRegistration.cpp:134
armarx::localization_and_mapping::cartographer_adapter::OptimizedGraphData
Definition: types.h:128
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::MapRegistration
MapRegistration(std::unique_ptr<::cartographer::mapping::MapBuilderInterface > mapBuilder)
Definition: MapRegistration.cpp:107
GfxTL::Identity
void Identity(MatrixXX< N, N, T > *a)
Definition: MatrixXX.h:570
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::computeCombinedCorrection
ModelCorrection computeCombinedCorrection(const std::vector< wykobi::Model > &models, const std::vector< ModelCorrection > &modelCorrections) const
Definition: MapRegistration.cpp:273
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::ModelCorrection::correction
Eigen::Isometry3f correction
Definition: MapRegistration.h:147
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Cluster::centroid
pcl::PointXYZ centroid
Definition: MapRegistration.h:116
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::ModelCorrection::weight
float weight
Definition: MapRegistration.h:150
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Cluster::points
PointCloud::Ptr points
Definition: MapRegistration.h:114
GfxTL::Matrix2f
MatrixXX< 2, 2, float > Matrix2f
Definition: MatrixXX.h:648
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::alignModelToCluster
ModelCorrection alignModelToCluster(const wykobi::Model &model, const Cluster &cluster, const Eigen::Isometry3f &world_T_map) const
Definition: MapRegistration.cpp:229
armarx::localization_and_mapping::cartographer_adapter::TimeRange::min
IceUtil::Time min
Definition: MapRegistration.h:58
Point
Definition: PointCloud.h:21
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::LocalPointCloud
Definition: MapRegistration.h:125
cartographer::mapping
Definition: ArVizDrawer.h:40
armarx::localization_and_mapping::cartographer_adapter
This file is part of ArmarX.
Definition: ApproximateTimeQueue.cpp:15
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Associations
std::vector< Association > Associations
Definition: MapRegistration.h:139
armarx::localization_and_mapping::cartographer_adapter::RotatedRect::boundary
std::array< Eigen::Vector2f, 4 > boundary() const
Definition: MapRegistration.h:75
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::localization_and_mapping::cartographer_adapter::MapRegistration
Definition: MapRegistration.h:102
armarx::localization_and_mapping::cartographer_adapter::RotatedRect
Definition: MapRegistration.h:68
models.h
ExpressionException.h
PointCloud
Definition: PointCloud.h:85
armarx::localization_and_mapping::cartographer_adapter::RotatedRect::center
Eigen::Vector2f center
Definition: MapRegistration.h:70
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::computeBoundingBox
void computeBoundingBox(const PointCloud::ConstPtr &cloud)
Definition: MapRegistration.cpp:406
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::robotPoseQueue
simox::math::InterpolatingTimeQueue< simox::math::PoseStamped > robotPoseQueue() const
Definition: MapRegistration.cpp:117
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::Association::cluster
const Cluster cluster
Definition: MapRegistration.h:135
Time.h
types.h
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::visualizeResult
void visualizeResult(const PointCloud::ConstPtr &cloud, const std::vector< wykobi::Model > &models, const ModelCorrection &combinedCorrection) const
Definition: MapRegistration.cpp:340
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::robotPoses
std::vector< Eigen::Isometry3f > robotPoses() const
Definition: MapRegistration.cpp:378
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::mapTimeRange
TimeRange mapTimeRange() const
Definition: MapRegistration.cpp:369
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::computeCorrection
MapRegistration::ModelCorrection computeCorrection(const MapRegistration::Associations &associations)
Definition: MapRegistration.cpp:249
armarx::localization_and_mapping::cartographer_adapter::RotatedRect::angle
float angle
Definition: MapRegistration.h:71
armarx::localization_and_mapping::cartographer_adapter::MapRegistration::LocalPointCloud::pose
Eigen::Affine2f pose
Definition: MapRegistration.h:127