gtsam_points
Loading...
Searching...
No Matches
integrated_icp_factor.hpp
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2021 Kenji Koide (k.koide@aist.go.jp)
3
4#pragma once
5
6#include <gtsam/nonlinear/NonlinearFactor.h>
7
8#include <memory>
9#include <gtsam_points/util/gtsam_migration.hpp>
10#include <gtsam_points/types/point_cloud.hpp>
11#include <gtsam_points/factors/integrated_matching_cost_factor.hpp>
12
13namespace gtsam_points {
14
15struct NearestNeighborSearch;
16
21template <typename TargetFrame = gtsam_points::PointCloud, typename SourceFrame = gtsam_points::PointCloud>
23public:
24 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
25 using shared_ptr = gtsam_points::shared_ptr<IntegratedICPFactor_<PointCloud>>;
26
37 gtsam::Key target_key,
38 gtsam::Key source_key,
39 const std::shared_ptr<const TargetFrame>& target,
40 const std::shared_ptr<const SourceFrame>& source,
41 const std::shared_ptr<const NearestNeighborSearch>& target_tree,
42 bool use_point_to_plane = false);
43
46 gtsam::Key target_key,
47 gtsam::Key source_key,
48 const std::shared_ptr<const TargetFrame>& target,
49 const std::shared_ptr<const SourceFrame>& source,
50 bool use_point_to_plane = false);
51
62 const gtsam::Pose3& fixed_target_pose,
63 gtsam::Key source_key,
64 const std::shared_ptr<const TargetFrame>& target,
65 const std::shared_ptr<const SourceFrame>& source,
66 const std::shared_ptr<const NearestNeighborSearch>& target_tree,
67 bool use_point_to_plane = false);
68
71 const gtsam::Pose3& fixed_target_pose,
72 gtsam::Key source_key,
73 const std::shared_ptr<const TargetFrame>& target,
74 const std::shared_ptr<const SourceFrame>& source,
75 bool use_point_to_plane = false);
76
77 virtual ~IntegratedICPFactor_() override;
78
80 virtual void print(const std::string& s = "", const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const override;
81
87 virtual size_t memory_usage() const override;
88
92 void set_num_threads(int n) { num_threads = n; }
93
96 void set_max_correspondence_distance(double dist) { max_correspondence_distance_sq = dist * dist; }
97
99 void set_point_to_plane_distance(bool use) { use_point_to_plane = use; }
100
103 void set_correspondence_update_tolerance(double angle, double trans) {
104 correspondence_update_tolerance_rot = angle;
105 correspondence_update_tolerance_trans = trans;
106 }
107
108private:
109 virtual void update_correspondences(const Eigen::Isometry3d& delta) const override;
110
111 virtual double evaluate(
112 const Eigen::Isometry3d& delta,
113 Eigen::Matrix<double, 6, 6>* H_target = nullptr,
114 Eigen::Matrix<double, 6, 6>* H_source = nullptr,
115 Eigen::Matrix<double, 6, 6>* H_target_source = nullptr,
116 Eigen::Matrix<double, 6, 1>* b_target = nullptr,
117 Eigen::Matrix<double, 6, 1>* b_source = nullptr) const override;
118
119private:
120 int num_threads;
121 double max_correspondence_distance_sq;
122 bool use_point_to_plane;
123
124 std::shared_ptr<const NearestNeighborSearch> target_tree;
125
126 // I'm unhappy to have mutable members...
127 double correspondence_update_tolerance_rot;
128 double correspondence_update_tolerance_trans;
129 mutable Eigen::Isometry3d last_correspondence_point;
130 mutable std::vector<long> correspondences;
131
132 std::shared_ptr<const TargetFrame> target;
133 std::shared_ptr<const SourceFrame> source;
134};
135
139template <typename TargetFrame = gtsam_points::PointCloud, typename SourceFrame = gtsam_points::PointCloud>
141public:
142 using shared_ptr = gtsam_points::shared_ptr<IntegratedPointToPlaneICPFactor_<TargetFrame, SourceFrame>>;
143
145 gtsam::Key target_key,
146 gtsam::Key source_key,
147 const std::shared_ptr<const TargetFrame>& target,
148 const std::shared_ptr<const SourceFrame>& source,
149 const std::shared_ptr<const NearestNeighborSearch>& target_tree)
150 : IntegratedICPFactor_<TargetFrame, SourceFrame>(target_key, source_key, target, source, target_tree, true) {}
151
153 gtsam::Key target_key,
154 gtsam::Key source_key,
155 const std::shared_ptr<const TargetFrame>& target,
156 const std::shared_ptr<const SourceFrame>& source)
157 : IntegratedICPFactor_<TargetFrame, SourceFrame>(target_key, source_key, target, source, true) {}
158};
159
160using IntegratedICPFactor = IntegratedICPFactor_<>;
161using IntegratedPointToPlaneICPFactor = IntegratedPointToPlaneICPFactor_<>;
162
163} // namespace gtsam_points
Naive point-to-point ICP matching cost factor Zhang, "Iterative Point Matching for Registration of Fr...
Definition integrated_icp_factor.hpp:22
void set_max_correspondence_distance(double dist)
Set the maximum distance between corresponding points. Correspondences with distances larger than thi...
Definition integrated_icp_factor.hpp:96
void set_point_to_plane_distance(bool use)
Enable or disable point-to-plane distance computation.
Definition integrated_icp_factor.hpp:99
void set_correspondence_update_tolerance(double angle, double trans)
Correspondences are updated only when the displacement from the last update point is larger than thes...
Definition integrated_icp_factor.hpp:103
virtual size_t memory_usage() const override
Calculate the memory usage of this factor.
Definition integrated_icp_factor_impl.hpp:123
virtual void print(const std::string &s="", const gtsam::KeyFormatter &keyFormatter=gtsam::DefaultKeyFormatter) const override
Print the factor information.
Definition integrated_icp_factor_impl.hpp:110
void set_num_threads(int n)
Set the number of thread used for linearization of this factor.
Definition integrated_icp_factor.hpp:92
Abstraction of LSQ-based scan matching constraints between point clouds.
Definition integrated_matching_cost_factor.hpp:19
Point-to-plane ICP factor.
Definition integrated_icp_factor.hpp:140