Skip to content

Commit acbb76d

Browse files
committed
Use DefaultConvergenceCriteria per larshg review
- Remove ConvergenceTrigger enum and getLastConvergenceTrigger() (larshg's test code, not needed for production) - Replace FRICP's own matrix delta check with DefaultConvergenceCriteria - Move delta_transform calculation after Anderson acceleration step - Use CONVERGENCE_CRITERIA_NO_CORRESPONDENCES on error paths - Populate correspondences_ so getFitnessScore() works
1 parent eb78352 commit acbb76d

2 files changed

Lines changed: 14 additions & 51 deletions

File tree

registration/include/pcl/registration/fricp.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,6 @@ class FastRobustIterativeClosestPoint
7272
using typename Base::PointCloudTarget;
7373

7474
enum class RobustFunction { NONE, WELSCH };
75-
enum class ConvergenceTrigger {
76-
NONE = 0,
77-
DEFAULT_CRITERIA,
78-
FRICP_STOP_THRESHOLD,
79-
ITERATION_LIMIT,
80-
NO_CORRESPONDENCES
81-
};
8275

8376
FastRobustIterativeClosestPoint();
8477

@@ -136,9 +129,6 @@ class FastRobustIterativeClosestPoint
136129
void
137130
setDynamicWelschDecay(double ratio);
138131

139-
[[nodiscard]] ConvergenceTrigger
140-
getLastConvergenceTrigger() const;
141-
142132
protected:
143133
void
144134
computeTransformation(PointCloudSource& output, const Matrix4& guess) override;
@@ -194,7 +184,6 @@ class FastRobustIterativeClosestPoint
194184
double nu_begin_ratio_ = 3.0;
195185
double nu_end_ratio_ = 1.0 / (3.0 * std::sqrt(3.0));
196186
double nu_decay_ratio_ = 0.5;
197-
ConvergenceTrigger last_convergence_trigger_ = ConvergenceTrigger::NONE;
198187

199188
static constexpr double same_threshold_ = 1e-6;
200189

registration/include/pcl/registration/impl/fricp.hpp

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -112,24 +112,13 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
112112
nu_decay_ratio_ = 0.5;
113113
}
114114

115-
template <typename PointSource, typename PointTarget, typename Scalar>
116-
typename FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
117-
ConvergenceTrigger
118-
FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
119-
getLastConvergenceTrigger() const
120-
{
121-
return last_convergence_trigger_;
122-
}
123-
124115
template <typename PointSource, typename PointTarget, typename Scalar>
125116
void
126117
FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
127118
computeTransformation(PointCloudSource& output, const Matrix4& guess)
128119
{
129120
pcl::IterativeClosestPoint<PointSource, PointTarget, Scalar>::initComputeReciprocal();
130121

131-
last_convergence_trigger_ = ConvergenceTrigger::NONE;
132-
133122
auto convergence_criteria = this->getConvergeCriteria();
134123
if (convergence_criteria) {
135124
convergence_criteria->setMaximumIterations(this->max_iterations_);
@@ -145,14 +134,22 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
145134
}
146135

147136
if (!this->input_ || !this->target_) {
148-
last_convergence_trigger_ = ConvergenceTrigger::NO_CORRESPONDENCES;
137+
if (convergence_criteria) {
138+
convergence_criteria->setConvergenceState(
139+
pcl::registration::DefaultConvergenceCriteria<
140+
Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
141+
}
149142
PCL_ERROR("[pcl::%s::computeTransformation] Invalid input clouds.\n",
150143
this->getClassName().c_str());
151144
return;
152145
}
153146

154147
if (this->input_->empty() || this->target_->empty()) {
155-
last_convergence_trigger_ = ConvergenceTrigger::NO_CORRESPONDENCES;
148+
if (convergence_criteria) {
149+
convergence_criteria->setConvergenceState(
150+
pcl::registration::DefaultConvergenceCriteria<
151+
Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
152+
}
156153
PCL_ERROR("[pcl::%s::computeTransformation] Empty input point clouds.\n",
157154
this->getClassName().c_str());
158155
return;
@@ -176,7 +173,6 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
176173
pcl::registration::DefaultConvergenceCriteria<
177174
Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
178175
}
179-
last_convergence_trigger_ = ConvergenceTrigger::NO_CORRESPONDENCES;
180176
return;
181177
}
182178

@@ -192,7 +188,6 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
192188
pcl::registration::DefaultConvergenceCriteria<
193189
Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
194190
}
195-
last_convergence_trigger_ = ConvergenceTrigger::NO_CORRESPONDENCES;
196191
return;
197192
}
198193

