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 if (convergence_state_ != CONVERGENCE_CRITERIA_NOT_CONVERGED)
52 iterations_similar_transforms_ = 0;
53 convergence_state_ = CONVERGENCE_CRITERIA_NOT_CONVERGED;
56 bool is_similar =
false;
58 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Iteration %d out of %d.\n", iterations_, max_iterations_);
60 if (iterations_ >= max_iterations_)
62 if (!failure_after_max_iter_)
64 convergence_state_ = CONVERGENCE_CRITERIA_ITERATIONS;
67 convergence_state_ = CONVERGENCE_CRITERIA_FAILURE_AFTER_MAX_ITERATIONS;
71 double cos_angle = 0.5 * (transformation_.coeff (0, 0) + transformation_.coeff (1, 1) + transformation_.coeff (2, 2) - 1);
72 double translation_sqr = transformation_.coeff (0, 3) * transformation_.coeff (0, 3) +
73 transformation_.coeff (1, 3) * transformation_.coeff (1, 3) +
74 transformation_.coeff (2, 3) * transformation_.coeff (2, 3);
75 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Current transformation gave %f rotation (cosine) and %f translation.\n", cos_angle, translation_sqr);
77 if (cos_angle >= rotation_threshold_ && translation_sqr <= translation_threshold_)
79 if (iterations_similar_transforms_ >= max_iterations_similar_transforms_)
81 convergence_state_ = CONVERGENCE_CRITERIA_TRANSFORM;
87 correspondences_cur_mse_ = calculateMSE (correspondences_);
88 PCL_DEBUG (
"[pcl::DefaultConvergenceCriteria::hasConverged] Previous / Current MSE for correspondences distances is: %f / %f.\n", correspondences_prev_mse_, correspondences_cur_mse_);
92 if (std::abs (correspondences_cur_mse_ - correspondences_prev_mse_) < mse_threshold_absolute_)
94 if (iterations_similar_transforms_ >= max_iterations_similar_transforms_)
96 convergence_state_ = CONVERGENCE_CRITERIA_ABS_MSE;
103 if (std::abs (correspondences_cur_mse_ - correspondences_prev_mse_) / correspondences_prev_mse_ < mse_threshold_relative_)
105 if (iterations_similar_transforms_ >= max_iterations_similar_transforms_)
107 convergence_state_ = CONVERGENCE_CRITERIA_REL_MSE;
116 ++iterations_similar_transforms_;
121 iterations_similar_transforms_ = 0;
124 correspondences_prev_mse_ = correspondences_cur_mse_;
129 #endif // PCL_REGISTRATION_DEFAULT_CONVERGENCE_CRITERIA_HPP_