Skip to content

Commit 6d8606f

Browse files
committed
fix: add debug image publish option param
Signed-off-by: badai-nguyen <dai.nguyen@tier4.jp>
1 parent e756f43 commit 6d8606f

File tree

3 files changed

+93
-82
lines changed

3 files changed

+93
-82
lines changed

sensing/pointcloud_preprocessor/config/blockage_diagnostics_param_file.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
blockage_buffering_frames: 2
66
blockage_buffering_interval: 1
77
enable_dust_diag: false
8+
publish_debug_image: false
89
dust_ratio_threshold: 0.2
910
dust_count_threshold: 10
1011
dust_kernel_size: 2

sensing/pointcloud_preprocessor/include/pointcloud_preprocessor/blockage_diag/blockage_diag_nodelet.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class BlockageDiagComponent : public pointcloud_preprocessor::Filter
8686
int blockage_buffering_frames_;
8787
int blockage_buffering_interval_;
8888
bool enable_dust_diag_;
89+
bool publish_debug_image_;
8990
int dust_kernel_size_;
9091
int dust_buffering_frames_;
9192
int dust_buffering_interval_;

sensing/pointcloud_preprocessor/src/blockage_diag/blockage_diag_nodelet.cpp

+91-82
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ BlockageDiagComponent::BlockageDiagComponent(const rclcpp::NodeOptions & options
3737
blockage_count_threshold_ = declare_parameter<int>("blockage_count_threshold");
3838
blockage_buffering_frames_ = declare_parameter<int>("blockage_buffering_frames");
3939
blockage_buffering_interval_ = declare_parameter<int>("blockage_buffering_interval");
40+
publish_debug_image_ = declare_parameter<bool>("publish_debug_image");
4041
enable_dust_diag_ = declare_parameter<bool>("enable_dust_diag");
4142
dust_ratio_threshold_ = declare_parameter<float>("dust_ratio_threshold");
4243
dust_count_threshold_ = declare_parameter<int>("dust_count_threshold");
@@ -64,25 +65,28 @@ BlockageDiagComponent::BlockageDiagComponent(const rclcpp::NodeOptions & options
6465
updater_.add(
6566
std::string(this->get_namespace()) + ": dust_validation", this,
6667
&BlockageDiagComponent::dustChecker);
68+
if (publish_debug_image_) {
69+
single_frame_dust_mask_pub =
70+
image_transport::create_publisher(this, "blockage_diag/debug/single_frame_dust_mask_image");
71+
multi_frame_dust_mask_pub =
72+
image_transport::create_publisher(this, "blockage_diag/debug/multi_frame_dust_mask_image");
73+
blockage_dust_merged_pub =
74+
image_transport::create_publisher(this, "blockage_diag/debug/blockage_dust_merged_image");
75+
ground_dust_ratio_pub_ = create_publisher<tier4_debug_msgs::msg::Float32Stamped>(
76+
"blockage_diag/debug/ground_dust_ratio", rclcpp::SensorDataQoS());
77+
}
6778
}
6879
updater_.setPeriod(0.1);
69-
lidar_depth_map_pub_ =
70-
image_transport::create_publisher(this, "blockage_diag/debug/lidar_depth_map");
71-
blockage_mask_pub_ =
72-
image_transport::create_publisher(this, "blockage_diag/debug/blockage_mask_image");
80+
if (publish_debug_image_) {
81+
lidar_depth_map_pub_ =
82+
image_transport::create_publisher(this, "blockage_diag/debug/lidar_depth_map");
83+
blockage_mask_pub_ =
84+
image_transport::create_publisher(this, "blockage_diag/debug/blockage_mask_image");
85+
}
7386
ground_blockage_ratio_pub_ = create_publisher<tier4_debug_msgs::msg::Float32Stamped>(
7487
"blockage_diag/debug/ground_blockage_ratio", rclcpp::SensorDataQoS());
7588
sky_blockage_ratio_pub_ = create_publisher<tier4_debug_msgs::msg::Float32Stamped>(
7689
"blockage_diag/debug/sky_blockage_ratio", rclcpp::SensorDataQoS());
77-
78-
single_frame_dust_mask_pub =
79-
image_transport::create_publisher(this, "blockage_diag/debug/single_frame_dust_mask_image");
80-
multi_frame_dust_mask_pub =
81-
image_transport::create_publisher(this, "blockage_diag/debug/multi_frame_dust_mask_image");
82-
blockage_dust_merged_pub =
83-
image_transport::create_publisher(this, "blockage_diag/debug/blockage_dust_merged_image");
84-
ground_dust_ratio_pub_ = create_publisher<tier4_debug_msgs::msg::Float32Stamped>(
85-
"blockage_diag/debug/ground_dust_ratio", rclcpp::SensorDataQoS());
8690
using std::placeholders::_1;
8791
set_param_res_ = this->add_on_set_parameters_callback(
8892
std::bind(&BlockageDiagComponent::paramCallback, this, _1));
@@ -305,84 +309,76 @@ void BlockageDiagComponent::filter(
305309
cv::inRange(single_dust_ground_img, 254, 255, single_dust_ground_img);
306310
cv::Mat ground_mask(cv::Size(ideal_horizontal_bins, horizontal_ring_id_), CV_8UC1);
307311
cv::vconcat(sky_blank, single_dust_ground_img, single_dust_img);
308-
cv::Mat binarized_dust_mask_(
309-
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar(0));
310-
cv::Mat multi_frame_dust_mask(
311-
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar(0));
312-
cv::Mat multi_frame_ground_dust_result(
313-
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar(0));
314312

315-
if (dust_buffering_interval_ == 0) {
316-
single_dust_img.copyTo(multi_frame_ground_dust_result);
317-
dust_buffering_frame_counter_ = 0;
318-
} else {
319-
binarized_dust_mask_ = single_dust_img / 255;
320-
if (dust_buffering_frame_counter_ >= dust_buffering_interval_) {
321-
dust_mask_buffer.push_back(binarized_dust_mask_);
322-
dust_buffering_frame_counter_ = 0;
323-
} else {
324-
dust_buffering_frame_counter_++;
325-
}
326-
for (const auto & binarized_dust_mask : dust_mask_buffer) {
327-
multi_frame_dust_mask += binarized_dust_mask;
328-
}
329-
cv::inRange(
330-
multi_frame_dust_mask, dust_mask_buffer.size() - 1, dust_mask_buffer.size(),
331-
multi_frame_ground_dust_result);
332-
}
333-
cv::Mat single_frame_ground_dust_colorized(
334-
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC3, cv::Scalar(0, 0, 0));
335-
cv::applyColorMap(single_dust_img, single_frame_ground_dust_colorized, cv::COLORMAP_JET);
336-
cv::Mat multi_frame_ground_dust_colorized;
337-
cv::Mat blockage_dust_merged_img(
338-
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC3, cv::Scalar(0, 0, 0));
339-
cv::Mat blockage_dust_merged_mask(
340-
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar(0));
341-
blockage_dust_merged_img.setTo(
342-
cv::Vec3b(0, 0, 255), time_series_blockage_result); // red:blockage
343-
blockage_dust_merged_img.setTo(
344-
cv::Vec3b(0, 255, 255), multi_frame_ground_dust_result); // yellow:dust
345-
sensor_msgs::msg::Image::SharedPtr single_frame_dust_mask_msg =
346-
cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", single_frame_ground_dust_colorized)
347-
.toImageMsg();
348-
single_frame_dust_mask_pub.publish(single_frame_dust_mask_msg);
349-
sensor_msgs::msg::Image::SharedPtr multi_frame_dust_mask_msg =
350-
cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", multi_frame_ground_dust_colorized)
351-
.toImageMsg();
352-
multi_frame_dust_mask_pub.publish(multi_frame_dust_mask_msg);
353-
sensor_msgs::msg::Image::SharedPtr lidar_depth_map_msg =
354-
cv_bridge::CvImage(std_msgs::msg::Header(), "mono16", full_size_depth_map).toImageMsg();
355-
lidar_depth_map_msg->header = input->header;
356-
lidar_depth_map_pub_.publish(lidar_depth_map_msg);
357-
cv::Mat blockage_mask_colorized;
358-
cv::applyColorMap(time_series_blockage_result, blockage_mask_colorized, cv::COLORMAP_JET);
359-
sensor_msgs::msg::Image::SharedPtr blockage_mask_msg =
360-
cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", blockage_mask_colorized).toImageMsg();
361-
blockage_mask_msg->header = input->header;
362-
blockage_mask_pub_.publish(blockage_mask_msg);
363-
cv::Mat blockage_dust_merged_colorized(
364-
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC3, cv::Scalar(0, 0, 0));
365-
blockage_dust_merged_img.copyTo(blockage_dust_merged_colorized);
366-
sensor_msgs::msg::Image::SharedPtr blockage_dust_merged_msg =
367-
cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", blockage_dust_merged_colorized)
368-
.toImageMsg();
313+
tier4_debug_msgs::msg::Float32Stamped ground_dust_ratio_msg;
314+
ground_dust_ratio_ = static_cast<float>(cv::countNonZero(single_dust_ground_img)) /
315+
(single_dust_ground_img.cols * single_dust_ground_img.rows);
316+
ground_dust_ratio_msg.data = ground_dust_ratio_;
317+
ground_dust_ratio_msg.stamp = now();
318+
ground_dust_ratio_pub_->publish(ground_dust_ratio_msg);
369319
if (ground_dust_ratio_ > dust_ratio_threshold_) {
370320
if (dust_frame_count_ < 2 * dust_count_threshold_) {
371321
dust_frame_count_++;
372322
}
373323
} else {
374324
dust_frame_count_ = 0;
375325
}
376-
blockage_dust_merged_msg->header = input->header;
377-
blockage_dust_merged_pub.publish(blockage_dust_merged_msg);
378-
tier4_debug_msgs::msg::Float32Stamped blockage_ratio_msg;
379-
tier4_debug_msgs::msg::Float32Stamped ground_dust_ratio_msg;
380326

381-
ground_dust_ratio_ = static_cast<float>(cv::countNonZero(single_dust_ground_img)) /
382-
(single_dust_ground_img.cols * single_dust_ground_img.rows);
383-
ground_dust_ratio_msg.data = ground_dust_ratio_;
384-
ground_dust_ratio_msg.stamp = now();
385-
ground_dust_ratio_pub_->publish(ground_dust_ratio_msg);
327+
if (publish_debug_image_) {
328+
cv::Mat binarized_dust_mask_(
329+
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar(0));
330+
cv::Mat multi_frame_dust_mask(
331+
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar(0));
332+
cv::Mat multi_frame_ground_dust_result(
333+
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar(0));
334+
335+
if (dust_buffering_interval_ == 0) {
336+
single_dust_img.copyTo(multi_frame_ground_dust_result);
337+
dust_buffering_frame_counter_ = 0;
338+
} else {
339+
binarized_dust_mask_ = single_dust_img / 255;
340+
if (dust_buffering_frame_counter_ >= dust_buffering_interval_) {
341+
dust_mask_buffer.push_back(binarized_dust_mask_);
342+
dust_buffering_frame_counter_ = 0;
343+
} else {
344+
dust_buffering_frame_counter_++;
345+
}
346+
for (const auto & binarized_dust_mask : dust_mask_buffer) {
347+
multi_frame_dust_mask += binarized_dust_mask;
348+
}
349+
cv::inRange(
350+
multi_frame_dust_mask, dust_mask_buffer.size() - 1, dust_mask_buffer.size(),
351+
multi_frame_ground_dust_result);
352+
}
353+
cv::Mat single_frame_ground_dust_colorized(
354+
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC3, cv::Scalar(0, 0, 0));
355+
cv::applyColorMap(single_dust_img, single_frame_ground_dust_colorized, cv::COLORMAP_JET);
356+
cv::Mat multi_frame_ground_dust_colorized;
357+
cv::Mat blockage_dust_merged_img(
358+
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC3, cv::Scalar(0, 0, 0));
359+
cv::Mat blockage_dust_merged_mask(
360+
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar(0));
361+
blockage_dust_merged_img.setTo(
362+
cv::Vec3b(0, 0, 255), time_series_blockage_result); // red:blockage
363+
blockage_dust_merged_img.setTo(
364+
cv::Vec3b(0, 255, 255), multi_frame_ground_dust_result); // yellow:dust
365+
sensor_msgs::msg::Image::SharedPtr single_frame_dust_mask_msg =
366+
cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", single_frame_ground_dust_colorized)
367+
.toImageMsg();
368+
single_frame_dust_mask_pub.publish(single_frame_dust_mask_msg);
369+
sensor_msgs::msg::Image::SharedPtr multi_frame_dust_mask_msg =
370+
cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", multi_frame_ground_dust_colorized)
371+
.toImageMsg();
372+
multi_frame_dust_mask_pub.publish(multi_frame_dust_mask_msg);
373+
cv::Mat blockage_dust_merged_colorized(
374+
cv::Size(ideal_horizontal_bins, vertical_bins), CV_8UC3, cv::Scalar(0, 0, 0));
375+
blockage_dust_merged_img.copyTo(blockage_dust_merged_colorized);
376+
sensor_msgs::msg::Image::SharedPtr blockage_dust_merged_msg =
377+
cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", blockage_dust_merged_colorized)
378+
.toImageMsg();
379+
blockage_dust_merged_msg->header = input->header;
380+
blockage_dust_merged_pub.publish(blockage_dust_merged_msg);
381+
}
386382
}
387383

388384
tier4_debug_msgs::msg::Float32Stamped ground_blockage_ratio_msg;
@@ -394,6 +390,19 @@ void BlockageDiagComponent::filter(
394390
sky_blockage_ratio_msg.data = sky_blockage_ratio_;
395391
sky_blockage_ratio_msg.stamp = now();
396392
sky_blockage_ratio_pub_->publish(sky_blockage_ratio_msg);
393+
if (publish_debug_image_) {
394+
sensor_msgs::msg::Image::SharedPtr lidar_depth_map_msg =
395+
cv_bridge::CvImage(std_msgs::msg::Header(), "mono16", full_size_depth_map).toImageMsg();
396+
lidar_depth_map_msg->header = input->header;
397+
lidar_depth_map_pub_.publish(lidar_depth_map_msg);
398+
cv::Mat blockage_mask_colorized;
399+
cv::applyColorMap(time_series_blockage_result, blockage_mask_colorized, cv::COLORMAP_JET);
400+
sensor_msgs::msg::Image::SharedPtr blockage_mask_msg =
401+
cv_bridge::CvImage(std_msgs::msg::Header(), "bgr8", blockage_mask_colorized).toImageMsg();
402+
blockage_mask_msg->header = input->header;
403+
blockage_mask_pub_.publish(blockage_mask_msg);
404+
}
405+
397406
pcl::toROSMsg(*pcl_input, output);
398407
output.header = input->header;
399408
}

0 commit comments

Comments
 (0)