Skip to content

Commit 18813bf

Browse files
authored
fix(voxel_grid_downsample_filter): add intensity field (#6849)
fix(downsample_filter): add intensity field Signed-off-by: badai-nguyen <dai.nguyen@tier4.jp>
1 parent 21bbbd2 commit 18813bf

File tree

3 files changed

+32
-22
lines changed

3 files changed

+32
-22
lines changed

launch/tier4_perception_launch/launch/object_recognition/detection/pointcloud_map_filter.launch.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def create_compare_map_pipeline(self):
8585
components.append(
8686
ComposableNode(
8787
package="pointcloud_preprocessor",
88-
plugin="pointcloud_preprocessor::ApproximateDownsampleFilterComponent",
88+
plugin="pointcloud_preprocessor::VoxelGridDownsampleFilterComponent",
8989
name="voxel_grid_downsample_filter",
9090
remappings=[
9191
("input", LaunchConfiguration("input_topic")),

sensing/pointcloud_preprocessor/include/pointcloud_preprocessor/downsample_filter/faster_voxel_grid_downsample_filter.hpp

+12-6
Original file line numberDiff line numberDiff line change
@@ -45,37 +45,43 @@ class FasterVoxelGridDownsampleFilter
4545
float x;
4646
float y;
4747
float z;
48+
float intensity;
4849
uint32_t point_count_;
4950

50-
Centroid() : x(0), y(0), z(0) {}
51-
Centroid(float _x, float _y, float _z) : x(_x), y(_y), z(_z) { this->point_count_ = 1; }
51+
Centroid() : x(0), y(0), z(0), intensity(-1.0) {}
52+
Centroid(float _x, float _y, float _z, float _intensity)
53+
: x(_x), y(_y), z(_z), intensity(_intensity)
54+
{
55+
this->point_count_ = 1;
56+
}
5257

53-
void add_point(float _x, float _y, float _z)
58+
void add_point(float _x, float _y, float _z, float _intensity)
5459
{
5560
this->x += _x;
5661
this->y += _y;
5762
this->z += _z;
63+
this->intensity += _intensity;
5864
this->point_count_++;
5965
}
6066

6167
Eigen::Vector4f calc_centroid() const
6268
{
6369
Eigen::Vector4f centroid(
6470
(this->x / this->point_count_), (this->y / this->point_count_),
65-
(this->z / this->point_count_), 1.0f);
71+
(this->z / this->point_count_), (this->intensity / this->point_count_));
6672
return centroid;
6773
}
6874
};
6975

7076
Eigen::Vector3f inverse_voxel_size_;
71-
std::vector<pcl::PCLPointField> xyz_fields_;
7277
int x_offset_;
7378
int y_offset_;
7479
int z_offset_;
80+
int intensity_index_;
7581
int intensity_offset_;
7682
bool offset_initialized_;
7783

78-
Eigen::Vector3f get_point_from_global_offset(
84+
Eigen::Vector4f get_point_from_global_offset(
7985
const PointCloud2ConstPtr & input, size_t global_offset);
8086

8187
bool get_min_max_voxel(

sensing/pointcloud_preprocessor/src/downsample_filter/faster_voxel_grid_downsample_filter.cpp

+19-15
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ namespace pointcloud_preprocessor
1919

2020
FasterVoxelGridDownsampleFilter::FasterVoxelGridDownsampleFilter()
2121
{
22-
pcl::for_each_type<typename pcl::traits::fieldList<pcl::PointXYZ>::type>(
23-
pcl::detail::FieldAdder<pcl::PointXYZ>(xyz_fields_));
2422
offset_initialized_ = false;
2523
}
2624

@@ -36,9 +34,9 @@ void FasterVoxelGridDownsampleFilter::set_field_offsets(const PointCloud2ConstPt
3634
x_offset_ = input->fields[pcl::getFieldIndex(*input, "x")].offset;
3735
y_offset_ = input->fields[pcl::getFieldIndex(*input, "y")].offset;
3836
z_offset_ = input->fields[pcl::getFieldIndex(*input, "z")].offset;
39-
int intensity_index = pcl::getFieldIndex(*input, "intensity");
40-
if (intensity_index != -1) {
41-
intensity_offset_ = input->fields[intensity_index].offset;
37+
intensity_index_ = pcl::getFieldIndex(*input, "intensity");
38+
if (intensity_index_ != -1) {
39+
intensity_offset_ = input->fields[intensity_index_].offset;
4240
} else {
4341
intensity_offset_ = z_offset_ + sizeof(float);
4442
}
@@ -72,7 +70,7 @@ void FasterVoxelGridDownsampleFilter::filter(
7270
output.row_step = voxel_centroid_map.size() * input->point_step;
7371
output.data.resize(output.row_step);
7472
output.width = voxel_centroid_map.size();
75-
pcl_conversions::fromPCL(xyz_fields_, output.fields);
73+
output.fields = input->fields;
7674
output.is_dense = true; // we filter out invalid points
7775
output.height = input->height;
7876
output.is_bigendian = input->is_bigendian;
@@ -83,13 +81,19 @@ void FasterVoxelGridDownsampleFilter::filter(
8381
copy_centroids_to_output(voxel_centroid_map, output, transform_info);
8482
}
8583

86-
Eigen::Vector3f FasterVoxelGridDownsampleFilter::get_point_from_global_offset(
84+
Eigen::Vector4f FasterVoxelGridDownsampleFilter::get_point_from_global_offset(
8785
const PointCloud2ConstPtr & input, size_t global_offset)
8886
{
89-
Eigen::Vector3f point(
87+
float intensity = 0.0;
88+
if (intensity_index_ == -1) {
89+
intensity = -1.0;
90+
} else {
91+
intensity = *reinterpret_cast<const float *>(&input->data[global_offset + intensity_offset_]);
92+
}
93+
Eigen::Vector4f point(
9094
*reinterpret_cast<const float *>(&input->data[global_offset + x_offset_]),
9195
*reinterpret_cast<const float *>(&input->data[global_offset + y_offset_]),
92-
*reinterpret_cast<const float *>(&input->data[global_offset + z_offset_]));
96+
*reinterpret_cast<const float *>(&input->data[global_offset + z_offset_]), intensity);
9397
return point;
9498
}
9599

@@ -102,10 +106,10 @@ bool FasterVoxelGridDownsampleFilter::get_min_max_voxel(
102106
max_point.setConstant(-FLT_MAX);
103107
for (size_t global_offset = 0; global_offset + input->point_step <= input->data.size();
104108
global_offset += input->point_step) {
105-
Eigen::Vector3f point = get_point_from_global_offset(input, global_offset);
109+
Eigen::Vector4f point = get_point_from_global_offset(input, global_offset);
106110
if (std::isfinite(point[0]) && std::isfinite(point[1]), std::isfinite(point[2])) {
107-
min_point = min_point.cwiseMin(point);
108-
max_point = max_point.cwiseMax(point);
111+
min_point = min_point.cwiseMin(point.head<3>());
112+
max_point = max_point.cwiseMax(point.head<3>());
109113
}
110114
}
111115

@@ -142,7 +146,7 @@ FasterVoxelGridDownsampleFilter::calc_centroids_each_voxel(
142146

143147
for (size_t global_offset = 0; global_offset + input->point_step <= input->data.size();
144148
global_offset += input->point_step) {
145-
Eigen::Vector3f point = get_point_from_global_offset(input, global_offset);
149+
Eigen::Vector4f point = get_point_from_global_offset(input, global_offset);
146150
if (std::isfinite(point[0]) && std::isfinite(point[1]), std::isfinite(point[2])) {
147151
// Calculate the voxel index to which the point belongs
148152
int ijk0 = static_cast<int>(std::floor(point[0] * inverse_voxel_size_[0]) - min_voxel[0]);
@@ -152,9 +156,9 @@ FasterVoxelGridDownsampleFilter::calc_centroids_each_voxel(
152156

153157
// Add the point to the corresponding centroid
154158
if (voxel_centroid_map.find(voxel_id) == voxel_centroid_map.end()) {
155-
voxel_centroid_map[voxel_id] = Centroid(point[0], point[1], point[2]);
159+
voxel_centroid_map[voxel_id] = Centroid(point[0], point[1], point[2], point[3]);
156160
} else {
157-
voxel_centroid_map[voxel_id].add_point(point[0], point[1], point[2]);
161+
voxel_centroid_map[voxel_id].add_point(point[0], point[1], point[2], point[3]);
158162
}
159163
}
160164
}

0 commit comments

Comments
 (0)