cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
aa_icp.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <deque>
7#include <Eigen/QR>
8
9namespace toolbox::pcl
10{
11
39template<typename DataType,
40 typename KNNSearcher = kdtree_t<DataType>,
41 typename BaseICP = point_to_point_icp_t<DataType, KNNSearcher>>
42class aa_icp_t : public base_fine_registration_t<aa_icp_t<DataType, KNNSearcher, BaseICP>, DataType>
43{
44public:
46 using typename base_type::point_cloud;
47 using typename base_type::point_cloud_ptr;
48 using typename base_type::transformation_t;
49 using typename base_type::result_type;
50
51 using base_icp_type = BaseICP;
52 using VectorX = Eigen::Matrix<DataType, Eigen::Dynamic, 1>;
53 using MatrixX = Eigen::Matrix<DataType, Eigen::Dynamic, Eigen::Dynamic>;
54
59 explicit aa_icp_t(bool enable_parallel = false)
60 : m_base_icp(enable_parallel)
61 {
62 // 传递基类的参数设置函数到基础ICP
63 m_base_icp.set_outlier_rejection_ratio(0.1);
64 }
65
70 void set_anderson_m(std::size_t m) { m_anderson_m = m; }
71
75 std::size_t get_anderson_m() const { return m_anderson_m; }
76
81 void set_beta(DataType beta) {
82 m_beta = std::clamp(beta, static_cast<DataType>(0), static_cast<DataType>(1));
83 }
84
88 DataType get_beta() const { return m_beta; }
89
94 void set_regularization(DataType lambda) {
95 m_regularization = std::max(static_cast<DataType>(0), lambda);
96 }
97
101 DataType get_regularization() const { return m_regularization; }
102
107 void set_enable_safeguarding(bool enable) { m_enable_safeguarding = enable; }
108
112 bool get_enable_safeguarding() const { return m_enable_safeguarding; }
113
118 return m_base_icp.get_correspondence_type_impl();
119 }
120
124 void set_enable_parallel(bool enable) {
125 m_base_icp.set_enable_parallel(enable);
126 }
127
131 bool get_enable_parallel() const {
132 return m_base_icp.get_enable_parallel();
133 }
134
135protected:
136 friend class base_fine_registration_t<aa_icp_t<DataType, KNNSearcher, BaseICP>, DataType>;
137
141 bool validate_input_impl() const {
142 // 基础验证交给base_icp自己处理
143 return true;
144 }
145
150 // 设置基础ICP的点云
151 m_base_icp.set_source(this->m_source_cloud);
152 m_base_icp.set_target(this->m_target_cloud);
153
154 // 传递最大对应距离设置
155 m_base_icp.set_max_correspondence_distance(this->m_max_correspondence_distance);
156
157 // 基础ICP会在自己的align中调用preprocess
158 }
159
163 bool align_impl(const transformation_t& initial_guess, result_type& result);
164
168 VectorX transformation_to_vector(const transformation_t& transform) const;
169
174
179 DataType& error,
180 std::size_t& num_correspondences);
181
185 VectorX anderson_acceleration_update(const std::deque<VectorX>& g_history,
186 const std::deque<VectorX>& x_history);
187
191 bool is_numerically_stable(const VectorX& vec) const;
192
193private:
194 base_icp_type m_base_icp;
195
196 std::size_t m_anderson_m = 5;
197 DataType m_beta = 0.5;
198 DataType m_regularization = 1e-6;
199 bool m_enable_safeguarding = true;
200
201 // Anderson加速的历史记录
202 std::deque<VectorX> m_g_history;
203 std::deque<VectorX> m_x_history;
204
205 bool m_initialized = false;
206};
207
208
209} // namespace toolbox::pcl
210
211// 包含实现文件 / Include implementation file
AA-ICP (Anderson Acceleration ICP) 算法实现 / AA-ICP algorithm implementation.
Definition aa_icp.hpp:43
Eigen::Matrix< DataType, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Definition aa_icp.hpp:53
BaseICP base_icp_type
Definition aa_icp.hpp:51
transformation_t vector_to_transformation(const VectorX &vec) const
将向量表示转换为变换矩阵 / Convert vector representation to transformation matrix
Definition aa_icp_impl.hpp:155
VectorX transformation_to_vector(const transformation_t &transform) const
将变换矩阵转换为向量表示 / Convert transformation matrix to vector representation
Definition aa_icp_impl.hpp:138
std::size_t get_anderson_m() const
获取Anderson加速的历史窗口大小 / Get Anderson acceleration history window size
Definition aa_icp.hpp:75
correspondence_type_e get_correspondence_type_impl() const
获取对应关系类型(从基础ICP继承) / Get correspondence type (inherited from base ICP)
Definition aa_icp.hpp:117
aa_icp_t(bool enable_parallel=false)
构造函数 / Constructor
Definition aa_icp.hpp:59
void set_beta(DataType beta)
设置阻尼因子 / Set damping factor
Definition aa_icp.hpp:81
DataType get_regularization() const
获取正则化参数 / Get regularization parameter
Definition aa_icp.hpp:101
bool validate_input_impl() const
额外的输入验证 / Additional input validation
Definition aa_icp.hpp:141
bool align_impl(const transformation_t &initial_guess, result_type &result)
执行配准 / Perform registration
Definition aa_icp_impl.hpp:9
fine_registration_result_t< DataType > result_type
Definition base_fine_registration.hpp:44
bool is_numerically_stable(const VectorX &vec) const
检查数值稳定性 / Check numerical stability
Definition aa_icp_impl.hpp:254
Eigen::Matrix< DataType, Eigen::Dynamic, 1 > VectorX
Definition aa_icp.hpp:52
void preprocess_impl()
预处理 / Preprocessing
Definition aa_icp.hpp:149
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition base_fine_registration.hpp:43
void set_regularization(DataType lambda)
设置正则化参数 / Set regularization parameter
Definition aa_icp.hpp:94
bool get_enable_safeguarding() const
获取是否启用安全保护 / Get whether safeguarding is enabled
Definition aa_icp.hpp:112
VectorX anderson_acceleration_update(const std::deque< VectorX > &g_history, const std::deque< VectorX > &x_history)
Anderson加速更新 / Anderson acceleration update.
Definition aa_icp_impl.hpp:211
void set_enable_parallel(bool enable)
设置是否启用并行优化 / Set whether to enable parallel optimization
Definition aa_icp.hpp:124
DataType get_beta() const
获取阻尼因子 / Get damping factor
Definition aa_icp.hpp:88
void set_anderson_m(std::size_t m)
设置Anderson加速的历史窗口大小 / Set Anderson acceleration history window size
Definition aa_icp.hpp:70
bool get_enable_parallel() const
获取是否启用并行优化 / Get whether parallel optimization is enabled
Definition aa_icp.hpp:131
void set_enable_safeguarding(bool enable)
设置是否启用安全保护 / Set whether to enable safeguarding
Definition aa_icp.hpp:107
transformation_t perform_base_icp_step(const transformation_t &current_transform, DataType &error, std::size_t &num_correspondences)
执行一步基础ICP迭代 / Perform one step of base ICP iteration
Definition aa_icp_impl.hpp:186
细配准算法的基类(CRTP模式) / Base class for fine registration algorithms (CRTP pattern)
Definition base_fine_registration.hpp:39
point_cloud_ptr m_source_cloud
Definition base_fine_registration.hpp:374
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
DataType m_max_correspondence_distance
Definition base_fine_registration.hpp:381
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
Definition base_correspondence_generator.hpp:18
correspondence_type_e
对应关系类型枚举 / Correspondence type enumeration
Definition base_fine_registration.hpp:21