Skip to content

Commit 7a4ac14

Browse files
committed
fix: radius filter
Signed-off-by: badai-nguyen <dai.nguyen@tier4.jp>
1 parent 6eea3e7 commit 7a4ac14

File tree

2 files changed

+17
-17
lines changed

2 files changed

+17
-17
lines changed

perception/occupancy_grid_map_outlier_filter/include/occupancy_grid_map_outlier_filter/occupancy_grid_map_outlier_filter_nodelet.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ class RadiusSearch2dFilter
5353
public:
5454
explicit RadiusSearch2dFilter(rclcpp::Node & node);
5555
void filter(
56-
const PclPointCloud & input, const Pose & pose, PclPointCloud & output,
57-
PclPointCloud & outlier);
56+
const PointCloud2 & input, const Pose & pose, PointCloud2 & output, PointCloud2 & outlier);
5857
void filter(
5958
const PointCloud2 & high_conf_input, const PointCloud2 & low_conf_input, const Pose & pose,
6059
PointCloud2 & output, PointCloud2 & outlier);

perception/occupancy_grid_map_outlier_filter/src/occupancy_grid_map_outlier_filter_nodelet.cpp

+16-15
Original file line numberDiff line numberDiff line change
@@ -116,19 +116,23 @@ RadiusSearch2dFilter::RadiusSearch2dFilter(rclcpp::Node & node)
116116
}
117117

118118
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)
120120
{
121-
const auto & xyz_cloud = input;
122121
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));
127129
}
128130

129131
std::vector<int> k_indices(xy_cloud->points.size());
130132
std::vector<float> k_distances(xy_cloud->points.size());
131133
kd_tree_->setInputCloud(xy_cloud);
134+
size_t output_size = 0;
135+
size_t outlier_size = 0;
132136
for (size_t i = 0; i < xy_cloud->points.size(); ++i) {
133137
const float distance =
134138
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(
139143
kd_tree_->radiusSearch(i, search_radius_, k_indices, k_distances, min_points_threshold);
140144

141145
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;
143148
} 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;
145151
}
146152
}
153+
output.data.resize(output_size);
154+
outlier.data.resize(outlier_size);
147155
}
148156

149157
void RadiusSearch2dFilter::filter(
@@ -372,12 +380,7 @@ void OccupancyGridMapOutlierFilterComponent::onOccupancyGridMapAndPointCloud2(
372380
void OccupancyGridMapOutlierFilterComponent::initializerPointCloud2(
373381
const PointCloud2 & input, PointCloud2 & output)
374382
{
375-
output.header = input.header;
376383
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;
381384
output.data.resize(input.data.size());
382385
}
383386

@@ -407,8 +410,6 @@ void OccupancyGridMapOutlierFilterComponent::filterByOccupancyGridMap(
407410
{
408411
int x_offset = pointcloud.fields[pcl::getFieldIndex(pointcloud, "x")].offset;
409412
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;
412413
size_t high_confidence_size = 0;
413414
size_t low_confidence_size = 0;
414415
size_t out_ogm_size = 0;

0 commit comments

Comments
 (0)