cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
ndt.hpp
Go to the documentation of this file.
1#pragma once
2
6
7#include <Eigen/Core>
8#include <Eigen/Dense>
9#include <Eigen/Geometry>
10#include <unordered_map>
11#include <array>
12
13namespace toolbox::pcl
14{
15
45template<typename DataType>
46class ndt_t : public base_fine_registration_t<ndt_t<DataType>, DataType>
47{
48public:
50 using typename base_type::point_cloud;
51 using typename base_type::point_cloud_ptr;
52 using typename base_type::transformation_t;
53 using typename base_type::result_type;
54
56 using Vector3 = Eigen::Matrix<DataType, 3, 1>;
57 using Matrix3 = Eigen::Matrix<DataType, 3, 3>;
58 using Vector6 = Eigen::Matrix<DataType, 6, 1>;
59 using Matrix6 = Eigen::Matrix<DataType, 6, 6>;
60
64 struct voxel_cell_t {
65 Vector3 mean = Vector3::Zero();
66 Matrix3 covariance = Matrix3::Zero();
67 Matrix3 covariance_inv = Matrix3::Zero();
68 std::size_t num_points = 0;
69 bool valid = false;
70 };
71
76 explicit ndt_t(bool enable_parallel = false)
77 : m_enable_parallel(enable_parallel)
78 {
79 }
80
84 void set_enable_parallel(bool enable) { m_enable_parallel = enable; }
85
89 bool get_enable_parallel() const { return m_enable_parallel; }
90
97
102 void set_resolution(DataType resolution) {
103 m_resolution = std::max(static_cast<DataType>(0.01), resolution);
104 m_voxel_grid_updated = true;
105 }
106
110 DataType get_resolution() const { return m_resolution; }
111
116 void set_step_size(DataType step_size) {
117 m_step_size = std::max(static_cast<DataType>(0.001), step_size);
118 }
119
123 DataType get_step_size() const { return m_step_size; }
124
129 void set_outlier_ratio(DataType ratio) {
130 m_outlier_ratio = std::clamp(ratio, static_cast<DataType>(0), static_cast<DataType>(1));
131 }
132
136 DataType get_outlier_ratio() const { return m_outlier_ratio; }
137
141 void set_line_search_max_iterations(std::size_t max_iter) {
142 m_line_search_max_iterations = max_iter;
143 }
144
148 std::size_t get_line_search_max_iterations() const { return m_line_search_max_iterations; }
149
150protected:
151 friend class base_fine_registration_t<ndt_t<DataType>, DataType>;
152
156 void preprocess_impl();
157
161 bool align_impl(const transformation_t& initial_guess, result_type& result);
162
166 void build_voxel_grid();
167
171 std::array<int, 3> compute_voxel_index(const Vector3& point) const;
172
176 std::size_t get_voxel_key(const std::array<int, 3>& index) const;
177
181 DataType compute_objective(const transformation_t& transform,
182 Vector6* gradient = nullptr,
183 Matrix6* hessian = nullptr) const;
184
188 DataType compute_point_contribution(const Vector3& point,
189 const transformation_t& transform,
190 Vector6* gradient = nullptr,
191 Matrix6* hessian = nullptr) const;
192
196 DataType line_search(const transformation_t& current_transform,
197 const Vector6& direction,
198 DataType initial_step_size);
199
204
208 DataType gaussian_d1(DataType x_bar, DataType x,
209 const Matrix3& c_inv) const;
210
214 void compute_jacobian(const Vector3& point,
215 Eigen::Matrix<DataType, 3, 6>& jacobian) const;
216
217private:
218 bool m_enable_parallel;
219 DataType m_resolution = 1.0;
220 DataType m_step_size = 0.1;
221 DataType m_outlier_ratio = 0.55;
222 std::size_t m_line_search_max_iterations = 20;
223
224 bool m_voxel_grid_updated = true;
225 std::unordered_map<std::size_t, voxel_cell_t> m_voxel_grid;
226
227 // 预计算的常数
228 DataType m_gauss_d1 = 0;
229 DataType m_gauss_d2 = 0;
230};
231
232
233} // namespace toolbox::pcl
234
235// 包含实现文件 / 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
NDT (Normal Distributions Transform) 算法实现 / NDT algorithm implementation.
Definition ndt.hpp:47
void compute_jacobian(const Vector3 &point, Eigen::Matrix< DataType, 3, 6 > &jacobian) const
计算雅可比矩阵 / Compute Jacobian matrix
Definition ndt_impl.hpp:402
Eigen::Matrix< DataType, 6, 1 > Vector6
Definition ndt.hpp:58
void build_voxel_grid()
构建体素网格 / Build voxel grid
Definition ndt_impl.hpp:115
void set_step_size(DataType step_size)
设置步长 / Set step size
Definition ndt.hpp:116
void set_outlier_ratio(DataType ratio)
设置异常值比例 / Set outlier ratio
Definition ndt.hpp:129
DataType get_step_size() const
获取步长 / Get step size
Definition ndt.hpp:123
DataType get_outlier_ratio() const
获取异常值比例 / Get outlier ratio
Definition ndt.hpp:136
DataType get_resolution() const
获取体素分辨率 / Get voxel resolution
Definition ndt.hpp:110
std::size_t get_line_search_max_iterations() const
获取线搜索最大步长缩放次数 / Get line search maximum step scaling iterations
Definition ndt.hpp:148
transformation_t vector_to_transformation(const Vector6 &vec) const
将优化向量转换为变换矩阵 / Convert optimization vector to transformation matrix
Definition ndt_impl.hpp:356
void set_resolution(DataType resolution)
设置体素分辨率 / Set voxel resolution
Definition ndt.hpp:102
bool get_enable_parallel() const
获取是否启用并行优化 / Get whether parallel optimization is enabled
Definition ndt.hpp:89
DataType line_search(const transformation_t &current_transform, const Vector6 &direction, DataType initial_step_size)
执行More-Thuente线搜索 / Perform More-Thuente line search
Definition ndt_impl.hpp:286
Eigen::Matrix< DataType, 6, 6 > Matrix6
Definition ndt.hpp:59
void set_enable_parallel(bool enable)
设置是否启用并行优化 / Set whether to enable parallel optimization
Definition ndt.hpp:84
ndt_t(bool enable_parallel=false)
构造函数 / Constructor
Definition ndt.hpp:76
DataType compute_objective(const transformation_t &transform, Vector6 *gradient=nullptr, Matrix6 *hessian=nullptr) const
计算目标函数和梯度 / Compute objective function and gradient
Definition ndt_impl.hpp:196
std::array< int, 3 > compute_voxel_index(const Vector3 &point) const
计算体素索引 / Compute voxel index
Definition ndt_impl.hpp:174
std::size_t get_voxel_key(const std::array< int, 3 > &index) const
获取体素键值 / Get voxel key
Definition ndt_impl.hpp:184
bool align_impl(const transformation_t &initial_guess, result_type &result)
执行配准 / Perform registration
Definition ndt_impl.hpp:29
correspondence_type_e get_correspondence_type_impl() const
获取对应关系类型 / Get correspondence type
Definition ndt.hpp:94
void set_line_search_max_iterations(std::size_t max_iter)
设置线搜索最大步长缩放次数 / Set line search maximum step scaling iterations
Definition ndt.hpp:141
DataType gaussian_d1(DataType x_bar, DataType x, const Matrix3 &c_inv) const
计算高斯分布的值 / Compute Gaussian distribution value
Definition ndt_impl.hpp:393
void preprocess_impl()
预处理(构建体素网格) / Preprocessing (build voxel grid)
Definition ndt_impl.hpp:15
DataType compute_point_contribution(const Vector3 &point, const transformation_t &transform, Vector6 *gradient=nullptr, Matrix6 *hessian=nullptr) const
计算单个点的贡献 / Compute contribution of single point
Definition ndt_impl.hpp:218
Eigen::Matrix< DataType, 3, 3 > Matrix3
Definition ndt.hpp:57
Eigen::Matrix< DataType, 3, 1 > Vector3
Definition ndt.hpp:56
Definition base_correspondence_generator.hpp:18
correspondence_type_e
对应关系类型枚举 / Correspondence type enumeration
Definition base_fine_registration.hpp:21
体素单元结构 / Voxel cell structure
Definition ndt.hpp:64
std::size_t num_points
点数 / Number of points
Definition ndt.hpp:68
bool valid
是否有效 / Is valid
Definition ndt.hpp:69
Matrix3 covariance_inv
协方差矩阵的逆 / Inverse of covariance
Definition ndt.hpp:67
Vector3 mean
均值 / Mean
Definition ndt.hpp:65
Matrix3 covariance
协方差矩阵 / Covariance matrix
Definition ndt.hpp:66