cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
base_fine_registration.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <memory>
5#include <vector>
6
7#include <cpp-toolbox/cpp-toolbox_export.hpp>
11
12#include <Eigen/Core>
13
14namespace toolbox::pcl
15{
16
29
37template<typename Derived, typename DataType>
38class CPP_TOOLBOX_EXPORT base_fine_registration_t
39{
40public:
42 using point_cloud_ptr = std::shared_ptr<point_cloud>;
43 using transformation_t = Eigen::Matrix<DataType, 4, 4>;
46 std::function<bool(const iteration_state_t<DataType>&)>;
49 virtual ~base_fine_registration_t() = default;
50
51 // 删除拷贝,允许移动
56
60 void set_source(const point_cloud_ptr& source)
61 {
62 m_source_cloud = source;
63 m_source_updated = true;
64 }
65
69 void set_target(const point_cloud_ptr& target)
70 {
71 m_target_cloud = target;
72 m_target_updated = true;
73 }
74
78 void set_max_iterations(std::size_t max_iterations)
79 {
80 m_max_iterations = max_iterations;
81 }
82
86 std::size_t get_max_iterations() const { return m_max_iterations; }
87
92 void set_transformation_epsilon(DataType epsilon)
93 {
94 m_transformation_epsilon = epsilon;
95 }
96
101 {
102 return m_transformation_epsilon;
103 }
104
108 void set_euclidean_fitness_epsilon(DataType epsilon)
109 {
110 m_euclidean_fitness_epsilon = epsilon;
111 }
112
117 {
118 return m_euclidean_fitness_epsilon;
119 }
120
124 void set_max_correspondence_distance(DataType distance)
125 {
126 m_max_correspondence_distance = distance;
127 }
128
133 {
134 return m_max_correspondence_distance;
135 }
136
140 void set_record_history(bool record) { m_record_history = record; }
141
145 bool get_record_history() const { return m_record_history; }
146
153 {
154 m_iteration_callback = callback;
155 }
156
161 {
162 return static_cast<const Derived*>(this)->get_correspondence_type_impl();
163 }
164
169 {
170 return m_source_cloud && !m_source_cloud->normals.empty()
171 && m_source_cloud->normals.size() == m_source_cloud->points.size();
172 }
173
178 {
179 return m_target_cloud && !m_target_cloud->normals.empty()
180 && m_target_cloud->normals.size() == m_target_cloud->points.size();
181 }
182
189 bool align(const transformation_t& initial_guess, result_type& result)
190 {
191 // 验证输入
192 if (!validate_input()) {
193 return false;
194 }
195
196 // 预处理(派生类可能需要构建数据结构)
197 if (m_source_updated || m_target_updated) {
198 static_cast<Derived*>(this)->preprocess_impl();
199 m_source_updated = false;
200 m_target_updated = false;
201 }
202
203 // 初始化结果
204 result.initial_transformation = initial_guess;
205 result.transformation = initial_guess;
206 result.converged = false;
207 result.iterations_performed = 0;
208 result.final_error = std::numeric_limits<DataType>::max();
209 result.termination_reason = "running";
210
211 if (m_record_history) {
212 result.history.clear();
213 result.history.reserve(m_max_iterations);
214 }
215
216 // 调用派生类的实现
217 return static_cast<Derived*>(this)->align_impl(initial_guess, result);
218 }
219
224 bool align(result_type& result)
225 {
226 return align(transformation_t::Identity(), result);
227 }
228
229protected:
233 bool validate_input() const
234 {
235 if (!m_source_cloud || !m_target_cloud) {
236 LOG_ERROR_S << "错误:源点云或目标点云未设置 / Error: Source or target "
237 "cloud not set";
238 return false;
239 }
240
241 if (m_source_cloud->empty() || m_target_cloud->empty()) {
242 LOG_ERROR_S << "错误:点云为空 / Error: Point cloud is empty";
243 return false;
244 }
245
246 // 验证参数
247 if (m_max_iterations == 0) {
248 LOG_ERROR_S << "错误:最大迭代次数为0 / Error: Maximum iterations is 0";
249 return false;
250 }
251
252 if (m_max_correspondence_distance <= 0) {
253 LOG_ERROR_S << "错误:最大对应距离必须为正数 / Error: Maximum "
254 "correspondence distance must be positive";
255 return false;
256 }
257
258 // 派生类的额外验证
259 return static_cast<const Derived*>(this)->validate_input_impl();
260 }
261
265 bool validate_input_impl() const { return true; }
266
270 bool has_converged(std::size_t iteration,
271 const transformation_t& current_transform,
272 const transformation_t& previous_transform,
273 DataType current_error,
274 DataType previous_error,
275 std::string& termination_reason) const
276 {
277 // 检查迭代次数
278 if (iteration >= m_max_iterations) {
279 termination_reason = "maximum iterations reached";
280 return true;
281 }
282
283 // 检查变换变化量(跳过第一次迭代)
284 if (iteration > 0) {
285 transformation_t delta_transform =
286 current_transform.inverse() * previous_transform;
287 DataType rotation_change =
288 delta_transform.template block<3, 3>(0, 0).eulerAngles(0, 1, 2).norm();
289 DataType translation_change =
290 delta_transform.template block<3, 1>(0, 3).norm();
291
292 if (rotation_change < m_transformation_epsilon
293 && translation_change < m_transformation_epsilon)
294 {
295 termination_reason = "transformation converged";
296 return true;
297 }
298 }
299
300 // 检查误差变化量
301 DataType error_change = std::abs(current_error - previous_error);
302 if (error_change < m_euclidean_fitness_epsilon) {
303 termination_reason = "error converged";
304 return true;
305 }
306
307 // 派生类可能有额外的收敛条件
308 return static_cast<const Derived*>(this)->has_converged_impl(
309 iteration,
310 current_transform,
311 previous_transform,
312 current_error,
313 previous_error,
314 termination_reason);
315 }
316
321 bool has_converged_impl(std::size_t,
322 const transformation_t&,
323 const transformation_t&,
324 DataType,
325 DataType,
326 std::string&) const
327 {
328 return false;
329 }
330
336
341 std::size_t iteration,
342 const transformation_t& transform,
343 DataType error,
344 DataType error_change,
345 std::size_t num_correspondences)
346 {
347 if (m_record_history) {
349 state.iteration = iteration;
350 state.transformation = transform;
351 state.error = error;
352 state.error_change = error_change;
353 state.num_correspondences = num_correspondences;
354 result.history.push_back(state);
355 }
356
357 // 调用回调函数
358 if (m_iteration_callback) {
360 state.iteration = iteration;
361 state.transformation = transform;
362 state.error = error;
363 state.error_change = error_change;
364 state.num_correspondences = num_correspondences;
365
366 if (!m_iteration_callback(state)) {
367 // 回调返回false,提前终止
368 result.termination_reason = "terminated by callback";
369 }
370 }
371 }
372
373 // 数据成员
376
377 // 参数(带默认值)
378 std::size_t m_max_iterations = 50;
379 DataType m_transformation_epsilon = static_cast<DataType>(1e-8);
380 DataType m_euclidean_fitness_epsilon = static_cast<DataType>(1e-6);
381 DataType m_max_correspondence_distance = static_cast<DataType>(0.05);
382
383 // 状态标志
384 bool m_source_updated = false;
385 bool m_target_updated = false;
386 bool m_record_history = false;
387
388 // 回调
390};
391
392} // namespace toolbox::pcl
细配准算法的基类(CRTP模式) / Base class for fine registration algorithms (CRTP pattern)
Definition base_fine_registration.hpp:39
DataType get_transformation_epsilon() const
获取变换epsilon / Get transformation epsilon
Definition base_fine_registration.hpp:100
base_fine_registration_t & operator=(const base_fine_registration_t &)=delete
void record_iteration(result_type &result, std::size_t iteration, const transformation_t &transform, DataType error, DataType error_change, std::size_t num_correspondences)
记录迭代状态 / Record iteration state
Definition base_fine_registration.hpp:340
bool has_converged_impl(std::size_t, const transformation_t &, const transformation_t &, DataType, DataType, std::string &) const
派生类的额外收敛检查 / Additional convergence check for derived class
Definition base_fine_registration.hpp:321
bool has_source_normals() const
检查源点云是否有法线 / Check if source cloud has normals
Definition base_fine_registration.hpp:168
void set_iteration_callback(iteration_callback_t callback)
设置迭代回调函数 / Set iteration callback function
Definition base_fine_registration.hpp:152
point_cloud_ptr m_source_cloud
Definition base_fine_registration.hpp:374
bool has_converged(std::size_t iteration, const transformation_t &current_transform, const transformation_t &previous_transform, DataType current_error, DataType previous_error, std::string &termination_reason) const
检查收敛条件 / Check convergence criteria
Definition base_fine_registration.hpp:270
std::function< bool(const iteration_state_t< DataType > &)> iteration_callback_t
Definition base_fine_registration.hpp:46
bool has_target_normals() const
检查目标点云是否有法线 / Check if target cloud has normals
Definition base_fine_registration.hpp:177
void set_target(const point_cloud_ptr &target)
设置目标点云 / Set target point cloud
Definition base_fine_registration.hpp:69
base_fine_registration_t(const base_fine_registration_t &)=delete
DataType get_max_correspondence_distance() const
获取最大对应距离 / Get maximum correspondence distance
Definition base_fine_registration.hpp:132
void set_source(const point_cloud_ptr &source)
设置源点云 / Set source point cloud
Definition base_fine_registration.hpp:60
std::shared_ptr< point_cloud > point_cloud_ptr
Definition base_fine_registration.hpp:42
bool validate_input_impl() const
派生类的额外输入验证 / Additional input validation for derived class
Definition base_fine_registration.hpp:265
iteration_callback_t m_iteration_callback
Definition base_fine_registration.hpp:389
void set_euclidean_fitness_epsilon(DataType epsilon)
设置欧氏距离epsilon / Set Euclidean fitness epsilon
Definition base_fine_registration.hpp:108
base_fine_registration_t & operator=(base_fine_registration_t &&)=default
std::size_t get_max_iterations() const
获取最大迭代次数 / Get maximum iterations
Definition base_fine_registration.hpp:86
bool validate_input() const
验证输入 / Validate input
Definition base_fine_registration.hpp:233
void set_max_iterations(std::size_t max_iterations)
设置最大迭代次数 / Set maximum iterations
Definition base_fine_registration.hpp:78
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition base_fine_registration.hpp:43
correspondence_type_e get_correspondence_type() const
获取对应关系类型 / Get correspondence type
Definition base_fine_registration.hpp:160
bool align(result_type &result)
执行配准(使用单位矩阵作为初始猜测) / Perform registration (using identity as initial guess)
Definition base_fine_registration.hpp:224
base_fine_registration_t(base_fine_registration_t &&)=default
point_cloud_ptr m_target_cloud
Definition base_fine_registration.hpp:375
bool get_record_history() const
获取是否记录迭代历史 / Get whether to record iteration history
Definition base_fine_registration.hpp:145
void set_record_history(bool record)
设置是否记录迭代历史 / Set whether to record iteration history
Definition base_fine_registration.hpp:140
void preprocess_impl()
预处理钩子(派生类实现) / Preprocessing hook (derived class implementation)
Definition base_fine_registration.hpp:335
void set_max_correspondence_distance(DataType distance)
设置最大对应距离 / Set maximum correspondence distance
Definition base_fine_registration.hpp:124
DataType get_euclidean_fitness_epsilon() const
获取欧氏距离epsilon / Get Euclidean fitness epsilon
Definition base_fine_registration.hpp:116
void set_transformation_epsilon(DataType epsilon)
设置变换epsilon(收敛阈值) / Set transformation epsilon (convergence threshold)
Definition base_fine_registration.hpp:92
bool align(const transformation_t &initial_guess, result_type &result)
执行配准 / Perform registration
Definition base_fine_registration.hpp:189
#define LOG_ERROR_S
ERROR级别流式日志的宏 / Macro for ERROR level stream logging.
Definition thread_logger.hpp:1332
Definition base_correspondence_generator.hpp:18
correspondence_type_e
对应关系类型枚举 / Correspondence type enumeration
Definition base_fine_registration.hpp:21
@ POINT_TO_POINT
点到点 / Point to point
@ POINT_TO_PLANE
点到面 / Point to plane
@ PLANE_TO_PLANE
面到面 / Plane to plane
细配准结果 / Fine registration result
Definition registration_result.hpp:46
std::vector< iteration_state_t< DataType > > history
迭代历史(可选) / Iteration history (optional)
Definition registration_result.hpp:61
std::string termination_reason
终止原因 / Termination reason
Definition registration_result.hpp:58
transformation_t initial_transformation
初始变换 / Initial transformation
Definition registration_result.hpp:51
transformation_t transformation
最终变换 / Final transformation
Definition registration_result.hpp:49
bool converged
是否收敛 / Whether converged
Definition registration_result.hpp:57
DataType final_error
最终误差 / Final error
Definition registration_result.hpp:53
std::size_t iterations_performed
执行的迭代次数 / Iterations performed
Definition registration_result.hpp:55
配准迭代状态 / Registration iteration state
Definition registration_result.hpp:30
DataType error
当前误差 / Current error
Definition registration_result.hpp:35
std::size_t iteration
当前迭代次数 / Current iteration number
Definition registration_result.hpp:33
DataType error_change
误差变化量 / Error change
Definition registration_result.hpp:36
transformation_t transformation
当前变换 / Current transformation
Definition registration_result.hpp:34
std::size_t num_correspondences
对应点数量 / Number of correspondences
Definition registration_result.hpp:37