40 #ifndef PCL_REGISTRATION_DEFAULT_CONVERGENCE_CRITERIA_HPP_
41 #define PCL_REGISTRATION_DEFAULT_CONVERGENCE_CRITERIA_HPP_
43 #include <pcl/console/print.h>
46 template <
typename Scalar>
bool
49 convergence_state_ = CONVERGENCE_CRITERIA_NOT_CONVERGED;
51 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Iteration %d out of %d.\n", iterations_, max_iterations_);
53 if (iterations_ >= max_iterations_)
55 if (failure_after_max_iter_)
58 convergence_state_ = CONVERGENCE_CRITERIA_ITERATIONS;
63 double cos_angle = 0.5 * (transformation_.coeff (0, 0) + transformation_.coeff (1, 1) + transformation_.coeff (2, 2) - 1);
64 double translation_sqr = transformation_.coeff (0, 3) * transformation_.coeff (0, 3) +
65 transformation_.coeff (1, 3) * transformation_.coeff (1, 3) +
66 transformation_.coeff (2, 3) * transformation_.coeff (2, 3);
67 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Current transformation gave %f rotation (cosine) and %f translation.\n", cos_angle, translation_sqr);
69 if (cos_angle >= rotation_threshold_ && translation_sqr <= translation_threshold_)
71 if (iterations_similar_transforms_ < max_iterations_similar_transforms_)
74 ++iterations_similar_transforms_;
79 iterations_similar_transforms_ = 0;
80 convergence_state_ = CONVERGENCE_CRITERIA_TRANSFORM;
85 correspondences_cur_mse_ = calculateMSE (correspondences_);
86 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Previous / Current MSE for correspondences distances is: %f / %f.\n", correspondences_prev_mse_, correspondences_cur_mse_);
90 if (fabs (correspondences_cur_mse_ - correspondences_prev_mse_) < mse_threshold_absolute_)
92 if (iterations_similar_transforms_ < max_iterations_similar_transforms_)
95 ++iterations_similar_transforms_;
100 iterations_similar_transforms_ = 0;
101 convergence_state_ = CONVERGENCE_CRITERIA_ABS_MSE;
107 if (fabs (correspondences_cur_mse_ - correspondences_prev_mse_) / correspondences_prev_mse_ < mse_threshold_relative_)
109 if (iterations_similar_transforms_ < max_iterations_similar_transforms_)
112 ++iterations_similar_transforms_;
117 iterations_similar_transforms_ = 0;
118 convergence_state_ = CONVERGENCE_CRITERIA_REL_MSE;
123 correspondences_prev_mse_ = correspondences_cur_mse_;
128 #endif // PCL_REGISTRATION_DEFAULT_CONVERGENCE_CRITERIA_HPP_
virtual bool hasConverged()
Check if convergence has been reached.