PointCloudToVoxelGridSingle.h
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------
2  * A repertory of multi primitive-to-primitive (MP2P) ICP algorithms in C++
3  * Copyright (C) 2018-2024 Jose Luis Blanco, University of Almeria
4  * See LICENSE for license information.
5  * ------------------------------------------------------------------------- */
13 #pragma once
14 
15 #include <mrpt/core/pimpl.h>
16 #include <mrpt/maps/CPointsMap.h>
17 
18 #include <optional>
19 
21 namespace mp2p_icp_filters
22 {
29 {
30  public:
33 
35  void setResolution(const float voxel_size);
36 
37  void processPointCloud(const mrpt::maps::CPointsMap& p);
38 
41  void clear();
42 
44  struct voxel_t
45  {
46  std::optional<mrpt::math::TPoint3Df> point;
47  std::optional<size_t> pointIdx; // Index in the source
48  std::optional<const mrpt::maps::CPointsMap*> source;
49 
51  uint32_t pointCount = 0;
52  };
53 
54  struct indices_t
55  {
56  indices_t(int32_t cx, int32_t cy, int32_t cz) : cx_(cx), cy_(cy), cz_(cz) {}
57 
58  int32_t cx_ = 0, cy_ = 0, cz_ = 0;
59 
60  bool operator==(const indices_t& o) const
61  {
62  return cx_ == o.cx_ && cy_ == o.cy_ && cz_ == o.cz_;
63  }
64  };
65 
73  struct IndicesHash
74  {
76  std::size_t operator()(const indices_t& k) const noexcept
77  {
78  // These are the implicit assumptions of the reinterpret cast below:
79  static_assert(sizeof(indices_t::cx_) == sizeof(uint32_t));
80  static_assert(offsetof(indices_t, cx_) == 0 * sizeof(uint32_t));
81  static_assert(offsetof(indices_t, cy_) == 1 * sizeof(uint32_t));
82  static_assert(offsetof(indices_t, cz_) == 2 * sizeof(uint32_t));
83 
84  const uint32_t* vec = reinterpret_cast<const uint32_t*>(&k);
85  return ((1 << 20) - 1) & (vec[0] * 73856093 ^ vec[1] * 19349663 ^ vec[2] * 83492791);
86  }
87 
88  // k1 < k2?
89  bool operator()(const indices_t& k1, const indices_t& k2) const noexcept
90  {
91  if (k1.cx_ != k2.cx_) return k1.cx_ < k2.cx_;
92  if (k1.cy_ != k2.cy_) return k1.cy_ < k2.cy_;
93  return k1.cz_ < k2.cz_;
94  }
95  };
96 
97  inline int32_t coord2idx(float xyz) const { return static_cast<int32_t>(xyz / resolution_); }
98 
99  void visit_voxels(
100  const std::function<void(const indices_t idx, const voxel_t& vxl)>& userCode) const;
101 
103  size_t size() const;
104 
105  private:
107  float resolution_ = 0.20f;
108 
111  struct Impl;
112  mrpt::pimpl<Impl> impl_;
113 };
114 
115 } // namespace mp2p_icp_filters
mp2p_icp_filters::PointCloudToVoxelGridSingle::size
size_t size() const
Returns the number of occupied voxels.
Definition: PointCloudToVoxelGridSingle.cpp:91
mp2p_icp_filters::PointCloudToVoxelGridSingle::indices_t::cz_
int32_t cz_
Definition: PointCloudToVoxelGridSingle.h:58
mp2p_icp_filters::PointCloudToVoxelGridSingle::coord2idx
int32_t coord2idx(float xyz) const
Definition: PointCloudToVoxelGridSingle.h:97
mp2p_icp_filters::PointCloudToVoxelGridSingle::processPointCloud
void processPointCloud(const mrpt::maps::CPointsMap &p)
Definition: PointCloudToVoxelGridSingle.cpp:36
mp2p_icp_filters::PointCloudToVoxelGridSingle::indices_t::operator==
bool operator==(const indices_t &o) const
Definition: PointCloudToVoxelGridSingle.h:60
mp2p_icp_filters::PointCloudToVoxelGridSingle::clear
void clear()
Definition: PointCloudToVoxelGridSingle.cpp:78
mp2p_icp_filters::PointCloudToVoxelGridSingle::voxel_t::pointCount
uint32_t pointCount
Definition: PointCloudToVoxelGridSingle.h:51
mp2p_icp_filters::PointCloudToVoxelGridSingle::voxel_t::point
std::optional< mrpt::math::TPoint3Df > point
Definition: PointCloudToVoxelGridSingle.h:46
mp2p_icp_filters::PointCloudToVoxelGridSingle::indices_t::cx_
int32_t cx_
Definition: PointCloudToVoxelGridSingle.h:58
mp2p_icp_filters::PointCloudToVoxelGridSingle::IndicesHash::operator()
bool operator()(const indices_t &k1, const indices_t &k2) const noexcept
Definition: PointCloudToVoxelGridSingle.h:89
mp2p_icp_filters::PointCloudToVoxelGridSingle::indices_t::indices_t
indices_t(int32_t cx, int32_t cy, int32_t cz)
Definition: PointCloudToVoxelGridSingle.h:56
mp2p_icp_filters::PointCloudToVoxelGridSingle::indices_t::cy_
int32_t cy_
Definition: PointCloudToVoxelGridSingle.h:58
mp2p_icp_filters::PointCloudToVoxelGridSingle::~PointCloudToVoxelGridSingle
~PointCloudToVoxelGridSingle()
Definition: PointCloudToVoxelGridSingle.h:32
mp2p_icp_filters::PointCloudToVoxelGridSingle::visit_voxels
void visit_voxels(const std::function< void(const indices_t idx, const voxel_t &vxl)> &userCode) const
Definition: PointCloudToVoxelGridSingle.cpp:85
mp2p_icp_filters::PointCloudToVoxelGridSingle::voxel_t
Definition: PointCloudToVoxelGridSingle.h:44
mp2p_icp_filters::PointCloudToVoxelGridSingle::Impl
Definition: PointCloudToVoxelGridSingle.cpp:19
mp2p_icp_filters::PointCloudToVoxelGridSingle::IndicesHash
Definition: PointCloudToVoxelGridSingle.h:73
mp2p_icp_filters::PointCloudToVoxelGridSingle
Definition: PointCloudToVoxelGridSingle.h:28
mp2p_icp_filters::PointCloudToVoxelGridSingle::resolution_
float resolution_
Definition: PointCloudToVoxelGridSingle.h:107
mp2p_icp_filters::PointCloudToVoxelGridSingle::PointCloudToVoxelGridSingle
PointCloudToVoxelGridSingle()
Definition: PointCloudToVoxelGridSingle.cpp:24
mp2p_icp_filters::PointCloudToVoxelGridSingle::voxel_t::pointIdx
std::optional< size_t > pointIdx
Definition: PointCloudToVoxelGridSingle.h:47
mp2p_icp_filters::PointCloudToVoxelGridSingle::setResolution
void setResolution(const float voxel_size)
Definition: PointCloudToVoxelGridSingle.cpp:26
mp2p_icp_filters::PointCloudToVoxelGridSingle::indices_t
Definition: PointCloudToVoxelGridSingle.h:54
mp2p_icp_filters::PointCloudToVoxelGridSingle::impl_
mrpt::pimpl< Impl > impl_
Definition: PointCloudToVoxelGridSingle.h:111
mp2p_icp_filters::PointCloudToVoxelGridSingle::IndicesHash::operator()
std::size_t operator()(const indices_t &k) const noexcept
Hash operator for unordered maps:
Definition: PointCloudToVoxelGridSingle.h:76
mp2p_icp_filters::PointCloudToVoxelGridSingle::voxel_t::source
std::optional< const mrpt::maps::CPointsMap * > source
Definition: PointCloudToVoxelGridSingle.h:48
mp2p_icp_filters
Definition: FilterAdjustTimestamps.h:19


mp2p_icp
Author(s):
autogenerated on Mon May 26 2025 02:45:50