28 #include <Eigen/Geometry>
30 #include <pcl/PointIndices.h>
31 #include <pcl/common/transforms.h>
32 #include <pcl/correspondence.h>
33 #include <pcl/point_cloud.h>
34 #include <pcl/point_types.h>
35 #include <pcl/registration/correspondence_rejection_distance.h>
36 #include <pcl/registration/correspondence_rejection_median_distance.h>
37 #include <pcl/registration/correspondence_rejection_var_trimmed.h>
38 #include <pcl/registration/default_convergence_criteria.h>
39 #include <pcl/registration/transformation_estimation_2D.h>
66 inline Eigen::Vector3f
69 return Eigen::Vector3f{pt.x, pt.y, pt.z};
72 template <
typename Po
intT = pcl::Po
intXYZ>
92 if (inputCloud->empty())
124 auto& tmpCloud = tmpCloudWithPrior;
126 pcl::transformPointCloud(*inputCloud, *tmpCloud, result.
transform);
129 pcl::PointIndices cloudIndices;
133 std::back_inserter(cloudIndices.indices),
134 [](
const auto&
c) { return c.index_query; });
137 pcl::computeCovarianceMatrix(*tmpCloud, cloudIndices, covarianceMatrix);
139 return covarianceMatrix.block<2, 2>(0, 0);
143 alignStep(
const Eigen::Isometry3f& prior, pcl::Correspondences& correspondences)
145 correspondences.clear();
146 correspondences.reserve(inputCloud->size());
149 pcl::transformPointCloud(*inputCloud, *tmpCloudWithPrior, prior);
151 *tmpCloudProjected = *tmpCloudWithPrior;
156 ARMARX_INFO << tmpCloudProjected->size() <<
" correspondences";
159 for (
size_t i = 0; i < tmpCloudProjected->size(); i++)
161 const auto& ptWithPrior = tmpCloudWithPrior->points.at(i);
162 const auto& ptProjected = tmpCloudProjected->points.at(i);
166 const int qi =
static_cast<int>(i);
167 correspondences.emplace_back(qi, qi,
distance);
170 ARMARX_CHECK(inputCloud->size() == tmpCloudProjected->size());
175 pcl::registration::CorrespondenceRejectorDistance correspondenceCalculator;
176 correspondenceCalculator.setMaximumDistance(.1);
178 pcl::Correspondences remainingCorrespondences;
180 correspondenceCalculator.setInputSource<
PointT>(tmpCloudWithPrior);
181 correspondenceCalculator.setInputTarget<
PointT>(tmpCloudProjected);
182 correspondenceCalculator.getRemainingCorrespondences(correspondences,
183 remainingCorrespondences);
185 const std::size_t nCorrespondencesBefore = correspondences.size();
186 const std::size_t nCorrespondencesAfter = remainingCorrespondences.size();
188 ARMARX_INFO <<
"Rejected " << (nCorrespondencesBefore - nCorrespondencesAfter)
192 correspondences = remainingCorrespondences;
196 estimator.estimateRigidTransformation(
197 *inputCloud, *tmpCloudProjected, correspondences, localTrafo.matrix());
204 const wykobi::Model model;
206 typename pcl::PointCloud<PointT>::ConstPtr inputCloud;
207 typename pcl::PointCloud<PointT>::Ptr tmpCloudWithPrior;
208 typename pcl::PointCloud<PointT>::Ptr tmpCloudProjected;
210 typename pcl::registration::DefaultConvergenceCriteria<float>::Ptr convergenceCriteria;
212 pcl::registration::TransformationEstimation2D<PointT, PointT> estimator;