@@ -248,7 +243,6 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
248243
pcl::registration::DefaultConvergenceCriteria<
249244
Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
250245
}
251-
last_convergence_trigger_ = ConvergenceTrigger::NO_CORRESPONDENCES;
252246
return;
253247
}
254248

@@ -266,10 +260,6 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
266260
nu_current = std::max(nu_begin_ratio_ * residual_med, nu_limit);
267261
}
268262

269-
const double stop_threshold = (this->transformation_epsilon_ > 0)
270-
? static_cast<double>(this->transformation_epsilon_)
271-
: 1e-6;
272-
273263
this->nr_iterations_ = 0;
274264
this->converged_ = false;
275265

@@ -309,7 +299,6 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
309299
pcl::registration::DefaultConvergenceCriteria<
310300
Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
311301
}
312-
last_convergence_trigger_ = ConvergenceTrigger::NO_CORRESPONDENCES;
313302
return;
314303
}
315304
energy = use_welsch ? computeEnergy(residuals, nu_current) : residuals.sum();
@@ -327,16 +316,16 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
327316
svd_transform = candidate;
328317
transform_centered = candidate;
329318

330-
const Matrix4d delta_transform =
331-
transform_centered * previous_transform.inverse();
332-
this->transformation_ = delta_transform.template cast<Scalar>();
333-
334319
if (use_anderson_) {
335320
const Matrix4d log_matrix = matrixLog(transform_centered);
336321
const Eigen::VectorXd& accelerated = anderson_.compute(log_matrix.data());
337322
transform_centered = Eigen::Map<const Matrix4d>(accelerated.data()).exp();
338323
}
339324

325+
const Matrix4d delta_transform =
326+
transform_centered * previous_transform.inverse();
327+
this->transformation_ = delta_transform.template cast<Scalar>();
328+
340329
if (!updateCorrespondences(transform_centered,
341330
source_mat,
342331
target_mat,
@@ -352,28 +341,14 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
352341
pcl::registration::DefaultConvergenceCriteria<
353342
Scalar>::CONVERGENCE_CRITERIA_NO_CORRESPONDENCES);
354343
}
355-
last_convergence_trigger_ = ConvergenceTrigger::NO_CORRESPONDENCES;
356344
return;
357345
}
358346

359-
const double delta = (transform_centered - previous_transform).norm();
360347
previous_transform = transform_centered;
361348
++this->nr_iterations_;
362349

363350
if (convergence_criteria && static_cast<bool>(*convergence_criteria)) {
364351
converged = true;
365-
last_convergence_trigger_ = ConvergenceTrigger::DEFAULT_CRITERIA;
366-
break;
367-
}
368-
369-
if (delta < stop_threshold) {
370-
converged = true;
371-
if (convergence_criteria) {
372-
convergence_criteria->setConvergenceState(
373-
pcl::registration::DefaultConvergenceCriteria<
374-
Scalar>::CONVERGENCE_CRITERIA_TRANSFORM);
375-
}
376-
last_convergence_trigger_ = ConvergenceTrigger::FRICP_STOP_THRESHOLD;
377352
break;
378353
}
379354
}
@@ -399,7 +374,6 @@ FastRobustIterativeClosestPoint<PointSource, PointTarget, Scalar>::
399374
convergence_criteria->setConvergenceState(
400375
pcl::registration::DefaultConvergenceCriteria<
401376
Scalar>::CONVERGENCE_CRITERIA_ITERATIONS);
402-
last_convergence_trigger_ = ConvergenceTrigger::ITERATION_LIMIT;
403377
}
404378

405379
const Matrix4d final_transform =

0 commit comments

Comments
 (0)