gtsam_points
Loading...
Searching...
No Matches
flat_container.hpp
1// SPDX-FileCopyrightText: Copyright 2024 Kenji Koide
2// SPDX-License-Identifier: MIT
3#pragma once
4
5#include <queue>
6#include <Eigen/Core>
7#include <Eigen/Geometry>
8#include <gtsam_points/ann/knn_result.hpp>
9#include <gtsam_points/types/point_cloud.hpp>
10#include <gtsam_points/types/frame_traits.hpp>
11
12namespace gtsam_points {
13
16public:
18 struct Setting {
19 void set_min_dist_in_cell(double dist) { this->min_sq_dist_in_cell = dist * dist; }
20 void set_max_num_points_in_cell(size_t num_points) { this->max_num_points_in_cell = num_points; }
21
22 double min_sq_dist_in_cell = 0.1 * 0.1;
24 };
25
27 FlatContainer() { points.reserve(10); }
28
30 size_t size() const { return points.size(); }
31
33 void add(const Setting& setting, const PointCloud& points, size_t i) {
34 if (
35 this->points.size() >= setting.max_num_points_in_cell || //
36 std::any_of(
37 this->points.begin(),
38 this->points.end(),
39 [&](const auto& pt) { return (pt - points.points[i]).squaredNorm() < setting.min_sq_dist_in_cell; }) //
40 ) {
41 return;
42 }
43
44 this->points.emplace_back(points.points[i]);
45 if (points.normals) {
46 this->normals.emplace_back(points.normals[i]);
47 }
48 if (points.covs) {
49 this->covs.emplace_back(points.covs[i]);
50 }
51 if (points.intensities) {
52 this->intensities.emplace_back(points.intensities[i]);
53 }
54 }
55
57 void finalize() {}
58
62 template <typename Result>
63 void knn_search(const Eigen::Vector4d& pt, Result& result) const {
64 if (points.empty()) {
65 return;
66 }
67
68 for (size_t i = 0; i < points.size(); i++) {
69 const double sq_dist = (points[i] - pt).squaredNorm();
70 result.push(i, sq_dist);
71 }
72 }
73
74public:
75 std::vector<Eigen::Vector4d> points;
76 std::vector<Eigen::Vector4d> normals;
77 std::vector<Eigen::Matrix4d> covs;
78 std::vector<double> intensities;
79};
80
81namespace frame {
82
83template <>
85 static int size(const FlatContainer& frame) { return frame.size(); }
86
87 static bool has_points(const FlatContainer& frame) { return !frame.points.empty(); }
88 static bool has_normals(const FlatContainer& frame) { return !frame.normals.empty(); }
89 static bool has_covs(const FlatContainer& frame) { return !frame.covs.empty(); }
90 static bool has_intensities(const FlatContainer& frame) { return !frame.intensities.empty(); }
91
92 static const Eigen::Vector4d& point(const FlatContainer& frame, size_t i) { return frame.points[i]; }
93 static const Eigen::Vector4d& normal(const FlatContainer& frame, size_t i) { return frame.normals[i]; }
94 static const Eigen::Matrix4d& cov(const FlatContainer& frame, size_t i) { return frame.covs[i]; }
95 static double intensity(const FlatContainer& frame, size_t i) { return frame.intensities[i]; }
96};
97
98} // namespace frame
99
100} // namespace gtsam_points
FlatContainer setting.
Definition flat_container.hpp:18
double min_sq_dist_in_cell
Minimum squared distance between points in a cell.
Definition flat_container.hpp:22
size_t max_num_points_in_cell
Maximum number of points in a cell.
Definition flat_container.hpp:23
Point container with a flat vector.
Definition flat_container.hpp:15
void knn_search(const Eigen::Vector4d &pt, Result &result) const
Find k nearest neighbors.
Definition flat_container.hpp:63
size_t size() const
Number of points.
Definition flat_container.hpp:30
std::vector< Eigen::Matrix4d > covs
Covariances.
Definition flat_container.hpp:77
std::vector< double > intensities
Intensities.
Definition flat_container.hpp:78
std::vector< Eigen::Vector4d > normals
Normals.
Definition flat_container.hpp:76
FlatContainer()
Constructor.
Definition flat_container.hpp:27
std::vector< Eigen::Vector4d > points
Points.
Definition flat_container.hpp:75
void add(const Setting &setting, const PointCloud &points, size_t i)
Add a point to the container.
Definition flat_container.hpp:33
void finalize()
Finalize the container (Nothing to do for FlatContainer).
Definition flat_container.hpp:57
Standard point cloud class that holds only pointers to point attributes.
Definition point_cloud.hpp:19
Eigen::Vector4d * normals
Point normals (nx, ny, nz, 0)
Definition point_cloud.hpp:107
Eigen::Matrix4d * covs
Point covariances cov(3, 3) = 0.
Definition point_cloud.hpp:108
size_t size() const
Number of points.
Definition point_cloud.hpp:43
double * intensities
Point intensities.
Definition point_cloud.hpp:109
Definition frame_traits.hpp:17