cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
point_to_point_icp.hpp
Go to the documentation of this file.
1#pragma once
2
7
8#include <Eigen/Core>
9#include <Eigen/SVD>
10#include <Eigen/Geometry>
11
12namespace toolbox::pcl
13{
14
40template<typename DataType, typename KNNSearcher = kdtree_t<DataType>>
41class point_to_point_icp_t : public base_fine_registration_t<point_to_point_icp_t<DataType, KNNSearcher>, DataType>
42{
43public:
45 using typename base_type::point_cloud;
46 using typename base_type::point_cloud_ptr;
47 using typename base_type::transformation_t;
48 using typename base_type::result_type;
49
51 using knn_searcher_type = KNNSearcher;
52
57 explicit point_to_point_icp_t(bool enable_parallel = false)
58 : m_enable_parallel(enable_parallel),
59 m_knn_searcher(std::make_unique<knn_searcher_type>())
60 {
61 }
62
66 void set_enable_parallel(bool enable) { m_enable_parallel = enable; }
67
71 bool get_enable_parallel() const { return m_enable_parallel; }
72
79
84 void set_outlier_rejection_ratio(DataType ratio) {
85 m_outlier_rejection_ratio = std::clamp(ratio, static_cast<DataType>(0), static_cast<DataType>(1));
86 }
87
91 DataType get_outlier_rejection_ratio() const { return m_outlier_rejection_ratio; }
92
93protected:
94 friend class base_fine_registration_t<point_to_point_icp_t<DataType, KNNSearcher>, DataType>;
95
100 if (this->m_target_cloud) {
101 LOG_INFO_S << "构建目标点云KD树 / Building target cloud KD-tree";
102 m_knn_searcher->set_input(*this->m_target_cloud);
103 }
104 }
105
109 bool align_impl(const transformation_t& initial_guess, result_type& result);
110
114 void find_correspondences(const point_cloud& transformed_source,
115 std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
116 std::vector<DataType>& distances);
117
122 const point_cloud& target,
123 const std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
124 const std::vector<DataType>& distances);
125
129 DataType compute_error(const std::vector<DataType>& distances) const;
130
134 void reject_outliers(std::vector<std::pair<std::size_t, std::size_t>>& correspondences,
135 std::vector<DataType>& distances);
136
137private:
138 bool m_enable_parallel;
139 std::unique_ptr<knn_searcher_type> m_knn_searcher;
140 DataType m_outlier_rejection_ratio = 0.1;
141};
142
143
144} // namespace toolbox::pcl
145
146// 包含实现文件 / 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-Point ICP 算法实现 / Point-to-Point ICP algorithm implementation.
Definition point_to_point_icp.hpp:42
toolbox::types::point_cloud_t< DataType > point_cloud
Definition base_fine_registration.hpp:41
void preprocess_impl()
预处理(构建KD树) / Preprocessing (build KD-tree)
Definition point_to_point_icp.hpp:99
bool align_impl(const transformation_t &initial_guess, result_type &result)
执行配准 / Perform registration
Definition point_to_point_icp_impl.hpp:15
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 std::vector< DataType > &distances)
计算变换矩阵(使用SVD) / Compute transformation matrix (using SVD)
Definition point_to_point_icp_impl.hpp:172
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_point_icp_impl.hpp:97
bool get_enable_parallel() const
获取是否启用并行优化 / Get whether parallel optimization is enabled
Definition point_to_point_icp.hpp:71
fine_registration_result_t< DataType > result_type
Definition base_fine_registration.hpp:44
KNNSearcher knn_searcher_type
Definition point_to_point_icp.hpp:51
DataType get_outlier_rejection_ratio() const
获取异常值剔除比例 / Get outlier rejection ratio
Definition point_to_point_icp.hpp:91
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition base_fine_registration.hpp:43
point_to_point_icp_t(bool enable_parallel=false)
构造函数 / Constructor
Definition point_to_point_icp.hpp:57
void reject_outliers(std::vector< std::pair< std::size_t, std::size_t > > &correspondences, std::vector< DataType > &distances)
剔除异常值 / Reject outliers
Definition point_to_point_icp_impl.hpp:256
void set_enable_parallel(bool enable)
设置是否启用并行优化 / Set whether to enable parallel optimization
Definition point_to_point_icp.hpp:66
DataType compute_error(const std::vector< DataType > &distances) const
计算配准误差 / Compute registration error
Definition point_to_point_icp_impl.hpp:241
correspondence_type_e get_correspondence_type_impl() const
获取对应关系类型 / Get correspondence type
Definition point_to_point_icp.hpp:76
void set_outlier_rejection_ratio(DataType ratio)
设置异常值剔除比例 / Set outlier rejection ratio
Definition point_to_point_icp.hpp:84
#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_POINT
点到点 / Point to point