@@ -116,19 +116,23 @@ RadiusSearch2dFilter::RadiusSearch2dFilter(rclcpp::Node & node)
116
116
}
117
117
118
118
void RadiusSearch2dFilter::filter (
119
- const PclPointCloud & input, const Pose & pose, PclPointCloud & output, PclPointCloud & outlier)
119
+ const PointCloud2 & input, const Pose & pose, PointCloud2 & output, PointCloud2 & outlier)
120
120
{
121
- const auto & xyz_cloud = input;
122
121
pcl::PointCloud<pcl::PointXY>::Ptr xy_cloud (new pcl::PointCloud<pcl::PointXY>);
123
- xy_cloud->points .resize (xyz_cloud.points .size ());
124
- for (size_t i = 0 ; i < xyz_cloud.points .size (); ++i) {
125
- xy_cloud->points [i].x = xyz_cloud.points [i].x ;
126
- xy_cloud->points [i].y = xyz_cloud.points [i].y ;
122
+ int point_step = input.point_step ;
123
+ int x_offset = input.fields [pcl::getFieldIndex (input, " x" )].offset ;
124
+ int y_offset = input.fields [pcl::getFieldIndex (input, " y" )].offset ;
125
+ xy_cloud->points .resize (input.data .size () / point_step);
126
+ for (size_t i = 0 ; i < input.data .size () / point_step; ++i) {
127
+ std::memcpy (&xy_cloud->points [i].x , &input.data [i * x_offset], sizeof (float ));
128
+ std::memcpy (&xy_cloud->points [i].y , &input.data [i * y_offset], sizeof (float ));
127
129
}
128
130
129
131
std::vector<int > k_indices (xy_cloud->points .size ());
130
132
std::vector<float > k_distances (xy_cloud->points .size ());
131
133
kd_tree_->setInputCloud (xy_cloud);
134
+ size_t output_size = 0 ;
135
+ size_t outlier_size = 0 ;
132
136
for (size_t i = 0 ; i < xy_cloud->points .size (); ++i) {
133
137
const float distance =
134
138
std::hypot (xy_cloud->points [i].x - pose.position .x , xy_cloud->points [i].y - pose.position .y );
@@ -139,11 +143,15 @@ void RadiusSearch2dFilter::filter(
139
143
kd_tree_->radiusSearch (i, search_radius_, k_indices, k_distances, min_points_threshold);
140
144
141
145
if (min_points_threshold <= points_num) {
142
- output.points .push_back (xyz_cloud.points .at (i));
146
+ std::memcpy (&output.data [output_size], &input.data [i * point_step], point_step);
147
+ output_size += point_step;
143
148
} else {
144
- outlier.points .push_back (xyz_cloud.points .at (i));
149
+ std::memcpy (&outlier.data [outlier_size], &input.data [i * point_step], point_step);
150
+ outlier_size += point_step;
145
151
}
146
152
}
153
+ output.data .resize (output_size);
154
+ outlier.data .resize (outlier_size);
147
155
}
148
156
149
157
void RadiusSearch2dFilter::filter (
@@ -372,12 +380,7 @@ void OccupancyGridMapOutlierFilterComponent::onOccupancyGridMapAndPointCloud2(
372
380
void OccupancyGridMapOutlierFilterComponent::initializerPointCloud2 (
373
381
const PointCloud2 & input, PointCloud2 & output)
374
382
{
375
- output.header = input.header ;
376
383
output.point_step = input.point_step ;
377
- output.fields = input.fields ;
378
- output.height = input.height ;
379
- output.is_bigendian = input.is_bigendian ;
380
- output.is_dense = input.is_dense ;
381
384
output.data .resize (input.data .size ());
382
385
}
383
386
@@ -407,8 +410,6 @@ void OccupancyGridMapOutlierFilterComponent::filterByOccupancyGridMap(
407
410
{
408
411
int x_offset = pointcloud.fields [pcl::getFieldIndex (pointcloud, " x" )].offset ;
409
412
int y_offset = pointcloud.fields [pcl::getFieldIndex (pointcloud, " y" )].offset ;
410
- // int z_offset = pointcloud.fields[pcl::getFieldIndex(pointcloud, "z")].offset;
411
- // int intensity_offset = pointcloud.fields[pcl::getFieldIndex(pointcloud, "intensity")].offset;
412
413
size_t high_confidence_size = 0 ;
413
414
size_t low_confidence_size = 0 ;
414
415
size_t out_ogm_size = 0 ;
0 commit comments