gtsam_points
Loading...
Searching...
No Matches
gaussian_voxelmap_cpu.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#include <gtsam_points/types/gaussian_voxelmap.hpp>
8#include <gtsam_points/ann/incremental_voxelmap.hpp>
9
10namespace gtsam_points {
11
14public:
15 using Ptr = std::shared_ptr<GaussianVoxel>;
16 using ConstPtr = std::shared_ptr<const GaussianVoxel>;
17
18 struct Setting {};
19
21 GaussianVoxel() : finalized(false), num_points(0), mean(Eigen::Vector4d::Zero()), cov(Eigen::Matrix4d::Zero()), intensity(0.0) {}
22
24 size_t size() const { return 1; }
25
32 void add(const Setting& setting, const PointCloud& points, size_t i);
33
35 void finalize();
36
40 template <typename Result>
41 void knn_search(const Eigen::Vector4d& pt, Result& result) const {
42 const double sq_dist = (pt - mean).squaredNorm();
43 result.push(0, sq_dist);
44 }
45
46public:
47 bool finalized;
48 size_t num_points;
49 Eigen::Vector4d mean;
50 Eigen::Matrix4d cov;
51 double intensity;
52};
53
54namespace frame {
55
56template <>
58 static int size(const GaussianVoxel& frame) { return frame.size(); }
59
60 static bool has_points(const GaussianVoxel& frame) { return true; }
61 static bool has_normals(const GaussianVoxel& frame) { return false; }
62 static bool has_covs(const GaussianVoxel& frame) { return true; }
63 static bool has_intensities(const GaussianVoxel& frame) { return true; }
64
65 static const Eigen::Vector4d& point(const GaussianVoxel& frame, size_t i) { return frame.mean; }
66 static const Eigen::Vector4d normal(const GaussianVoxel& frame, size_t i) { return Eigen::Vector4d::Zero(); }
67 static const Eigen::Matrix4d& cov(const GaussianVoxel& frame, size_t i) { return frame.cov; }
68 static double intensity(const GaussianVoxel& frame, size_t i) { return frame.intensity; }
69};
70
71} // namespace frame
72
73class GaussianVoxelMapCPU : public GaussianVoxelMap, public IncrementalVoxelMap<GaussianVoxel> {
74public:
75 using Ptr = std::shared_ptr<GaussianVoxelMapCPU>;
76 using ConstPtr = std::shared_ptr<const GaussianVoxelMapCPU>;
77
80 GaussianVoxelMapCPU(double resolution);
81 virtual ~GaussianVoxelMapCPU();
82
84 virtual double voxel_resolution() const override;
85
87 Eigen::Vector3i voxel_coord(const Eigen::Vector4d& x) const;
88
90 int lookup_voxel_index(const Eigen::Vector3i& coord) const;
91
94
96 virtual void insert(const PointCloud& frame) override;
97
102 void save_compact(const std::string& path) const override;
103
108 static GaussianVoxelMapCPU::Ptr load(const std::string& path);
109};
110
111namespace frame {
112
113template <>
115 static bool has_points(const GaussianVoxelMapCPU& ivox) { return ivox.has_points(); }
116 static bool has_normals(const GaussianVoxelMapCPU& ivox) { return ivox.has_normals(); }
117 static bool has_covs(const GaussianVoxelMapCPU& ivox) { return ivox.has_covs(); }
118 static bool has_intensities(const GaussianVoxelMapCPU& ivox) { return ivox.has_intensities(); }
119
120 static decltype(auto) point(const GaussianVoxelMapCPU& ivox, size_t i) { return ivox.point(i); }
121 static decltype(auto) normal(const GaussianVoxelMapCPU& ivox, size_t i) { return ivox.normal(i); }
122 static decltype(auto) cov(const GaussianVoxelMapCPU& ivox, size_t i) { return ivox.cov(i); }
123 static decltype(auto) intensity(const GaussianVoxelMapCPU& ivox, size_t i) { return ivox.intensity(i); }
124};
125
126} // namespace frame
127
128} // namespace gtsam_points
Definition gaussian_voxelmap_cpu.hpp:73
void save_compact(const std::string &path) const override
Save the voxelmap.
virtual void insert(const PointCloud &frame) override
Insert a point cloud frame into the voxelmap.
static GaussianVoxelMapCPU::Ptr load(const std::string &path)
Load a voxelmap from a file.
GaussianVoxelMapCPU(double resolution)
Constructor.
const GaussianVoxel & lookup_voxel(int voxel_id) const
Look up a voxel.
Eigen::Vector3i voxel_coord(const Eigen::Vector4d &x) const
Compute the voxel index corresponding to a point.
virtual double voxel_resolution() const override
Voxel resolution.
int lookup_voxel_index(const Eigen::Vector3i &coord) const
Look up a voxel index. If the voxel does not exist, return -1.
Gaussian distribution voxelmap.
Definition gaussian_voxelmap.hpp:16
Definition gaussian_voxelmap_cpu.hpp:18
Gaussian voxel that computes and stores voxel mean and covariance.
Definition gaussian_voxelmap_cpu.hpp:13
double intensity
Intensity.
Definition gaussian_voxelmap_cpu.hpp:51
size_t size() const
Number of points in the voxel (Always 1 for GaussianVoxel).
Definition gaussian_voxelmap_cpu.hpp:24
GaussianVoxel()
Constructor.
Definition gaussian_voxelmap_cpu.hpp:21
bool finalized
If true, mean and cov are finalized, otherwise they represent the sum of input points.
Definition gaussian_voxelmap_cpu.hpp:47
Eigen::Matrix4d cov
Covariance.
Definition gaussian_voxelmap_cpu.hpp:50
void finalize()
Finalize the voxel mean and covariance.
Eigen::Vector4d mean
Mean.
Definition gaussian_voxelmap_cpu.hpp:49
void knn_search(const Eigen::Vector4d &pt, Result &result) const
Find k nearest neighbors.
Definition gaussian_voxelmap_cpu.hpp:41
size_t num_points
Number of input points.
Definition gaussian_voxelmap_cpu.hpp:48
void add(const Setting &setting, const PointCloud &points, size_t i)
Add a point to the voxel.
Incremental voxelmap. This class supports incremental point cloud insertion and LRU-based voxel delet...
Definition incremental_voxelmap.hpp:35
size_t voxel_id(const size_t i) const
Extract the point ID from a global index.
Definition incremental_voxelmap.hpp:85
Standard point cloud class that holds only pointers to point attributes.
Definition point_cloud.hpp:19
Definition frame_traits.hpp:17