gtsam_points
Loading...
Searching...
No Matches
integrated_loam_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
17template <typename TargetFrame, typename SourceFrame>
18class IntegratedPointToPlaneFactor_;
19template <typename TargetFrame, typename SourceFrame>
20class IntegratedPointToEdgeFactor_;
21
29template <typename TargetFrame = gtsam_points::PointCloud, typename SourceFrame = gtsam_points::PointCloud>
31public:
32 GTSAM_MAKE_ALIGNED_OPERATOR_NEW
33 using shared_ptr = gtsam_points::shared_ptr<IntegratedLOAMFactor_<TargetFrame, SourceFrame>>;
34
36 gtsam::Key target_key,
37 gtsam::Key source_key,
38 const std::shared_ptr<const TargetFrame>& target_edges,
39 const std::shared_ptr<const TargetFrame>& target_planes,
40 const std::shared_ptr<const SourceFrame>& source_edges,
41 const std::shared_ptr<const SourceFrame>& source_planes,
42 const std::shared_ptr<const NearestNeighborSearch>& target_edges_tree,
43 const std::shared_ptr<const NearestNeighborSearch>& target_planes_tree);
44
46 gtsam::Key target_key,
47 gtsam::Key source_key,
48 const std::shared_ptr<const TargetFrame>& target_edges,
49 const std::shared_ptr<const TargetFrame>& target_planes,
50 const std::shared_ptr<const SourceFrame>& source_edges,
51 const std::shared_ptr<const SourceFrame>& source_planes);
52
54
55 virtual void print(const std::string& s = "", const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const override;
56
57 virtual size_t memory_usage() const override;
58
59 // note: If your GTSAM is built with TBB, linearization is already multi-threaded
60 // : and setting n>1 can rather affect the processing speed
61 void set_num_threads(int n);
62 void set_max_correspondence_distance(double dist_edge, double dist_plane);
63 void set_correspondence_update_tolerance(double angle, double trans);
64 void set_enable_correspondence_validation(bool enable);
65
66private:
67 virtual void update_correspondences(const Eigen::Isometry3d& delta) const override;
68
69 virtual double evaluate(
70 const Eigen::Isometry3d& delta,
71 Eigen::Matrix<double, 6, 6>* H_target = nullptr,
72 Eigen::Matrix<double, 6, 6>* H_source = nullptr,
73 Eigen::Matrix<double, 6, 6>* H_target_source = nullptr,
74 Eigen::Matrix<double, 6, 1>* b_target = nullptr,
75 Eigen::Matrix<double, 6, 1>* b_source = nullptr) const override;
76
77protected:
78 // This method is called after update_correspondences()
79 // You can override this to reject invalid correspondences
80 // (e.g., rejecting edge correspondences in a same scan line)
81 virtual void validate_correspondences() const;
82
83private:
84 bool enable_correspondence_validation;
85 std::unique_ptr<IntegratedPointToEdgeFactor_<TargetFrame, SourceFrame>> edge_factor;
86 std::unique_ptr<IntegratedPointToPlaneFactor_<TargetFrame, SourceFrame>> plane_factor;
87};
88
89// Point-to-plane distance
90template <typename TargetFrame = gtsam_points::PointCloud, typename SourceFrame = gtsam_points::PointCloud>
92public:
93 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
94 using shared_ptr = gtsam_points::shared_ptr<IntegratedPointToPlaneFactor_<TargetFrame, SourceFrame>>;
95
96 friend class IntegratedLOAMFactor_<TargetFrame, SourceFrame>;
97
99 gtsam::Key target_key,
100 gtsam::Key source_key,
101 const std::shared_ptr<const TargetFrame>& target,
102 const std::shared_ptr<const SourceFrame>& source,
103 const std::shared_ptr<const NearestNeighborSearch>& target_tree);
104
106 gtsam::Key target_key,
107 gtsam::Key source_key,
108 const std::shared_ptr<const TargetFrame>& target,
109 const std::shared_ptr<const SourceFrame>& source);
110
112
113 virtual void print(const std::string& s = "", const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const override;
114
115 virtual size_t memory_usage() const override;
116
117 void set_num_threads(int n) { num_threads = n; }
118 void set_max_correspondence_distance(double dist) { max_correspondence_distance_sq = dist * dist; }
119 void set_correspondence_update_tolerance(double angle, double trans) {
120 correspondence_update_tolerance_rot = angle;
121 correspondence_update_tolerance_trans = trans;
122 }
123
124private:
125 virtual void update_correspondences(const Eigen::Isometry3d& delta) const override;
126
127 virtual double evaluate(
128 const Eigen::Isometry3d& delta,
129 Eigen::Matrix<double, 6, 6>* H_target = nullptr,
130 Eigen::Matrix<double, 6, 6>* H_source = nullptr,
131 Eigen::Matrix<double, 6, 6>* H_target_source = nullptr,
132 Eigen::Matrix<double, 6, 1>* b_target = nullptr,
133 Eigen::Matrix<double, 6, 1>* b_source = nullptr) const override;
134
135private:
136 int num_threads;
137 double max_correspondence_distance_sq;
138
139 std::shared_ptr<const NearestNeighborSearch> target_tree;
140
141 // I'm unhappy to have mutable members...
142 double correspondence_update_tolerance_rot;
143 double correspondence_update_tolerance_trans;
144 mutable Eigen::Isometry3d last_correspondence_point;
145 mutable std::vector<std::tuple<long, long, long>> correspondences;
146
147 std::shared_ptr<const TargetFrame> target;
148 std::shared_ptr<const SourceFrame> source;
149};
150
151// Point-to-edge distance
152template <typename TargetFrame = gtsam_points::PointCloud, typename SourceFrame = gtsam_points::PointCloud>
154public:
155 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
156 using shared_ptr = gtsam_points::shared_ptr<IntegratedPointToEdgeFactor_<TargetFrame, SourceFrame>>;
157
158 friend class IntegratedLOAMFactor_<TargetFrame, SourceFrame>;
159
161 gtsam::Key target_key,
162 gtsam::Key source_key,
163 const std::shared_ptr<const TargetFrame>& target,
164 const std::shared_ptr<const SourceFrame>& source,
165 const std::shared_ptr<const NearestNeighborSearch>& target_tree);
166
168 gtsam::Key target_key,
169 gtsam::Key source_key,
170 const std::shared_ptr<const TargetFrame>& target,
171 const std::shared_ptr<const SourceFrame>& source);
172
174
175 virtual void print(const std::string& s = "", const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const override;
176
177 virtual size_t memory_usage() const override;
178
179 void set_num_threads(int n) { num_threads = n; }
180 void set_max_correspondence_distance(double dist) { max_correspondence_distance_sq = dist * dist; }
181 void set_correspondence_update_tolerance(double angle, double trans) {
182 correspondence_update_tolerance_rot = angle;
183 correspondence_update_tolerance_trans = trans;
184 }
185
186private:
187 virtual void update_correspondences(const Eigen::Isometry3d& delta) const override;
188
189 virtual double evaluate(
190 const Eigen::Isometry3d& delta,
191 Eigen::Matrix<double, 6, 6>* H_target = nullptr,
192 Eigen::Matrix<double, 6, 6>* H_source = nullptr,
193 Eigen::Matrix<double, 6, 6>* H_target_source = nullptr,
194 Eigen::Matrix<double, 6, 1>* b_target = nullptr,
195 Eigen::Matrix<double, 6, 1>* b_source = nullptr) const override;
196
197private:
198 int num_threads;
199 double max_correspondence_distance_sq;
200
201 std::shared_ptr<const NearestNeighborSearch> target_tree;
202
203 // I'm unhappy to have mutable members...
204 double correspondence_update_tolerance_rot;
205 double correspondence_update_tolerance_trans;
206 mutable Eigen::Isometry3d last_correspondence_point;
207 mutable std::vector<std::tuple<long, long>> correspondences;
208
209 std::shared_ptr<const TargetFrame> target;
210 std::shared_ptr<const SourceFrame> source;
211};
212
213using IntegratedLOAMFactor = gtsam_points::IntegratedLOAMFactor_<>;
214using IntegratedPointToPlaneFactor = gtsam_points::IntegratedPointToPlaneFactor_<>;
215using IntegratedPointToEdgeFactor = gtsam_points::IntegratedPointToEdgeFactor_<>;
216
217} // namespace gtsam_points
Scan matching factor based on the combination of point-to-plane and point-to-edge distances.
Definition integrated_loam_factor.hpp:30
virtual size_t memory_usage() const override
Calculate the memory usage of this factor.
Definition integrated_loam_factor_impl.hpp:422
virtual void print(const std::string &s="", const gtsam::KeyFormatter &keyFormatter=gtsam::DefaultKeyFormatter) const override
Print the factor information.
Definition integrated_loam_factor_impl.hpp:412
Abstraction of LSQ-based scan matching constraints between point clouds.
Definition integrated_matching_cost_factor.hpp:19
Definition integrated_loam_factor.hpp:153
virtual void print(const std::string &s="", const gtsam::KeyFormatter &keyFormatter=gtsam::DefaultKeyFormatter) const override
Print the factor information.
Definition integrated_loam_factor_impl.hpp:282
virtual size_t memory_usage() const override
Calculate the memory usage of this factor.
Definition integrated_loam_factor_impl.hpp:295
Definition integrated_loam_factor.hpp:91
virtual void print(const std::string &s="", const gtsam::KeyFormatter &keyFormatter=gtsam::DefaultKeyFormatter) const override
Print the factor information.
Definition integrated_loam_factor_impl.hpp:62
virtual size_t memory_usage() const override
Calculate the memory usage of this factor.
Definition integrated_loam_factor_impl.hpp:75