11 sensor_msgs::msg::PointCloud2::SharedPtr& output_cloud) {
13 output_cloud->header = point_cloud->header;
14 output_cloud->height = 1;
15 output_cloud->is_bigendian = point_cloud->is_bigendian;
16 output_cloud->point_step = point_cloud->point_step;
17 output_cloud->fields = point_cloud->fields;
18 output_cloud->width = 0;
19 output_cloud->data.resize(point_cloud->width * point_cloud->point_step);
23 const auto& cloud_data = point_cloud->data;
24 const size_t num_points = point_cloud->width * point_cloud->height;
25 if (num_points == 0) {
29 std::unordered_map<GridIndex, std::vector<size_t>> grid_map;
31 for (
size_t i = 0; i < num_points; ++i) {
39 grid_map[{slice, bin_idx}].push_back(i);
43 std::unordered_map<GridIndex, bool> visited;
44 for (
auto& [start_cell, points] : grid_map) {
45 if (visited[start_cell]) {
49 std::queue<GridIndex> q;
51 visited[start_cell] =
true;
53 std::vector<GridIndex> cluster_cells;
54 size_t cluster_pts = 0;
59 cluster_cells.push_back(current);
60 cluster_pts += grid_map[current].size();
62 for (
int dx = -1; dx <= 1; ++dx) {
63 for (
int dy = -1; dy <= 1; ++dy) {
64 if (dx == 0 && dy == 0) {
69 if (grid_map.count(neighbor) > 0 && !visited[neighbor]) {
70 visited[neighbor] =
true;
79 for (
const auto& cell : cluster_cells) {
90 for (
auto const& [cell, points] : grid_map) {
92 for (
size_t idx : points) {
96 output_cloud->width++;
GridWallRemoval(double angle, double radius, double start_augmentation, double radius_augmentation, double fov, int max_points_per_cluster)
Constructor for GridWallRemoval.