40 using namespace Eigen;
58 const T w_sum_inv =
T(1.)/w.sum();
60 (mPts.
reading.
features.topRows(dimCount-1).array().rowwise() * w.array().transpose()).rowwise().sum() * w_sum_inv;
61 const Vector meanReference =
62 (mPts.
reference.
features.topRows(dimCount-1).array().rowwise() * w.array().transpose()).rowwise().sum() * w_sum_inv;
69 const T sigma = mPts.
reading.
features.topRows(dimCount-1).colwise().squaredNorm().cwiseProduct(w.transpose()).sum();
74 const JacobiSVD<Matrix> svd(m, ComputeThinU | ComputeThinV);
75 Matrix rotMatrix(svd.matrixU() * svd.matrixV().transpose());
76 typedef typename JacobiSVD<Matrix>::SingularValuesType SingularValuesType;
77 SingularValuesType singularValues = svd.singularValues();
82 if (rotMatrix.determinant() < 0.)
84 Matrix tmpV = svd.matrixV().transpose();
85 tmpV.row(dimCount-2) *= -1.;
86 rotMatrix = svd.matrixU() * tmpV;
87 singularValues(dimCount-2) *= -1.;
89 T scale = singularValues.sum() / sigma;
90 if (sigma < 0.0001) scale =
T(1);
91 const Vector trVector(meanReference - scale * rotMatrix * meanReading);
93 Matrix result(Matrix::Identity(dimCount, dimCount));
94 result.topLeftCorner(dimCount-1, dimCount-1) = scale * rotMatrix;
95 result.topRightCorner(dimCount-1, 1) = trVector;
107 assert(matches.
ids.rows() > 0);
121 const int nbPoints = this->lastErrorElements.reading.features.cols();
122 const int dim = this->lastErrorElements.reading.features.rows();
125 throw std::runtime_error(
"Error, last error element empty. Error minimizer needs to be called at least once before using this method.");
128 if (!this->lastErrorElements.reading.descriptorExists(
"simpleSensorNoise"))
130 LOG_INFO_STREAM(
"PointToPointSimilarityErrorMinimizer - warning, no sensor noise found. Using best estimate given outlier rejection instead.");
131 return this->getWeightedPointUsedRatio();
134 const BOOST_AUTO(noises, this->lastErrorElements.reading.getDescriptorViewByName(
"simpleSensorNoise"));
136 const Vector dists = (this->lastErrorElements.reading.features.topRows(dim-1) - this->lastErrorElements.reference.features.topRows(dim-1)).colwise().norm();
137 const T mean = dists.sum()/nbPoints;
140 for(
int i=0; i < nbPoints; i++)
142 if(dists(i) < (mean + noises(0,i)))
148 return (
T)count/(
T)nbPoints;
#define LOG_INFO_STREAM(args)
virtual T getResidualError(const DataPoints &filteredReading, const DataPoints &filteredReference, const OutlierWeights &outlierWeights, const Matches &matches) const
If not redefined by child class, return max value for T.
virtual T getOverlap() const
If not redefined by child class, return the ratio of how many points were used (with weight) for erro...
A structure holding data ready for minimization. The data are "normalized", for instance there are no...
DataPoints reference
reference point cloud
OutlierWeights weights
weights for every association
Result of the data-association step (Matcher::findClosests), before outlier rejection.
static T computeResidualError(const ErrorElements &mPts)
PointMatcher< T >::Matrix Matrix
virtual TransformationParameters compute(const ErrorElements &mPts)
Find the transformation that minimizes the error given matched pair of points. This function most be ...
PointMatcher< T >::OutlierWeights OutlierWeights
PointMatcher< T >::Vector Vector
Ids ids
identifiers of closest points
Matrix features
features of points in the cloud
DataPoints reading
reading point cloud
Matrix TransformationParameters
A matrix holding the parameters a transformation.