cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
generalized_icp.hpp
Go to the documentation of this file.
1#pragma once
2
7
8#include <Eigen/Core>
9#include <Eigen/Dense>
10#include <Eigen/Geometry>
11
12namespace toolbox::pcl
13{
14
42template<typename DataType, typename KNNSearcher = kdtree_t<DataType>>
43class generalized_icp_t : public base_fine_registration_t<generalized_icp_t<DataType, KNNSearcher>, DataType>
44{
45public:
47 using typename base_type::point_cloud;
48 using typename base_type::point_cloud_ptr;
49 using typename base_type::transformation_t;
50 using typename base_type::result_type;
51
53 using knn_searcher_type = KNNSearcher;
54 using Matrix3 = Eigen::Matrix<DataType, 3, 3>;
55 using Vector3 = Eigen::Matrix<DataType, 3, 1>;
56 using Vector6 = Eigen::Matrix<DataType, 6, 1>;
57 using Matrix6 = Eigen::Matrix<DataType, 6, 6>;
58
63 explicit generalized_icp_t(bool enable_parallel = false)
64 : m_enable_parallel(enable_parallel),
65 m_source_knn_searcher(std::make_unique<knn_searcher_type>()),
66 m_target_knn_searcher(std::make_unique<knn_searcher_type>())
67 {
68 }
69
73 void set_enable_parallel(bool enable) { m_enable_parallel = enable; }
74
78 bool get_enable_parallel() const { return m_enable_parallel; }
79
86
90 void set_k_correspondences(std::size_t k) { m_k_correspondences = k; }
91
95 std::size_t get_k_correspondences() const { return m_k_correspondences; }
96
101 void set_covariance_epsilon(DataType epsilon) {
102 m_covariance_epsilon = std::max(static_cast<DataType>(0), epsilon);
103 }
104
108 DataType get_covariance_epsilon() const { return m_covariance_epsilon; }
109
113 void set_outlier_rejection_ratio(DataType ratio) {
114 m_outlier_rejection_ratio = std::clamp(ratio, static_cast<DataType>(0), static_cast<DataType>(1));
115 }
116
120 DataType get_outlier_rejection_ratio() const { return m_outlier_rejection_ratio; }
121
125 void set_optimizer_max_iterations(std::size_t max_iter) {
126 m_optimizer_max_iterations = max_iter;
127 }
128
132 std::size_t get_optimizer_max_iterations() const { return m_optimizer_max_iterations; }
133
134protected:
135 friend class base_fine_registration_t<generalized_icp_t<DataType, KNNSearcher>, DataType>;
136
140 void preprocess_impl();
141
145 bool align_impl(const transformation_t& initial_guess, result_type& result);
146
150 void compute_covariances(const point_cloud& cloud,
151 knn_searcher_type& searcher,
152 std::vector<Matrix3>& covariances);
153
157 void find_correspondences(const point_cloud& transformed_source,
158 std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
159 std::vector<DataType>& distances);
160
165 const point_cloud& target,
166 const std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
167 const transformation_t& current_transform);
168
172 DataType compute_mahalanobis_distance(const Vector3& p_src,
173 const Vector3& p_tgt,
174 const Matrix3& C_src,
175 const Matrix3& C_tgt,
176 const transformation_t& transform,
177 Vector6* gradient = nullptr) const;
178
182 DataType compute_error(const point_cloud& source,
183 const point_cloud& target,
184 const std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
185 const transformation_t& transform) const;
186
190 void reject_outliers(std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
191 std::vector<DataType>& distances);
192
196 DataType objective_function(const Vector6& x,
197 const point_cloud& source,
198 const point_cloud& target,
199 const std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
200 const transformation_t& base_transform,
201 Vector6* gradient = nullptr) const;
202
207 const point_cloud& source,
208 const point_cloud& target,
209 const std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
210 const transformation_t& base_transform);
211
215 Vector6 transformation_to_vector(const transformation_t& transform) const;
216
221
222private:
223 bool m_enable_parallel;
224 std::unique_ptr<knn_searcher_type> m_source_knn_searcher;
225 std::unique_ptr<knn_searcher_type> m_target_knn_searcher;
226
227 std::size_t m_k_correspondences = 20;
228 DataType m_covariance_epsilon = 0.001;
229 DataType m_outlier_rejection_ratio = 0.1;
230 std::size_t m_optimizer_max_iterations = 10;
231
232 std::vector<Matrix3> m_source_covariances;
233 std::vector<Matrix3> m_target_covariances;
234};
235
236
237} // namespace toolbox::pcl
238
239// 包含实现文件 / Include implementation file
细配准算法的基类(CRTP模式) / Base class for fine registration algorithms (CRTP pattern)
Definition base_fine_registration.hpp:39
toolbox::types::point_cloud_t< DataType > point_cloud
Definition base_fine_registration.hpp:41
std::shared_ptr< point_cloud > point_cloud_ptr
Definition base_fine_registration.hpp:42
fine_registration_result_t< DataType > result_type
Definition base_fine_registration.hpp:44
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition base_fine_registration.hpp:43
Generalized ICP (Plane-to-Plane) 算法实现 / Generalized ICP algorithm implementation.
Definition generalized_icp.hpp:44
Eigen::Matrix< DataType, 6, 1 > Vector6
Definition generalized_icp.hpp:56
generalized_icp_t(bool enable_parallel=false)
构造函数 / Constructor
Definition generalized_icp.hpp:63
transformation_t compute_transformation(const point_cloud &source, const point_cloud &target, const std::vector< std::pair< std::size_t, std::size_t > > &correspondences, const transformation_t &current_transform)
计算变换矩阵(使用L-BFGS优化) / Compute transformation matrix (using L-BFGS optimization)
Definition generalized_icp_impl.hpp:209
DataType compute_error(const point_cloud &source, const point_cloud &target, const std::vector< std::pair< std::size_t, std::size_t > > &correspondences, const transformation_t &transform) const
计算配准误差 / Compute registration error
Definition generalized_icp_impl.hpp:266
void find_correspondences(const point_cloud &transformed_source, std::vector< std::pair< std::size_t, std::size_t > > &correspondences, std::vector< DataType > &distances)
查找对应关系 / Find correspondences
Definition generalized_icp_impl.hpp:182
correspondence_type_e get_correspondence_type_impl() const
获取对应关系类型 / Get correspondence type
Definition generalized_icp.hpp:83
toolbox::types::point_cloud_t< DataType > point_cloud
Definition base_fine_registration.hpp:41
void reject_outliers(std::vector< std::pair< std::size_t, std::size_t > > &correspondences, std::vector< DataType > &distances)
剔除异常值 / Reject outliers
Definition generalized_icp_impl.hpp:296
std::size_t get_optimizer_max_iterations() const
获取优化器最大内部迭代次数 / Get optimizer maximum inner iterations
Definition generalized_icp.hpp:132
DataType get_outlier_rejection_ratio() const
获取异常值剔除比例 / Get outlier rejection ratio
Definition generalized_icp.hpp:120
Vector6 lbfgs_optimize(const Vector6 &x0, const point_cloud &source, const point_cloud &target, const std::vector< std::pair< std::size_t, std::size_t > > &correspondences, const transformation_t &base_transform)
L-BFGS优化器 / L-BFGS optimizer.
Definition generalized_icp_impl.hpp:399
KNNSearcher knn_searcher_type
Definition generalized_icp.hpp:53
void set_k_correspondences(std::size_t k)
设置用于协方差估计的近邻数 / Set number of neighbors for covariance estimation
Definition generalized_icp.hpp:90
DataType objective_function(const Vector6 &x, const point_cloud &source, const point_cloud &target, const std::vector< std::pair< std::size_t, std::size_t > > &correspondences, const transformation_t &base_transform, Vector6 *gradient=nullptr) const
优化目标函数 / Optimization objective function
Definition generalized_icp_impl.hpp:356
void set_covariance_epsilon(DataType epsilon)
设置协方差正则化参数 / Set covariance regularization parameter
Definition generalized_icp.hpp:101
Vector6 transformation_to_vector(const transformation_t &transform) const
将变换矩阵转换为优化向量 / Convert transformation matrix to optimization vector
Definition generalized_icp_impl.hpp:494
fine_registration_result_t< DataType > result_type
Definition base_fine_registration.hpp:44
void compute_covariances(const point_cloud &cloud, knn_searcher_type &searcher, std::vector< Matrix3 > &covariances)
计算点云的协方差矩阵 / Compute covariance matrices for point cloud
Definition generalized_icp_impl.hpp:132
DataType get_covariance_epsilon() const
获取协方差正则化参数 / Get covariance regularization parameter
Definition generalized_icp.hpp:108
void preprocess_impl()
预处理(构建KD树和计算协方差) / Preprocessing (build KD-trees and compute covariances)
Definition generalized_icp_impl.hpp:28
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition base_fine_registration.hpp:43
bool align_impl(const transformation_t &initial_guess, result_type &result)
执行配准 / Perform registration
Definition generalized_icp_impl.hpp:49
std::size_t get_k_correspondences() const
获取用于协方差估计的近邻数 / Get number of neighbors for covariance estimation
Definition generalized_icp.hpp:95
void set_optimizer_max_iterations(std::size_t max_iter)
设置优化器最大内部迭代次数 / Set optimizer maximum inner iterations
Definition generalized_icp.hpp:125
transformation_t vector_to_transformation(const Vector6 &vec) const
将优化向量转换为变换矩阵 / Convert optimization vector to transformation matrix
Definition generalized_icp_impl.hpp:536
Eigen::Matrix< DataType, 3, 1 > Vector3
Definition generalized_icp.hpp:55
bool get_enable_parallel() const
获取是否启用并行优化 / Get whether parallel optimization is enabled
Definition generalized_icp.hpp:78
DataType compute_mahalanobis_distance(const Vector3 &p_src, const Vector3 &p_tgt, const Matrix3 &C_src, const Matrix3 &C_tgt, const transformation_t &transform, Vector6 *gradient=nullptr) const
计算Mahalanobis距离和梯度 / Compute Mahalanobis distance and gradient
Definition generalized_icp_impl.hpp:225
void set_enable_parallel(bool enable)
设置是否启用并行优化 / Set whether to enable parallel optimization
Definition generalized_icp.hpp:73
void set_outlier_rejection_ratio(DataType ratio)
设置异常值剔除比例 / Set outlier rejection ratio
Definition generalized_icp.hpp:113
Eigen::Matrix< DataType, 3, 3 > Matrix3
Definition generalized_icp.hpp:54
Eigen::Matrix< DataType, 6, 6 > Matrix6
Definition generalized_icp.hpp:57
Definition base_correspondence_generator.hpp:18
correspondence_type_e
对应关系类型枚举 / Correspondence type enumeration
Definition base_fine_registration.hpp:21
@ PLANE_TO_PLANE
面到面 / Plane to plane