40 #ifndef PCL_REGISTRATION_DEFAULT_CONVERGENCE_CRITERIA_HPP_
41 #define PCL_REGISTRATION_DEFAULT_CONVERGENCE_CRITERIA_HPP_
43 #include <pcl/console/print.h>
49 namespace registration
52 template <
typename Scalar>
bool
55 if (convergence_state_ != CONVERGENCE_CRITERIA_NOT_CONVERGED)
58 iterations_similar_transforms_ = 0;
59 convergence_state_ = CONVERGENCE_CRITERIA_NOT_CONVERGED;
62 bool is_similar =
false;
64 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Iteration %d out of %d.\n", iterations_, max_iterations_);
66 if (iterations_ >= max_iterations_)
68 if (!failure_after_max_iter_)
70 convergence_state_ = CONVERGENCE_CRITERIA_ITERATIONS;
73 convergence_state_ = CONVERGENCE_CRITERIA_FAILURE_AFTER_MAX_ITERATIONS;
77 double cos_angle = 0.5 * (transformation_.coeff (0, 0) + transformation_.coeff (1, 1) + transformation_.coeff (2, 2) - 1);
78 double translation_sqr = transformation_.coeff (0, 3) * transformation_.coeff (0, 3) +
79 transformation_.coeff (1, 3) * transformation_.coeff (1, 3) +
80 transformation_.coeff (2, 3) * transformation_.coeff (2, 3);
81 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Current transformation gave %f rotation (cosine) and %f translation.\n", cos_angle, translation_sqr);
83 if (cos_angle >= rotation_threshold_ && translation_sqr <= translation_threshold_)
85 if (iterations_similar_transforms_ >= max_iterations_similar_transforms_)
87 convergence_state_ = CONVERGENCE_CRITERIA_TRANSFORM;
93 correspondences_cur_mse_ = calculateMSE (correspondences_);
94 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Previous / Current MSE for correspondences distances is: %f / %f.\n", correspondences_prev_mse_, correspondences_cur_mse_);
98 if (std::abs (correspondences_cur_mse_ - correspondences_prev_mse_) < mse_threshold_absolute_)
100 if (iterations_similar_transforms_ >= max_iterations_similar_transforms_)
102 convergence_state_ = CONVERGENCE_CRITERIA_ABS_MSE;
109 if (std::abs (correspondences_cur_mse_ - correspondences_prev_mse_) / correspondences_prev_mse_ < mse_threshold_relative_)
111 if (iterations_similar_transforms_ >= max_iterations_similar_transforms_)
113 convergence_state_ = CONVERGENCE_CRITERIA_REL_MSE;
122 ++iterations_similar_transforms_;
127 iterations_similar_transforms_ = 0;
130 correspondences_prev_mse_ = correspondences_cur_mse_;
bool hasConverged() override
Check if convergence has been reached.