gtsam_points
Loading...
Searching...
No Matches
fast_occupancy_grid_impl.hpp
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2025 Kenji Koide (k.koide@aist.go.jp)
3#pragma once
4
5#include <gtsam_points/ann/fast_occupancy_grid.hpp>
6
7#include <gtsam_points/types/frame_traits.hpp>
8#include <gtsam_points/util/fast_floor.hpp>
9#include <gtsam_points/util/vector3i_hash.hpp>
10#include <gtsam_points/types/point_cloud_cpu.hpp>
11
12namespace gtsam_points {
13
14template <typename PointCloud>
15void FastOccupancyGrid::insert(const PointCloud& points, const Eigen::Isometry3d& pose) {
16 for (int i = 0; i < frame::size(points); i++) {
17 const auto& pt = frame::point(points, i);
18 const Eigen::Array4i global_coord = fast_floor((pose * pt) * inv_resolution) + coord_offset;
19 const Eigen::Array4i block_coord = global_coord / FastOccupancyBlock::stride;
20 const Eigen::Array4i cell_coord = global_coord - block_coord * FastOccupancyBlock::stride;
21
22 const std::uint64_t block_index = calc_index(block_coord);
23 const std::uint64_t block_loc = find_or_insert_block(block_index);
24 blocks[block_loc].second.set_occupied(cell_coord.head<3>());
25 }
26}
27
28template <typename PointCloud>
29int FastOccupancyGrid::calc_overlap(const PointCloud& points, const Eigen::Isometry3d& pose) const {
30 int num_overlap = 0;
31 for (int i = 0; i < frame::size(points); i++) {
32 const auto& pt = frame::point(points, i);
33 const Eigen::Array4i global_coord = fast_floor((pose * pt) * inv_resolution) + coord_offset;
34 const Eigen::Array4i block_coord = global_coord / FastOccupancyBlock::stride;
35
36 const std::uint64_t block_index = calc_index(block_coord);
37 const std::uint64_t block_loc = find_block(block_index);
38 if (block_loc == INVALID_INDEX) {
39 continue;
40 }
41
42 const Eigen::Array4i cell_coord = global_coord - block_coord * FastOccupancyBlock::stride;
43 num_overlap += blocks[block_loc].second.occupied(cell_coord.head<3>());
44 }
45
46 return num_overlap;
47}
48
49template <typename PointCloud>
50double FastOccupancyGrid::calc_overlap_rate(const PointCloud& points, const Eigen::Isometry3d& pose) const {
51 return calc_overlap(points, pose) / static_cast<double>(frame::size(points));
52}
53
54template <typename PointCloud>
55std::vector<unsigned char> FastOccupancyGrid::get_overlaps(const PointCloud& points, const Eigen::Isometry3d& pose) const {
56 std::vector<unsigned char> overlaps(frame::size(points), 0);
57
58 for (int i = 0; i < frame::size(points); i++) {
59 const auto& pt = frame::point(points, i);
60 const Eigen::Array4i global_coord = fast_floor((pose * pt) * inv_resolution) + coord_offset;
61 const Eigen::Array4i block_coord = global_coord / FastOccupancyBlock::stride;
62
63 const std::uint64_t block_index = calc_index(block_coord);
64 const std::uint64_t block_loc = find_block(block_index);
65 if (block_loc == INVALID_INDEX) {
66 continue;
67 }
68
69 const Eigen::Array4i cell_coord = global_coord - block_coord * FastOccupancyBlock::stride;
70 overlaps[i] = blocks[block_loc].second.occupied(cell_coord.head<3>());
71 }
72
73 return overlaps;
74}
75
76} // namespace gtsam_points
void insert(const PointCloud &points, const Eigen::Isometry3d &pose=Eigen::Isometry3d::Identity())
Insert points into the grid.
Definition fast_occupancy_grid_impl.hpp:15
int calc_overlap(const PointCloud &points, const Eigen::Isometry3d &pose=Eigen::Isometry3d::Identity()) const
Calculate the number of points overlapping with the grid.
Definition fast_occupancy_grid_impl.hpp:29
std::vector< unsigned char > get_overlaps(const PointCloud &points, const Eigen::Isometry3d &pose=Eigen::Isometry3d::Identity()) const
Get the overlap status of each point in the point cloud.
Definition fast_occupancy_grid_impl.hpp:55
double calc_overlap_rate(const PointCloud &points, const Eigen::Isometry3d &pose=Eigen::Isometry3d::Identity()) const
Calculate the overlap ratio of the points with the grid.
Definition fast_occupancy_grid_impl.hpp:50
static constexpr int stride
Size of the block in each dimension.
Definition fast_occupancy_grid.hpp:17
Standard point cloud class that holds only pointers to point attributes.
Definition point_cloud.hpp:19