@@ -37,6 +37,7 @@ BlockageDiagComponent::BlockageDiagComponent(const rclcpp::NodeOptions & options
37
37
blockage_count_threshold_ = declare_parameter<int >(" blockage_count_threshold" );
38
38
blockage_buffering_frames_ = declare_parameter<int >(" blockage_buffering_frames" );
39
39
blockage_buffering_interval_ = declare_parameter<int >(" blockage_buffering_interval" );
40
+ publish_debug_image_ = declare_parameter<bool >(" publish_debug_image" );
40
41
enable_dust_diag_ = declare_parameter<bool >(" enable_dust_diag" );
41
42
dust_ratio_threshold_ = declare_parameter<float >(" dust_ratio_threshold" );
42
43
dust_count_threshold_ = declare_parameter<int >(" dust_count_threshold" );
@@ -64,25 +65,28 @@ BlockageDiagComponent::BlockageDiagComponent(const rclcpp::NodeOptions & options
64
65
updater_.add (
65
66
std::string (this ->get_namespace ()) + " : dust_validation" , this ,
66
67
&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
+ }
67
78
}
68
79
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
+ }
73
86
ground_blockage_ratio_pub_ = create_publisher<tier4_debug_msgs::msg::Float32Stamped>(
74
87
" blockage_diag/debug/ground_blockage_ratio" , rclcpp::SensorDataQoS ());
75
88
sky_blockage_ratio_pub_ = create_publisher<tier4_debug_msgs::msg::Float32Stamped>(
76
89
" 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 ());
86
90
using std::placeholders::_1;
87
91
set_param_res_ = this ->add_on_set_parameters_callback (
88
92
std::bind (&BlockageDiagComponent::paramCallback, this , _1));
@@ -305,84 +309,76 @@ void BlockageDiagComponent::filter(
305
309
cv::inRange (single_dust_ground_img, 254 , 255 , single_dust_ground_img);
306
310
cv::Mat ground_mask (cv::Size (ideal_horizontal_bins, horizontal_ring_id_), CV_8UC1);
307
311
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 ));
314
312
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);
369
319
if (ground_dust_ratio_ > dust_ratio_threshold_) {
370
320
if (dust_frame_count_ < 2 * dust_count_threshold_) {
371
321
dust_frame_count_++;
372
322
}
373
323
} else {
374
324
dust_frame_count_ = 0 ;
375
325
}
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;
380
326
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
+ }
386
382
}
387
383
388
384
tier4_debug_msgs::msg::Float32Stamped ground_blockage_ratio_msg;
@@ -394,6 +390,19 @@ void BlockageDiagComponent::filter(
394
390
sky_blockage_ratio_msg.data = sky_blockage_ratio_;
395
391
sky_blockage_ratio_msg.stamp = now ();
396
392
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
+
397
406
pcl::toROSMsg (*pcl_input, output);
398
407
output.header = input->header ;
399
408
}
0 commit comments