16
16
17
17
#include " autoware_point_types/types.hpp"
18
18
19
- #include < boost/thread/detail/platform_time .hpp>
19
+ #include < boost/circular_buffer .hpp>
20
20
21
21
#include < algorithm>
22
22
@@ -38,6 +38,8 @@ BlockageDiagComponent::BlockageDiagComponent(const rclcpp::NodeOptions & options
38
38
lidar_model_ = static_cast <std::string>(declare_parameter (" model" , " Pandar40P" ));
39
39
blockage_count_threshold_ =
40
40
static_cast <uint >(declare_parameter (" blockage_count_threshold" , 50 ));
41
+ buffering_frames_ = static_cast <uint >(declare_parameter (" buffering_frames" , 100 ));
42
+ buffering_interval_ = static_cast <uint >(declare_parameter (" buffering_interval" , 5 ));
41
43
}
42
44
43
45
updater_.setHardwareID (" blockage_diag" );
@@ -73,7 +75,6 @@ void BlockageDiagComponent::onBlockageChecker(DiagnosticStatusWrapper & stat)
73
75
stat.add (
74
76
" sky_blockage_range_deg" , " [" + std::to_string (sky_blockage_range_deg_[0 ]) + " ," +
75
77
std::to_string (sky_blockage_range_deg_[1 ]) + " ]" );
76
-
77
78
// TODO(badai-nguyen): consider sky_blockage_ratio_ for DiagnosticsStatus." [todo]
78
79
79
80
auto level = DiagnosticStatus::OK;
@@ -151,16 +152,44 @@ void BlockageDiagComponent::filter(
151
152
lidar_depth_map.convertTo (lidar_depth_map, CV_8UC1, 1.0 / 100.0 );
152
153
cv::Mat no_return_mask;
153
154
cv::inRange (lidar_depth_map_8u, 0 , 1 , no_return_mask);
155
+
154
156
cv::Mat erosion_dst;
155
157
cv::Mat element = cv::getStructuringElement (
156
158
cv::MORPH_RECT, cv::Size (2 * erode_kernel_ + 1 , 2 * erode_kernel_ + 1 ),
157
159
cv::Point (erode_kernel_, erode_kernel_));
158
160
cv::erode (no_return_mask, erosion_dst, element);
159
161
cv::dilate (erosion_dst, no_return_mask, element);
162
+
163
+ static boost::circular_buffer<cv::Mat> no_return_mask_buffer (buffering_frames_);
164
+
165
+ cv::Mat no_return_mask_result (cv::Size (horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar (0 ));
166
+ cv::Mat time_series_blockage_mask (
167
+ cv::Size (horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar (0 ));
168
+ cv::Mat no_return_mask_binarized (
169
+ cv::Size (horizontal_bins, vertical_bins), CV_8UC1, cv::Scalar (0 ));
170
+
171
+ static uint frame_count;
172
+ frame_count++;
173
+ if (buffering_interval_ != 0 ) {
174
+ no_return_mask_binarized = no_return_mask / 255 ;
175
+ if (frame_count == buffering_interval_) {
176
+ no_return_mask_buffer.push_back (no_return_mask_binarized);
177
+ frame_count = 0 ;
178
+ }
179
+ for (const auto & binary_mask : no_return_mask_buffer) {
180
+ time_series_blockage_mask += binary_mask;
181
+ }
182
+ cv::inRange (
183
+ time_series_blockage_mask, no_return_mask_buffer.size () - 1 , no_return_mask_buffer.size (),
184
+ no_return_mask_result);
185
+ } else {
186
+ no_return_mask.copyTo (no_return_mask_result);
187
+ }
160
188
cv::Mat ground_no_return_mask;
161
189
cv::Mat sky_no_return_mask;
162
- no_return_mask (cv::Rect (0 , 0 , horizontal_bins, horizontal_ring_id_)).copyTo (sky_no_return_mask);
163
- no_return_mask (
190
+ no_return_mask_result (cv::Rect (0 , 0 , horizontal_bins, horizontal_ring_id_))
191
+ .copyTo (sky_no_return_mask);
192
+ no_return_mask_result (
164
193
cv::Rect (0 , horizontal_ring_id_, horizontal_bins, vertical_bins - horizontal_ring_id_))
165
194
.copyTo (ground_no_return_mask);
166
195
ground_blockage_ratio_ =
@@ -203,7 +232,7 @@ void BlockageDiagComponent::filter(
203
232
lidar_depth_map_pub_.publish (lidar_depth_msg);
204
233
205
234
cv::Mat blockage_mask_colorized;
206
- cv::applyColorMap (no_return_mask , blockage_mask_colorized, cv::COLORMAP_JET);
235
+ cv::applyColorMap (no_return_mask_result , blockage_mask_colorized, cv::COLORMAP_JET);
207
236
sensor_msgs::msg::Image::SharedPtr blockage_mask_msg =
208
237
cv_bridge::CvImage (std_msgs::msg::Header (), " bgr8" , blockage_mask_colorized).toImageMsg ();
209
238
blockage_mask_msg->header = input->header ;
@@ -249,6 +278,12 @@ rcl_interfaces::msg::SetParametersResult BlockageDiagComponent::paramCallback(
249
278
get_logger (), " Setting new angle_range to: [%f , %f]." , angle_range_deg_[0 ],
250
279
angle_range_deg_[1 ]);
251
280
}
281
+ if (get_param (p, " buffering_frames" , buffering_frames_)) {
282
+ RCLCPP_DEBUG (get_logger (), " Setting new buffering_frames to: %d." , buffering_frames_);
283
+ }
284
+ if (get_param (p, " buffering_interval" , buffering_interval_)) {
285
+ RCLCPP_DEBUG (get_logger (), " Setting new buffering_interval to: %d." , buffering_interval_);
286
+ }
252
287
rcl_interfaces::msg::SetParametersResult result;
253
288
result.successful = true ;
254
289
result.reason = " success" ;
0 commit comments