PointCloudToVoxelGrid.cpp
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-2021 Jose Luis Blanco, University of Almeria
4  * See LICENSE for license information.
5  * ------------------------------------------------------------------------- */
19 
20 using namespace mp2p_icp_filters;
21 
23  const mrpt::math::TPoint3D& min_corner,
24  const mrpt::math::TPoint3D& max_corner, const float voxel_size)
25 {
26  MRPT_START
27 
28  pts_voxels.clear();
29  pts_voxels.setSize(
30  min_corner.x, max_corner.x, min_corner.y, max_corner.y, min_corner.z,
31  max_corner.z, voxel_size, voxel_size);
32 
33  used_voxel_indices.clear();
34  used_voxel_indices.reserve(pts_voxels.getVoxelCount() / 4);
35 
36  MRPT_END
37 }
38 
39 void PointCloudToVoxelGrid::processPointCloud(const mrpt::maps::CPointsMap& p)
40 {
41  using mrpt::max3;
42  using std::abs;
43 
44  const auto& xs = p.getPointsBufferRef_x();
45  const auto& ys = p.getPointsBufferRef_y();
46  const auto& zs = p.getPointsBufferRef_z();
47  const auto npts = xs.size();
48 
49  // Previous point:
50  float x0, y0, z0;
51  x0 = y0 = z0 = std::numeric_limits<float>::max();
52 
53  for (std::size_t i = 0; i < npts; i++)
54  {
55  // Skip this point?
56  if (params_.min_consecutive_distance != .0f &&
57  max3(abs(x0 - xs[i]), abs(y0 - ys[i]), abs(z0 - zs[i])) <
59  continue;
60 
61  // Save for the next point:
62  x0 = xs[i];
63  y0 = ys[i];
64  z0 = zs[i];
65 
66  const auto cx = pts_voxels.x2idx(x0);
67  const auto cy = pts_voxels.y2idx(y0);
68  const auto cz = pts_voxels.z2idx(z0);
69  const auto vxl_idx = pts_voxels.cellAbsIndexFromCXCYCZ(cx, cy, cz);
70  if (vxl_idx == grid_t::INVALID_VOXEL_IDX) continue;
71 
72  auto* c = pts_voxels.cellByIndex(vxl_idx);
73  if (!c) continue;
74  c->indices.push_back(i); // only if not out of grid range
75 
76  if (c->is_empty)
77  {
78  c->is_empty = false;
79  used_voxel_indices.push_back(vxl_idx);
80  }
81  }
82 }
83 
85 {
86  for (auto idx : used_voxel_indices)
87  {
88  auto c = pts_voxels.cellByIndex(idx);
89  c->indices.clear();
90  c->is_empty = true;
91  }
92 
93  used_voxel_indices.clear();
94 }
mp2p_icp_filters::PointCloudToVoxelGrid::Parameters::min_consecutive_distance
float min_consecutive_distance
Definition: PointCloudToVoxelGrid.h:49
mp2p_icp_filters::PointCloudToVoxelGrid::used_voxel_indices
std::vector< uint32_t > used_voxel_indices
Definition: PointCloudToVoxelGrid.h:66
mp2p_icp_filters::PointCloudToVoxelGrid::resize
void resize(const mrpt::math::TPoint3D &min_corner, const mrpt::math::TPoint3D &max_corner, const float voxel_size)
Definition: PointCloudToVoxelGrid.cpp:22
PointCloudToVoxelGrid.h
Makes an index of a point cloud using a voxel grid.
mp2p_icp_filters::PointCloudToVoxelGrid::params_
Parameters params_
Definition: PointCloudToVoxelGrid.h:52
mp2p_icp_filters::PointCloudToVoxelGrid::clear
void clear()
Definition: PointCloudToVoxelGrid.cpp:84
mp2p_icp_filters::PointCloudToVoxelGrid::processPointCloud
void processPointCloud(const mrpt::maps::CPointsMap &p)
Definition: PointCloudToVoxelGrid.cpp:39
mp2p_icp_filters::PointCloudToVoxelGrid::pts_voxels
grid_t pts_voxels
Definition: PointCloudToVoxelGrid.h:64
mp2p_icp_filters
Definition: FilterBase.h:25


mrpt_local_obstacles
Author(s): Jose-Luis Blanco-Claraco
autogenerated on Mon Aug 14 2023 02:09:04