cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
base_coarse_registration.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <vector>
5#include <random>
6
7#include <cpp-toolbox/cpp-toolbox_export.hpp>
12
13// Logger macros
14#define LOG_ERROR_S toolbox::logger::thread_logger_t::instance().error_s()
15#define LOG_WARN_S toolbox::logger::thread_logger_t::instance().warn_s()
16#define LOG_INFO_S toolbox::logger::thread_logger_t::instance().info_s()
17
18namespace toolbox::pcl
19{
20
29template<typename Derived, typename DataType>
30class CPP_TOOLBOX_EXPORT base_coarse_registration_t
31{
32public:
34 using point_cloud_ptr = std::shared_ptr<point_cloud>;
35 using correspondences_ptr = std::shared_ptr<std::vector<correspondence_t>>;
37
39 virtual ~base_coarse_registration_t() = default;
40
41 // 删除拷贝,允许移动 / Delete copy, allow move
44 delete;
47
51 void set_source(const point_cloud_ptr& source)
52 {
53 m_source_cloud = source;
54 return static_cast<Derived*>(this)->set_source_impl(source);
55 }
56
60 void set_target(const point_cloud_ptr& target)
61 {
62 m_target_cloud = target;
63 return static_cast<Derived*>(this)->set_target_impl(target);
64 }
65
70 void set_correspondences(const correspondences_ptr& correspondences)
71 {
72 m_correspondences = correspondences;
73 return static_cast<Derived*>(this)->set_correspondences_impl(correspondences);
74 }
75
79 void set_max_iterations(std::size_t max_iterations)
80 {
81 m_max_iterations = max_iterations;
82 return static_cast<Derived*>(this)->set_max_iterations_impl(max_iterations);
83 }
84
88 void set_inlier_threshold(DataType threshold)
89 {
90 m_inlier_threshold = threshold;
91 return static_cast<Derived*>(this)->set_inlier_threshold_impl(threshold);
92 }
93
97 void set_convergence_threshold(DataType threshold)
98 {
99 m_convergence_threshold = threshold;
100 return static_cast<Derived*>(this)->set_convergence_threshold_impl(threshold);
101 }
102
106 void set_min_inliers(std::size_t min_inliers)
107 {
108 m_min_inliers = min_inliers;
109 return static_cast<Derived*>(this)->set_min_inliers_impl(min_inliers);
110 }
111
117 bool align(result_type& result)
118 {
119 // 验证输入 / Validate input
120 if (!validate_input()) {
121 return false;
122 }
123
124 // 调用派生类的实现 / Call derived class implementation
125 return static_cast<Derived*>(this)->align_impl(result);
126 }
127
131 [[nodiscard]] std::string get_algorithm_name() const
132 {
133 return static_cast<const Derived*>(this)->get_algorithm_name_impl();
134 }
135
140 void enable_parallel(bool enable = true) { m_parallel_enabled = enable; }
141
146 [[nodiscard]] bool is_parallel_enabled() const { return m_parallel_enabled; }
147
152 void set_random_seed(unsigned int seed) { m_random_seed = seed; }
153
154protected:
158 void set_source_impl(const point_cloud_ptr& /*source*/) {}
159 void set_target_impl(const point_cloud_ptr& /*target*/) {}
160 void set_correspondences_impl(const correspondences_ptr& /*correspondences*/) {}
161 void set_max_iterations_impl(std::size_t /*max_iterations*/) {}
162 void set_inlier_threshold_impl(DataType /*threshold*/) {}
163 void set_convergence_threshold_impl(DataType /*threshold*/) {}
164 void set_min_inliers_impl(std::size_t /*min_inliers*/) {}
165
169 [[nodiscard]] bool validate_input() const
170 {
171 if (!m_source_cloud || !m_target_cloud) {
172 LOG_ERROR_S << "错误:源点云或目标点云未设置 / Error: Source or target "
173 "cloud not set";
174 return false;
175 }
176
177 if (m_source_cloud->empty() || m_target_cloud->empty()) {
178 LOG_ERROR_S << "错误:点云为空 / Error: Point cloud is empty";
179 return false;
180 }
181
182 // 派生类可能需要额外的验证 / Derived class may need additional validation
183 return static_cast<const Derived*>(this)->validate_input_impl();
184 }
185
190 [[nodiscard]] bool validate_input_impl() const { return true; }
191
195 [[nodiscard]] DataType compute_fitness_score(
196 const Eigen::Matrix<DataType, 4, 4>& transformation,
197 const std::vector<std::size_t>& inliers) const
198 {
199 // 基类提供默认实现,派生类可重写 / Base class provides default
200 // implementation, derived class can override
201 if (inliers.empty()) {
202 return std::numeric_limits<DataType>::max();
203 }
204
205 // 计算平均内点距离 / Compute average inlier distance
206 DataType total_distance = 0;
207 for (std::size_t idx : inliers) {
208 // 这里简化了,实际需要根据对应关系计算距离
209 // Simplified here, actual implementation needs to compute distance based
210 // on correspondences
211 total_distance += m_inlier_threshold; // 占位符 / Placeholder
212 }
213
214 return total_distance / inliers.size();
215 }
216
220 [[nodiscard]] const point_cloud_ptr& get_source_cloud() const { return m_source_cloud; }
221 [[nodiscard]] const point_cloud_ptr& get_target_cloud() const { return m_target_cloud; }
222 [[nodiscard]] const correspondences_ptr& get_correspondences() const { return m_correspondences; }
223 [[nodiscard]] std::size_t get_max_iterations() const { return m_max_iterations; }
224 [[nodiscard]] DataType get_inlier_threshold() const { return m_inlier_threshold; }
225 [[nodiscard]] DataType get_convergence_threshold() const { return m_convergence_threshold; }
226 [[nodiscard]] std::size_t get_min_inliers() const { return m_min_inliers; }
227 [[nodiscard]] unsigned int get_random_seed() const { return m_random_seed; }
228
229private:
230 // 数据成员 / Data members
231 point_cloud_ptr m_source_cloud;
232 point_cloud_ptr m_target_cloud;
233 correspondences_ptr m_correspondences;
235
236 // 参数 / Parameters
237 std::size_t m_max_iterations = 1000;
238 DataType m_inlier_threshold = 0.05;
239 DataType m_convergence_threshold = 1e-6;
240 std::size_t m_min_inliers = 3;
241 bool m_parallel_enabled = true;
242 unsigned int m_random_seed = std::random_device{}();
243};
244
245} // namespace toolbox::pcl
粗配准算法的基类(CRTP模式) / Base class for coarse registration algorithms (CRTP pattern)
Definition base_coarse_registration.hpp:31
void set_target(const point_cloud_ptr &target)
设置目标点云 / Set target point cloud
Definition base_coarse_registration.hpp:60
bool is_parallel_enabled() const
获取并行计算状态 / Get parallel computation status
Definition base_coarse_registration.hpp:146
std::shared_ptr< std::vector< correspondence_t > > correspondences_ptr
Definition base_coarse_registration.hpp:35
void set_correspondences(const correspondences_ptr &correspondences)
设置初始对应关系(可选,主要用于RANSAC类算法) / Set initial correspondences (optional, mainly for RANSAC-like algorithms...
Definition base_coarse_registration.hpp:70
const correspondences_ptr & get_correspondences() const
Definition base_coarse_registration.hpp:222
std::size_t get_min_inliers() const
Definition base_coarse_registration.hpp:226
unsigned int get_random_seed() const
Definition base_coarse_registration.hpp:227
DataType compute_fitness_score(const Eigen::Matrix< DataType, 4, 4 > &transformation, const std::vector< std::size_t > &inliers) const
计算配准质量评分 / Compute registration fitness score
Definition base_coarse_registration.hpp:195
base_coarse_registration_t(const base_coarse_registration_t &)=delete
DataType get_convergence_threshold() const
Definition base_coarse_registration.hpp:225
std::size_t get_max_iterations() const
Definition base_coarse_registration.hpp:223
void set_target_impl(const point_cloud_ptr &)
Definition base_coarse_registration.hpp:159
void enable_parallel(bool enable=true)
启用/禁用并行计算 / Enable/disable parallel computation
Definition base_coarse_registration.hpp:140
void set_source_impl(const point_cloud_ptr &)
派生类可选实现的钩子函数 / Optional hook functions for derived classes
Definition base_coarse_registration.hpp:158
base_coarse_registration_t & operator=(const base_coarse_registration_t &)=delete
void set_min_inliers(std::size_t min_inliers)
设置最小内点数量 / Set minimum number of inliers
Definition base_coarse_registration.hpp:106
void set_source(const point_cloud_ptr &source)
设置源点云 / Set source point cloud
Definition base_coarse_registration.hpp:51
void set_max_iterations_impl(std::size_t)
Definition base_coarse_registration.hpp:161
base_coarse_registration_t(base_coarse_registration_t &&)=default
void set_inlier_threshold(DataType threshold)
设置内点距离阈值 / Set inlier distance threshold
Definition base_coarse_registration.hpp:88
std::string get_algorithm_name() const
获取算法名称 / Get algorithm name
Definition base_coarse_registration.hpp:131
base_coarse_registration_t & operator=(base_coarse_registration_t &&)=default
const point_cloud_ptr & get_source_cloud() const
获取受保护的成员变量访问 / Get access to protected members
Definition base_coarse_registration.hpp:220
void set_random_seed(unsigned int seed)
设置随机种子 / Set random seed
Definition base_coarse_registration.hpp:152
bool align(result_type &result)
执行配准 / Perform registration
Definition base_coarse_registration.hpp:117
const point_cloud_ptr & get_target_cloud() const
Definition base_coarse_registration.hpp:221
void set_correspondences_impl(const correspondences_ptr &)
Definition base_coarse_registration.hpp:160
std::shared_ptr< point_cloud > point_cloud_ptr
Definition base_coarse_registration.hpp:34
void set_max_iterations(std::size_t max_iterations)
设置最大迭代次数 / Set maximum iterations
Definition base_coarse_registration.hpp:79
void set_inlier_threshold_impl(DataType)
Definition base_coarse_registration.hpp:162
DataType get_inlier_threshold() const
Definition base_coarse_registration.hpp:224
bool validate_input_impl() const
派生类的额外输入验证(可选) / Additional input validation for derived class (optional)
Definition base_coarse_registration.hpp:190
bool validate_input() const
验证输入数据 / Validate input data
Definition base_coarse_registration.hpp:169
void set_convergence_threshold_impl(DataType)
Definition base_coarse_registration.hpp:163
void set_convergence_threshold(DataType threshold)
设置收敛阈值 / Set convergence threshold
Definition base_coarse_registration.hpp:97
void set_min_inliers_impl(std::size_t)
Definition base_coarse_registration.hpp:164
#define LOG_ERROR_S
ERROR级别流式日志的宏 / Macro for ERROR level stream logging.
Definition thread_logger.hpp:1332
Definition base_correspondence_generator.hpp:18
配准结果结构体 / Registration result structure
Definition registration_result.hpp:15