cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
registration.hpp
Go to the documentation of this file.
1#pragma once
2
53// 基础类和结果结构 / Base classes and result structures
57
58// 粗配准算法 / Coarse registration algorithms
63
64// 细配准算法 / Fine registration algorithms
70
71// 必要的类型定义 / Required type definitions
73
74// 日志宏 / Logger macros
76#define LOG_ERROR_S toolbox::logger::thread_logger_t::instance().error_s()
77#define LOG_WARN_S toolbox::logger::thread_logger_t::instance().warn_s()
78#define LOG_INFO_S toolbox::logger::thread_logger_t::instance().info_s()
79
80// 便捷类型别名 / Convenient type aliases
81namespace toolbox::pcl
82{
83
89// 粗配准单精度类型别名 / Coarse registration single precision aliases
95
96// 粗配准双精度类型别名 / Coarse registration double precision aliases
102
103// 细配准单精度类型别名 / Fine registration single precision aliases
110
111// 细配准双精度类型别名 / Fine registration double precision aliases
118
170template<typename DataType>
171Eigen::Matrix<DataType, 4, 4> complete_registration(
172 const std::shared_ptr<toolbox::types::point_cloud_t<DataType>>& source,
173 const std::shared_ptr<toolbox::types::point_cloud_t<DataType>>& target,
174 bool use_coarse = true,
175 const std::string& fine_algorithm = "p2p")
176{
177 Eigen::Matrix<DataType, 4, 4> initial_guess = Eigen::Matrix<DataType, 4, 4>::Identity();
178
179 // 粗配准 / Coarse registration
180 if (use_coarse) {
182 coarse_reg.set_source(source);
183 coarse_reg.set_target(target);
184 coarse_reg.set_delta(static_cast<DataType>(0.02)); // 2cm精度
185 coarse_reg.set_overlap(static_cast<DataType>(0.5)); // 50%重叠
186
188 if (coarse_reg.align(coarse_result) && coarse_result.fitness_score > 0.3) {
189 initial_guess = coarse_result.transformation;
190 LOG_INFO_S << "粗配准成功,适应度分数 / Coarse registration successful, fitness score: "
191 << coarse_result.fitness_score;
192 }
193 }
194
195 // 细配准 / Fine registration
197
198 if (fine_algorithm == "p2p") {
200 reg.set_source(source);
201 reg.set_target(target);
202 reg.set_max_iterations(50);
203 reg.align(initial_guess, fine_result);
204 } else if (fine_algorithm == "p2l") {
205 if (!target->normals.empty()) {
207 reg.set_source(source);
208 reg.set_target(target);
209 reg.set_max_iterations(50);
210 reg.align(initial_guess, fine_result);
211 } else {
212 LOG_WARN_S << "目标点云无法线,回退到Point-to-Point ICP / "
213 "Target cloud has no normals, falling back to Point-to-Point ICP";
215 reg.set_source(source);
216 reg.set_target(target);
217 reg.set_max_iterations(50);
218 reg.align(initial_guess, fine_result);
219 }
220 } else if (fine_algorithm == "gicp") {
222 reg.set_source(source);
223 reg.set_target(target);
224 reg.set_max_iterations(50);
225 reg.align(initial_guess, fine_result);
226 } else if (fine_algorithm == "aa_icp") {
228 reg.set_source(source);
229 reg.set_target(target);
230 reg.set_max_iterations(50);
231 reg.align(initial_guess, fine_result);
232 } else if (fine_algorithm == "ndt") {
233 ndt_t<DataType> reg;
234 reg.set_source(source);
235 reg.set_target(target);
236 reg.set_resolution(static_cast<DataType>(0.5)); // 0.5m体素
237 reg.set_max_iterations(50);
238 reg.align(initial_guess, fine_result);
239 } else {
240 LOG_ERROR_S << "未知细配准算法 / Unknown fine registration algorithm: " << fine_algorithm;
241 return initial_guess;
242 }
243
244 if (fine_result.converged) {
245 LOG_INFO_S << "细配准收敛,迭代次数 / Fine registration converged, iterations: "
246 << fine_result.iterations_performed
247 << ",最终误差 / , final error: " << fine_result.final_error;
248 } else {
249 LOG_WARN_S << "细配准未收敛,终止原因 / Fine registration did not converge, reason: "
250 << fine_result.termination_reason;
251 }
252
253 return fine_result.transformation;
254}
255
// end of registration group
257
258} // namespace toolbox::pcl
AA-ICP (Anderson Acceleration ICP) 算法实现 / AA-ICP algorithm implementation.
Definition aa_icp.hpp:43
void set_target(const point_cloud_ptr &target)
设置目标点云 / Set target point cloud
Definition base_coarse_registration.hpp:60
void set_source(const point_cloud_ptr &source)
设置源点云 / Set source point cloud
Definition base_coarse_registration.hpp:51
bool align(result_type &result)
执行配准 / Perform registration
Definition base_coarse_registration.hpp:117
void set_target(const point_cloud_ptr &target)
设置目标点云 / Set target point cloud
Definition base_fine_registration.hpp:69
void set_source(const point_cloud_ptr &source)
设置源点云 / Set source point cloud
Definition base_fine_registration.hpp:60
void set_max_iterations(std::size_t max_iterations)
设置最大迭代次数 / Set maximum iterations
Definition base_fine_registration.hpp:78
bool align(const transformation_t &initial_guess, result_type &result)
执行配准 / Perform registration
Definition base_fine_registration.hpp:189
4PCS(4-Point Congruent Sets)粗配准算法 / 4PCS coarse registration algorithm
Definition four_pcs_registration.hpp:42
void set_overlap(DataType overlap)
设置重叠率估计 / Set overlap ratio estimate
Definition four_pcs_registration.hpp:99
void set_delta(DataType delta)
设置配准精度delta / Set registration accuracy delta
Definition four_pcs_registration.hpp:87
Generalized ICP (Plane-to-Plane) 算法实现 / Generalized ICP algorithm implementation.
Definition generalized_icp.hpp:44
NDT (Normal Distributions Transform) 算法实现 / NDT algorithm implementation.
Definition ndt.hpp:47
void set_resolution(DataType resolution)
设置体素分辨率 / Set voxel resolution
Definition ndt.hpp:102
Point-to-Plane ICP 算法实现 / Point-to-Plane ICP algorithm implementation.
Definition point_to_plane_icp.hpp:44
Point-to-Point ICP 算法实现 / Point-to-Point ICP algorithm implementation.
Definition point_to_point_icp.hpp:42
PROSAC (渐进式采样一致性) 粗配准算法 / PROSAC (Progressive Sample Consensus) coarse registration algorithm.
Definition prosac_registration.hpp:60
RANSAC粗配准算法 / RANSAC coarse registration algorithm.
Definition ransac_registration.hpp:46
Super4PCS 粗配准算法 / Super4PCS coarse registration algorithm.
Definition super_four_pcs_registration.hpp:44
包含点和相关数据的点云类 / A point cloud class containing points and associated data
Definition point.hpp:268
#define LOG_INFO_S
INFO级别流式日志的宏 / Macro for INFO level stream logging.
Definition thread_logger.hpp:1330
#define LOG_ERROR_S
ERROR级别流式日志的宏 / Macro for ERROR level stream logging.
Definition thread_logger.hpp:1332
#define LOG_WARN_S
WARN级别流式日志的宏 / Macro for WARN level stream logging.
Definition thread_logger.hpp:1331
Eigen::Matrix< DataType, 4, 4 > complete_registration(const std::shared_ptr< toolbox::types::point_cloud_t< DataType > > &source, const std::shared_ptr< toolbox::types::point_cloud_t< DataType > > &target, bool use_coarse=true, const std::string &fine_algorithm="p2p")
配准算法选择指南 / Registration algorithm selection guide
Definition registration.hpp:171
Definition base_correspondence_generator.hpp:18
细配准结果 / Fine registration result
Definition registration_result.hpp:46
std::string termination_reason
终止原因 / Termination reason
Definition registration_result.hpp:58
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 result structure
Definition registration_result.hpp:15
DataType fitness_score
配准质量评分 / Registration fitness score
Definition registration_result.hpp:19
transformation_t transformation
变换矩阵 / Transformation matrix
Definition registration_result.hpp:18