2727#include < algorithm>
2828#include < cstdlib>
2929#include < memory>
30+ #include < optional>
3031#include < stdexcept>
3132#include < string>
3233#include < vector>
@@ -150,7 +151,7 @@ std::optional<SetRouteError> TrafficLightMapBasedDetector::set_route(
150151 return std::nullopt ;
151152}
152153
153- const tf2::Transform & find_closest_transform (
154+ const StampedTransform & find_closest_transform (
154155 const std::vector<StampedTransform> & samples, const rclcpp::Time & target_time)
155156{
156157 const auto closest_iter = std::min_element (
@@ -160,7 +161,7 @@ const tf2::Transform & find_closest_transform(
160161 const auto diff_rhs = std::abs ((rhs.stamp - target_time).nanoseconds ());
161162 return diff_lhs < diff_rhs;
162163 });
163- return closest_iter-> transform ;
164+ return * closest_iter;
164165}
165166
166167const TrafficLightMapBasedDetector::TrafficLightSet &
@@ -202,27 +203,27 @@ DetectionResult TrafficLightMapBasedDetector::detect(
202203 const auto visible_traffic_lights = get_visible_traffic_lights (
203204 select_target_traffic_lights (), tf_map2camera_samples, pinhole_camera_model);
204205
205- const tf2::Transform tf_map2camera_closest =
206+ const StampedTransform tf_map2camera_closest =
206207 find_closest_transform (tf_map2camera_samples, camera_info.header .stamp );
207208 const auto expect_roi_config = make_expect_roi_config (config_);
208209
209210 for (const auto & traffic_light : visible_traffic_lights) {
210- tier4_perception_msgs::msg::TrafficLightRoi rough_roi, expect_roi;
211- if (!get_traffic_light_roi (
212- tf_map2camera_closest, pinhole_camera_model, traffic_light, expect_roi_config,
213- expect_roi)) {
211+ const auto expect_roi = get_traffic_light_roi (
212+ {tf_map2camera_closest}, pinhole_camera_model, traffic_light, expect_roi_config);
213+ if (!expect_roi) {
214214 continue ;
215215 }
216- if (!get_traffic_light_roi (
217- tf_map2camera_samples, pinhole_camera_model, traffic_light, config_, rough_roi)) {
216+ const auto rough_roi =
217+ get_traffic_light_roi (tf_map2camera_samples, pinhole_camera_model, traffic_light, config_);
218+ if (!rough_roi) {
218219 continue ;
219220 }
220- result.rough_rois .rois .push_back (rough_roi);
221- result.expect_rois .rois .push_back (expect_roi);
221+ result.rough_rois .rois .push_back (* rough_roi);
222+ result.expect_rois .rois .push_back (* expect_roi);
222223 }
223224
224- result.markers =
225- create_traffic_light_markers ( tf_map2camera_closest, camera_info.header , visible_traffic_lights);
225+ result.markers = create_traffic_light_markers (
226+ tf_map2camera_closest. transform , camera_info.header , visible_traffic_lights);
226227
227228 return result;
228229}
@@ -287,12 +288,14 @@ std::vector<lanelet::ConstLineString3d> TrafficLightMapBasedDetector::get_visibl
287288 return visible_traffic_lights;
288289}
289290
290- bool TrafficLightMapBasedDetector::get_traffic_light_roi (
291+ std::optional<tier4_perception_msgs::msg::TrafficLightRoi>
292+ TrafficLightMapBasedDetector::project_traffic_light_to_roi (
291293 const tf2::Transform & tf_map2camera,
292294 const image_geometry::PinholeCameraModel & pinhole_camera_model,
293- const lanelet::ConstLineString3d traffic_light, const TrafficLightMapBasedDetectorConfig & config,
294- tier4_perception_msgs::msg::TrafficLightRoi & roi ) const
295+ const lanelet::ConstLineString3d traffic_light,
296+ const TrafficLightMapBasedDetectorConfig & config ) const
295297{
298+ tier4_perception_msgs::msg::TrafficLightRoi roi;
296299 roi.traffic_light_id = traffic_light.id ();
297300 if (pedestrian_traffic_light_id_.find (traffic_light.id ()) != pedestrian_traffic_light_id_.end ()) {
298301 roi.traffic_light_type = tier4_perception_msgs::msg::TrafficLightRoi::PEDESTRIAN_TRAFFIC_LIGHT;
@@ -310,7 +313,7 @@ bool TrafficLightMapBasedDetector::get_traffic_light_roi(
310313 config.max_vibration_height , config.max_vibration_width , config.max_vibration_depth );
311314 tf2::Vector3 point3d = top_left_camera_optical - margin;
312315 if (point3d.z () <= 0.0 ) {
313- return false ;
316+ return std:: nullopt ;
314317 }
315318 // enlarged target position in camera coordinate
316319 {
@@ -333,7 +336,7 @@ bool TrafficLightMapBasedDetector::get_traffic_light_roi(
333336 config.max_vibration_height , config.max_vibration_width , config.max_vibration_depth );
334337 tf2::Vector3 point3d = bottom_right_camera_optical + margin;
335338 if (point3d.z () <= 0.0 ) {
336- return false ;
339+ return std:: nullopt ;
337340 }
338341 // enlarged target position in camera coordinate
339342 {
@@ -346,34 +349,35 @@ bool TrafficLightMapBasedDetector::get_traffic_light_roi(
346349 }
347350
348351 if (roi.roi .width < 1 || roi.roi .height < 1 ) {
349- return false ;
352+ return std:: nullopt ;
350353 }
351354 }
352- return true ;
355+ return roi ;
353356}
354357
355- bool TrafficLightMapBasedDetector::get_traffic_light_roi (
358+ std::optional<tier4_perception_msgs::msg::TrafficLightRoi>
359+ TrafficLightMapBasedDetector::get_traffic_light_roi (
356360 const std::vector<StampedTransform> & tf_map2camera_samples,
357361 const image_geometry::PinholeCameraModel & pinhole_camera_model,
358- const lanelet::ConstLineString3d traffic_light, const TrafficLightMapBasedDetectorConfig & config,
359- tier4_perception_msgs::msg::TrafficLightRoi & out_roi ) const
362+ const lanelet::ConstLineString3d traffic_light,
363+ const TrafficLightMapBasedDetectorConfig & config ) const
360364{
361365 std::vector<tier4_perception_msgs::msg::TrafficLightRoi> rois;
362366 for (const auto & sample : tf_map2camera_samples) {
363- const auto & tf_map2camera = sample. transform ;
364- tier4_perception_msgs::msg::TrafficLightRoi roi;
365- if ( get_traffic_light_roi (tf_map2camera , pinhole_camera_model, traffic_light, config, roi )) {
366- rois.push_back (roi );
367+ if (
368+ auto projected = project_traffic_light_to_roi (
369+ sample. transform , pinhole_camera_model, traffic_light, config)) {
370+ rois.push_back (*projected );
367371 }
368372 }
369373 if (rois.empty ()) {
370- return false ;
374+ return std:: nullopt ;
371375 }
372- out_roi = rois.front ();
376+ tier4_perception_msgs::msg::TrafficLightRoi out_roi = rois.front ();
373377 utils::compute_bounding_roi (
374378 pinhole_camera_model.cameraInfo ().width , pinhole_camera_model.cameraInfo ().height , rois,
375379 out_roi);
376- return true ;
380+ return out_roi ;
377381}
378382
379383visualization_msgs::msg::MarkerArray TrafficLightMapBasedDetector::create_traffic_light_markers (
0 commit comments