gtsam_points
Loading...
Searching...
No Matches
incremental_covariance_container.hpp
1// SPDX-FileCopyrightText: Copyright 2024 Kenji Koide
2// SPDX-License-Identifier: MIT
3#pragma once
4
5#include <Eigen/Core>
6#include <gtsam_points/types/point_cloud.hpp>
7
8namespace gtsam_points {
9
12public:
14 struct Setting {
15 void set_min_dist_in_cell(double dist) { this->min_sq_dist_in_cell = dist * dist; }
16 void set_max_num_points_in_cell(size_t num_points) { this->max_num_points_in_cell = num_points; }
17
18 double min_sq_dist_in_cell = 0.1 * 0.1;
20 };
21
24
26 size_t size() const { return points.size(); }
27
29 void add(const Setting& setting, const PointCloud& points, size_t i);
30
32 void finalize() {}
33
37 template <typename Result>
38 void knn_search(const Eigen::Vector4d& pt, Result& result) const {
39 if (points.empty()) {
40 return;
41 }
42
43 for (size_t i = 0; i < points.size(); i++) {
44 if (!valid(flags[i])) {
45 continue;
46 }
47
48 result.push(i, (points[i] - pt).squaredNorm());
49 }
50 }
51
55 template <typename Result>
56 void knn_search_force(const Eigen::Vector4d& pt, Result& result) const {
57 if (points.empty()) {
58 return;
59 }
60
61 for (size_t i = 0; i < points.size(); i++) {
62 result.push(i, (points[i] - pt).squaredNorm());
63 }
64 }
65
67 void set_valid(int i) { flags[i] |= VALID_BIT; }
68
70 bool valid(int i) const { return flags[i] & VALID_BIT; }
71
73 size_t birthday(int i) const { return flags[i] & BIRTHDAY_MASK; }
74
76 size_t age(int i, size_t lru) const { return lru - birthday(i); }
77
79 size_t remove_old_invalid(int age_thresh, size_t lru);
80
81public:
82 static constexpr size_t VALID_BIT = 1ull << 63;
83 static constexpr size_t BIRTHDAY_MASK = (VALID_BIT >> 1) - 1;
84
85 std::vector<Eigen::Vector4d> points;
86
87 std::vector<size_t> flags;
88 std::vector<Eigen::Vector4d> normals;
89 std::vector<Eigen::Matrix4d> covs;
90};
91
92namespace frame {
93
94template <>
96 static int size(const IncrementalCovarianceContainer& frame) { return frame.size(); }
97
98 static bool has_points(const IncrementalCovarianceContainer& frame) { return !frame.points.empty(); }
99 static bool has_normals(const IncrementalCovarianceContainer& frame) { return true; }
100 static bool has_covs(const IncrementalCovarianceContainer& frame) { return true; }
101 static bool has_intensities(const IncrementalCovarianceContainer& frame) { return false; }
102
103 static const Eigen::Vector4d& point(const IncrementalCovarianceContainer& frame, size_t i) { return frame.points[i]; }
104 static const Eigen::Vector4d& normal(const IncrementalCovarianceContainer& frame, size_t i) { return frame.normals[i]; }
105 static const Eigen::Matrix4d& cov(const IncrementalCovarianceContainer& frame, size_t i) { return frame.covs[i]; }
106 static double intensity(const IncrementalCovarianceContainer& frame, size_t i) { return 0.0; }
107};
108
109} // namespace frame
110
111} // namespace gtsam_points
FlatContainer setting.
Definition incremental_covariance_container.hpp:14
size_t max_num_points_in_cell
Maximum number of points in a cell.
Definition incremental_covariance_container.hpp:19
double min_sq_dist_in_cell
Minimum squared distance between points in a cell.
Definition incremental_covariance_container.hpp:18
Linear container for incremental covariance and normal estimation.
Definition incremental_covariance_container.hpp:11
void finalize()
Finalize the container (Nothing to do for FlatContainer).
Definition incremental_covariance_container.hpp:32
size_t age(int i, size_t lru) const
Get the time since the i-th point was inserted.
Definition incremental_covariance_container.hpp:76
std::vector< Eigen::Vector4d > points
Points.
Definition incremental_covariance_container.hpp:85
size_t size() const
Number of points in the container.
Definition incremental_covariance_container.hpp:26
std::vector< size_t > flags
State flags.
Definition incremental_covariance_container.hpp:87
size_t remove_old_invalid(int age_thresh, size_t lru)
Remove old invalid points.
std::vector< Eigen::Matrix4d > covs
Covariances.
Definition incremental_covariance_container.hpp:89
void knn_search_force(const Eigen::Vector4d &pt, Result &result) const
Find k nearest neighbors.
Definition incremental_covariance_container.hpp:56
size_t birthday(int i) const
Get the time when the i-th point was inserted.
Definition incremental_covariance_container.hpp:73
std::vector< Eigen::Vector4d > normals
Normals.
Definition incremental_covariance_container.hpp:88
void set_valid(int i)
Set the i-th point as valid.
Definition incremental_covariance_container.hpp:67
bool valid(int i) const
Check if the i-th point is valid.
Definition incremental_covariance_container.hpp:70
void knn_search(const Eigen::Vector4d &pt, Result &result) const
Find k nearest neighbors.
Definition incremental_covariance_container.hpp:38
void add(const Setting &setting, const PointCloud &points, size_t i)
Add a point to the container.
Standard point cloud class that holds only pointers to point attributes.
Definition point_cloud.hpp:19
Definition frame_traits.hpp:17