@@ -19,8 +19,6 @@ namespace pointcloud_preprocessor
19
19
20
20
FasterVoxelGridDownsampleFilter::FasterVoxelGridDownsampleFilter ()
21
21
{
22
- pcl::for_each_type<typename pcl::traits::fieldList<pcl::PointXYZ>::type>(
23
- pcl::detail::FieldAdder<pcl::PointXYZ>(xyz_fields_));
24
22
offset_initialized_ = false ;
25
23
}
26
24
@@ -36,9 +34,9 @@ void FasterVoxelGridDownsampleFilter::set_field_offsets(const PointCloud2ConstPt
36
34
x_offset_ = input->fields [pcl::getFieldIndex (*input, " x" )].offset ;
37
35
y_offset_ = input->fields [pcl::getFieldIndex (*input, " y" )].offset ;
38
36
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 ;
42
40
} else {
43
41
intensity_offset_ = z_offset_ + sizeof (float );
44
42
}
@@ -72,7 +70,7 @@ void FasterVoxelGridDownsampleFilter::filter(
72
70
output.row_step = voxel_centroid_map.size () * input->point_step ;
73
71
output.data .resize (output.row_step );
74
72
output.width = voxel_centroid_map.size ();
75
- pcl_conversions::fromPCL (xyz_fields_, output.fields ) ;
73
+ output.fields = input-> fields ;
76
74
output.is_dense = true ; // we filter out invalid points
77
75
output.height = input->height ;
78
76
output.is_bigendian = input->is_bigendian ;
@@ -83,13 +81,19 @@ void FasterVoxelGridDownsampleFilter::filter(
83
81
copy_centroids_to_output (voxel_centroid_map, output, transform_info);
84
82
}
85
83
86
- Eigen::Vector3f FasterVoxelGridDownsampleFilter::get_point_from_global_offset (
84
+ Eigen::Vector4f FasterVoxelGridDownsampleFilter::get_point_from_global_offset (
87
85
const PointCloud2ConstPtr & input, size_t global_offset)
88
86
{
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 (
90
94
*reinterpret_cast <const float *>(&input->data [global_offset + x_offset_]),
91
95
*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 );
93
97
return point;
94
98
}
95
99
@@ -102,10 +106,10 @@ bool FasterVoxelGridDownsampleFilter::get_min_max_voxel(
102
106
max_point.setConstant (-FLT_MAX);
103
107
for (size_t global_offset = 0 ; global_offset + input->point_step <= input->data .size ();
104
108
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);
106
110
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 >() );
109
113
}
110
114
}
111
115
@@ -142,7 +146,7 @@ FasterVoxelGridDownsampleFilter::calc_centroids_each_voxel(
142
146
143
147
for (size_t global_offset = 0 ; global_offset + input->point_step <= input->data .size ();
144
148
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);
146
150
if (std::isfinite (point[0 ]) && std::isfinite (point[1 ]), std::isfinite (point[2 ])) {
147
151
// Calculate the voxel index to which the point belongs
148
152
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(
152
156
153
157
// Add the point to the corresponding centroid
154
158
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 ] );
156
160
} 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 ] );
158
162
}
159
163
}
160
164
}
0 commit comments