Skip to content

Commit ccac602

Browse files
author
Takahisa.Ishikawa
committed
refactor(autoware_traffic_light_map_based_detector): unify ROI computation and use std::optional
Treat the single-transform ROI calculation as the one-element case of the multi-transform bounding ROI calculation, exposing a single get_traffic_light_roi() returning std::optional<TrafficLightRoi>. Promote the per-transform projection to project_traffic_light_to_roi() returning std::optional. Signed-off-by: Takahisa.Ishikawa <takahisa.ishikawa@tier4.jp>
1 parent 6d1dc5a commit ccac602

2 files changed

Lines changed: 41 additions & 42 deletions

File tree

perception/autoware_traffic_light_map_based_detector/src/traffic_light_map_based_detector.cpp

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
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

166167
const 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

379383
visualization_msgs::msg::MarkerArray TrafficLightMapBasedDetector::create_traffic_light_markers(

perception/autoware_traffic_light_map_based_detector/src/traffic_light_map_based_detector.hpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,13 @@ class TrafficLightMapBasedDetector
127127
* @param pinhole_camera_model pinhole model calculated from camera_info
128128
* @param traffic_light lanelet traffic light object
129129
* @param config offset configuration
130-
* @param roi computed result
131-
* @return true the computation succeeded
132-
* @return false the computation failed
130+
* @return the projected ROI, or std::nullopt if the projection fails
133131
*/
134-
bool get_traffic_light_roi(
132+
std::optional<tier4_perception_msgs::msg::TrafficLightRoi> project_traffic_light_to_roi(
135133
const tf2::Transform & tf_map2camera,
136134
const image_geometry::PinholeCameraModel & pinhole_camera_model,
137135
const lanelet::ConstLineString3d traffic_light,
138-
const TrafficLightMapBasedDetectorConfig & config,
139-
tier4_perception_msgs::msg::TrafficLightRoi & roi) const;
136+
const TrafficLightMapBasedDetectorConfig & config) const;
140137

141138
/**
142139
* @brief Compute the bounding ROI from multiple transforms
@@ -145,16 +142,14 @@ class TrafficLightMapBasedDetector
145142
* @param pinhole_camera_model pinhole model calculated from camera_info
146143
* @param traffic_light lanelet traffic light object
147144
* @param config offset configuration
148-
* @param out_roi computed result
149-
* @return true the computation succeeded
150-
* @return false the computation failed
145+
* @return the bounding ROI, or std::nullopt if no sample yields a valid
146+
* projection
151147
*/
152-
bool get_traffic_light_roi(
148+
std::optional<tier4_perception_msgs::msg::TrafficLightRoi> get_traffic_light_roi(
153149
const std::vector<StampedTransform> & tf_map2camera_samples,
154150
const image_geometry::PinholeCameraModel & pinhole_camera_model,
155151
const lanelet::ConstLineString3d traffic_light,
156-
const TrafficLightMapBasedDetectorConfig & config,
157-
tier4_perception_msgs::msg::TrafficLightRoi & out_roi) const;
152+
const TrafficLightMapBasedDetectorConfig & config) const;
158153

159154
/**
160155
* @brief Create visualization markers for visible traffic lights

0 commit comments

Comments
 (0)