gtsam_points
Loading...
Searching...
No Matches
integrated_ct_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/geometry/Pose3.h>
7#include <gtsam/nonlinear/NonlinearFactorGraph.h>
8
9#include <gtsam_points/util/gtsam_migration.hpp>
10#include <gtsam_points/types/point_cloud.hpp>
11
12namespace gtsam_points {
13
14struct NearestNeighborSearch;
15
20template <typename TargetFrame = gtsam_points::PointCloud, typename SourceFrame = gtsam_points::PointCloud>
21class IntegratedCT_ICPFactor_ : public gtsam::NonlinearFactor {
22public:
23 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
24 using shared_ptr = gtsam_points::shared_ptr<IntegratedCT_ICPFactor_<TargetFrame, SourceFrame>>;
25
35 gtsam::Key source_t0_key,
36 gtsam::Key source_t1_key,
37 const std::shared_ptr<const TargetFrame>& target,
38 const std::shared_ptr<const SourceFrame>& source,
39 const std::shared_ptr<const NearestNeighborSearch>& target_tree);
40
49 gtsam::Key source_t0_key,
50 gtsam::Key source_t1_key,
51 const std::shared_ptr<const TargetFrame>& target,
52 const std::shared_ptr<const SourceFrame>& source);
53
54 virtual ~IntegratedCT_ICPFactor_() override;
55
57 virtual void print(const std::string& s = "", const gtsam::KeyFormatter& keyFormatter = gtsam::DefaultKeyFormatter) const override;
58
59 virtual size_t memory_usage() const;
60
61 virtual size_t dim() const override { return 6; }
62 virtual double error(const gtsam::Values& values) const override;
63 virtual gtsam::GaussianFactor::shared_ptr linearize(const gtsam::Values& values) const override;
64
65 void set_num_threads(int n) { num_threads = n; }
66 void set_max_correspondence_distance(double dist) { max_correspondence_distance_sq = dist * dist; }
67
68 const std::vector<double>& get_time_table() const { return time_table; }
69 const std::vector<int>& get_time_indices() const { return time_indices; }
70 const std::vector<gtsam::Pose3>& get_source_poses() const { return source_poses; }
71
72 std::vector<Eigen::Vector4d> deskewed_source_points(const gtsam::Values& values, bool local = false);
73
74public:
75 virtual void update_poses(const gtsam::Values& values) const;
76
77protected:
78 virtual void update_correspondences() const;
79
80protected:
81 int num_threads;
82 double max_correspondence_distance_sq;
83
84 std::shared_ptr<const NearestNeighborSearch> target_tree;
85
86 std::vector<double> time_table;
87 mutable std::vector<gtsam::Pose3> source_poses;
88 mutable std::vector<gtsam::Matrix6> pose_derivatives_t0;
89 mutable std::vector<gtsam::Matrix6> pose_derivatives_t1;
90
91 std::vector<int> time_indices;
92 mutable std::vector<long> correspondences;
93
94 std::shared_ptr<const TargetFrame> target;
95 std::shared_ptr<const SourceFrame> source;
96};
97
98using IntegratedCT_ICPFactor = IntegratedCT_ICPFactor_<>;
99
100} // namespace gtsam_points
Continuous Time ICP Factor Bellenbach et al., "CT-ICP: Real-time Elastic LiDAR Odometry with Loop Clo...
Definition integrated_ct_icp_factor.hpp:21
virtual void print(const std::string &s="", const gtsam::KeyFormatter &keyFormatter=gtsam::DefaultKeyFormatter) const override
Print the factor information.
Definition integrated_ct_icp_factor_impl.hpp:76