cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
point_to_plane_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 point_to_plane_icp_t : public base_fine_registration_t<point_to_plane_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
55 // 法线结构体定义
56 struct normal_t {
57 DataType normal_x;
58 DataType normal_y;
59 DataType normal_z;
60 DataType curvature;
61 };
63
68 explicit point_to_plane_icp_t(bool enable_parallel = false)
69 : m_enable_parallel(enable_parallel),
70 m_knn_searcher(std::make_unique<knn_searcher_type>())
71 {
72 }
73
77 void set_enable_parallel(bool enable) { m_enable_parallel = enable; }
78
82 bool get_enable_parallel() const { return m_enable_parallel; }
83
90
95 void set_outlier_rejection_ratio(DataType ratio) {
96 m_outlier_rejection_ratio = std::clamp(ratio, static_cast<DataType>(0), static_cast<DataType>(1));
97 }
98
102 DataType get_outlier_rejection_ratio() const { return m_outlier_rejection_ratio; }
103
108 void set_regularization(DataType lambda) {
109 m_regularization = std::max(static_cast<DataType>(0), lambda);
110 }
111
115 DataType get_regularization() const { return m_regularization; }
116
117protected:
118 friend class base_fine_registration_t<point_to_plane_icp_t<DataType, KNNSearcher>, DataType>;
119
123 bool validate_input_impl() const {
124 // TODO: 验证目标点云是否具有法线信息
125 // 目前假设用户已提供正确的带法线的点云
126 return true;
127 }
128
133 if (this->m_target_cloud) {
134 LOG_INFO_S << "构建目标点云KD树 / Building target cloud KD-tree";
135 m_knn_searcher->set_input(*this->m_target_cloud);
136 }
137 }
138
142 bool align_impl(const transformation_t& initial_guess, result_type& result);
143
147 void find_correspondences(const point_cloud& transformed_source,
148 std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
149 std::vector<DataType>& distances);
150
155 const point_cloud& target,
156 const std::vector<std::pair<std::size_t, std::size_t>>& correspondences);
157
161 DataType compute_error(const point_cloud& source,
162 const point_cloud& target,
163 const std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
164 const transformation_t& transform) const;
165
169 void reject_outliers(std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
170 std::vector<DataType>& distances);
171
175 Eigen::Matrix<DataType, 6, 1> transformation_to_vector(const transformation_t& transform) const;
176
180 transformation_t vector_to_transformation(const Eigen::Matrix<DataType, 6, 1>& vec) const;
181
182private:
183 bool m_enable_parallel;
184 std::unique_ptr<knn_searcher_type> m_knn_searcher;
185 DataType m_outlier_rejection_ratio = 0.1;
186 DataType m_regularization = 1e-4;
187};
188
189
190} // namespace toolbox::pcl
191
192// 包含实现文件 / 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
point_cloud_ptr m_target_cloud
Definition base_fine_registration.hpp:375
Point-to-Plane ICP 算法实现 / Point-to-Plane ICP algorithm implementation.
Definition point_to_plane_icp.hpp:44
DataType get_outlier_rejection_ratio() const
获取异常值剔除比例 / Get outlier rejection ratio
Definition point_to_plane_icp.hpp:102
toolbox::types::point_cloud_t< DataType > point_cloud
Definition base_fine_registration.hpp:41
void set_outlier_rejection_ratio(DataType ratio)
设置异常值剔除比例 / Set outlier rejection ratio
Definition point_to_plane_icp.hpp:95
void preprocess_impl()
预处理(构建KD树) / Preprocessing (build KD-tree)
Definition point_to_plane_icp.hpp:132
bool align_impl(const transformation_t &initial_guess, result_type &result)
执行配准 / Perform registration
Definition point_to_plane_icp_impl.hpp:27
transformation_t compute_transformation(const point_cloud &source, const point_cloud &target, const std::vector< std::pair< std::size_t, std::size_t > > &correspondences)
计算变换矩阵(使用Gauss-Newton方法) / Compute transformation matrix (using Gauss-Newton method)
Definition point_to_plane_icp_impl.hpp:152
fine_registration_result_t< DataType > result_type
Definition base_fine_registration.hpp:44
transformation_t vector_to_transformation(const Eigen::Matrix< DataType, 6, 1 > &vec) const
将李代数表示转换为变换矩阵 / Convert Lie algebra representation to transformation matrix
Definition point_to_plane_icp_impl.hpp:356
bool validate_input_impl() const
额外的输入验证(检查法线) / Additional input validation (check normals)
Definition point_to_plane_icp.hpp:123
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition base_fine_registration.hpp:43
DataType get_regularization() const
获取正则化参数 / Get regularization parameter
Definition point_to_plane_icp.hpp:115
bool get_enable_parallel() const
获取是否启用并行优化 / Get whether parallel optimization is enabled
Definition point_to_plane_icp.hpp:82
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 point_to_plane_icp_impl.hpp:125
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 point_to_plane_icp_impl.hpp:211
Eigen::Matrix< DataType, 6, 1 > transformation_to_vector(const transformation_t &transform) const
将变换矩阵转换为李代数表示 / Convert transformation matrix to Lie algebra representation
Definition point_to_plane_icp_impl.hpp:314
void reject_outliers(std::vector< std::pair< std::size_t, std::size_t > > &correspondences, std::vector< DataType > &distances)
剔除异常值 / Reject outliers
Definition point_to_plane_icp_impl.hpp:251
correspondence_type_e get_correspondence_type_impl() const
获取对应关系类型 / Get correspondence type
Definition point_to_plane_icp.hpp:87
void set_enable_parallel(bool enable)
设置是否启用并行优化 / Set whether to enable parallel optimization
Definition point_to_plane_icp.hpp:77
KNNSearcher knn_searcher_type
Definition point_to_plane_icp.hpp:53
void set_regularization(DataType lambda)
设置正则化参数 / Set regularization parameter
Definition point_to_plane_icp.hpp:108
point_to_plane_icp_t(bool enable_parallel=false)
构造函数 / Constructor
Definition point_to_plane_icp.hpp:68
#define LOG_INFO_S
INFO级别流式日志的宏 / Macro for INFO level stream logging.
Definition thread_logger.hpp:1330
Definition base_correspondence_generator.hpp:18
correspondence_type_e
对应关系类型枚举 / Correspondence type enumeration
Definition base_fine_registration.hpp:21
@ POINT_TO_PLANE
点到面 / Point to plane
Definition point_to_plane_icp.hpp:56
DataType normal_y
Definition point_to_plane_icp.hpp:58
DataType normal_x
Definition point_to_plane_icp.hpp:57
DataType normal_z
Definition point_to_plane_icp.hpp:59
DataType curvature
Definition point_to_plane_icp.hpp:60