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; });
136 Eigen::Matrix3f covarianceMatrix;
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;
195 Eigen::Isometry3f localTrafo = Eigen::Isometry3f::Identity();
196 estimator.estimateRigidTransformation(
197 *inputCloud, *tmpCloudProjected, correspondences, localTrafo.matrix());