Skip to content

Commit edb4179

Browse files
feat(tier4_perception_launch): enable to use multi camera on traffic light recognition (#8676)
* main process Signed-off-by: MasatoSaeki <masato.saeki@tier4.jp> * style(pre-commit): autofix * add exception if input is invalid Signed-off-by: MasatoSaeki <masato.saeki@tier4.jp> --------- Signed-off-by: MasatoSaeki <masato.saeki@tier4.jp> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent d57f82d commit edb4179

6 files changed

+360
-147
lines changed

Diff for: launch/tier4_perception_launch/launch/perception.launch.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
<arg name="use_traffic_light_recognition" default="false"/>
9696
<arg name="traffic_light_recognition/enable_fine_detection" default="true"/>
9797
<arg name="traffic_light_recognition/fusion_only" default="false"/>
98-
<arg name="traffic_light_image_number" default="1" description="choose traffic light image raw number(1-2)"/>
98+
<arg name="all_traffic_light_camera" default="[camera6, camera7]" description="choose camera which use for traffic light recognition"/>
9999
<arg
100100
name="traffic_light_fine_detector_model_path"
101101
default="$(var data_path)/traffic_light_fine_detector"
@@ -294,7 +294,7 @@
294294
<include file="$(find-pkg-share tier4_perception_launch)/launch/traffic_light_recognition/traffic_light.launch.xml">
295295
<arg name="enable_fine_detection" value="$(var traffic_light_recognition/enable_fine_detection)"/>
296296
<arg name="fusion_only" value="$(var traffic_light_recognition/fusion_only)"/>
297-
<arg name="image_number" value="$(var traffic_light_image_number)"/>
297+
<arg name="all_camera_namespaces" value="$(var all_traffic_light_camera)"/>
298298
<arg name="traffic_light_arbiter_param_path" value="$(var traffic_light_arbiter_param_path)"/>
299299
<arg name="traffic_light_fine_detector_model_path" value="$(var traffic_light_fine_detector_model_path)"/>
300300
<arg name="traffic_light_fine_detector_model_name" value="$(var traffic_light_fine_detector_model_name)"/>

Diff for: launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light.launch.xml

+35-119
Original file line numberDiff line numberDiff line change
@@ -3,139 +3,55 @@
33
<arg name="enable_image_decompressor" default="true" description="enable image decompressor"/>
44
<arg name="enable_fine_detection" default="true" description="enable fine position adjustment of traffic light"/>
55
<arg name="fusion_only" default="false" description="launch only occlusion_predictor and multi_camera_fusion"/>
6-
<arg name="traffic_light_fine_detector_model_path" default="$(find-pkg-share autoware_traffic_light_fine_detector)/data" description="fine detector label path"/>
7-
<arg name="traffic_light_fine_detector_label_name" default="tlr_labels.txt" description="fine detector label filename"/>
8-
<arg name="traffic_light_fine_detector_model_name" default="tlr_yolox_s_batch_6" description="fine detector onnx model filename"/>
9-
<arg name="traffic_light_classifier_model_path" default="$(find-pkg-share autoware_traffic_light_classifier)/data" description="classifier label path"/>
10-
<arg name="car_traffic_light_classifier_label_name" default="lamp_labels.txt" description="classifier label filename"/>
11-
<arg name="pedestrian_traffic_light_classifier_label_name" default="lamp_labels_ped.txt" description="classifier label filename"/>
12-
<arg name="car_traffic_light_classifier_model_name" default="traffic_light_classifier_mobilenetv2_batch_6.onnx" description="classifier onnx model filename"/>
13-
<arg name="pedestrian_traffic_light_classifier_model_name" default="ped_traffic_light_classifier_mobilenetv2_batch_6.onnx" description="classifier onnx model filename"/>
146
<arg name="input/cloud" default="/sensing/lidar/top/pointcloud_raw_ex" description="point cloud for occlusion prediction"/>
157
<arg name="judged/traffic_signals" default="/perception/traffic_light_recognition/judged/traffic_signals"/>
168
<arg name="internal/traffic_signals" default="/perception/traffic_light_recognition/internal/traffic_signals"/>
179
<arg name="external/traffic_signals" default="/perception/traffic_light_recognition/external/traffic_signals"/>
1810
<arg name="output/traffic_signals" default="/perception/traffic_light_recognition/traffic_signals"/>
1911
<arg name="use_crosswalk_traffic_light_estimator" default="true" description="output pedestrian's traffic light signals"/>
2012
<arg name="crosswalk_traffic_light_estimator_param_file" default="$(find-pkg-share autoware_crosswalk_traffic_light_estimator)/config/crosswalk_traffic_light_estimator.param.yaml"/>
21-
<arg name="image_number" default="1" description="choose image raw number(1-2)"/>
22-
<arg name="namespace1" default="camera6"/>
23-
<arg name="namespace2" default="camera7"/>
24-
<let name="all_camera_namespaces" value="[$(var namespace1)]" if="$(eval &quot; '$(var image_number)' == '1' &quot;)"/>
25-
<let name="all_camera_namespaces" value="[$(var namespace1), $(var namespace2)]" if="$(eval &quot; '$(var image_number)' >= '2' &quot;)"/>
13+
<arg name="all_camera_namespaces" default="[camera6, camera7]"/>
2614

15+
<!-- ML parameters -->
2716
<arg name="fine_detector_param_path" default="$(find-pkg-share autoware_traffic_light_fine_detector)/config/traffic_light_fine_detector.param.yaml"/>
2817
<arg name="car_classifier_param_path" default="$(find-pkg-share autoware_traffic_light_classifier)/config/car_traffic_light_classifier.param.yaml"/>
2918
<arg name="pedestrian_classifier_param_path" default="$(find-pkg-share autoware_traffic_light_classifier)/config/pedestrian_traffic_light_classifier.param.yaml"/>
19+
<arg name="traffic_light_fine_detector_model_path" default="$(find-pkg-share autoware_traffic_light_fine_detector)/data" description="fine detector label path"/>
20+
<arg name="traffic_light_fine_detector_model_name" default="tlr_yolox_s_batch_6" description="fine detector onnx model filename"/>
21+
<arg name="traffic_light_fine_detector_label_name" default="tlr_labels.txt" description="fine detector label filename"/>
22+
<arg name="traffic_light_classifier_model_path" default="$(find-pkg-share autoware_traffic_light_classifier)/data" description="classifier label path"/>
23+
<arg name="car_traffic_light_classifier_label_name" default="lamp_labels.txt" description="classifier label filename"/>
24+
<arg name="pedestrian_traffic_light_classifier_label_name" default="lamp_labels_ped.txt" description="classifier label filename"/>
25+
<arg name="car_traffic_light_classifier_model_name" default="traffic_light_classifier_mobilenetv2_batch_6.onnx" description="classifier onnx model filename"/>
26+
<arg name="pedestrian_traffic_light_classifier_model_name" default="ped_traffic_light_classifier_mobilenetv2_batch_6.onnx" description="classifier onnx model filename"/>
3027

31-
<!-- namespace1 camera TLR pipeline -->
32-
<group>
33-
<push-ros-namespace namespace="$(var namespace1)"/>
34-
<let name="input/image" value="/sensing/camera/$(var namespace1)/image_raw"/>
35-
<let name="input/camera_info" value="/sensing/camera/$(var namespace1)/camera_info"/>
36-
<let name="output/rois1" value="/perception/traffic_light_recognition/$(var namespace1)/detection/rois"/>
37-
<let name="output/traffic_signals1" value="/perception/traffic_light_recognition/$(var namespace1)/classification/traffic_signals"/>
38-
<let name="output/car/traffic_signals1" value="/perception/traffic_light_recognition/$(var namespace1)/classification/car/traffic_signals"/>
39-
<let name="output/pedestrian/traffic_signals1" value="/perception/traffic_light_recognition/$(var namespace1)/classification/pedestrian/traffic_signals"/>
40-
<let name="map_based_detector_output_topic" value="rough/rois" if="$(var enable_fine_detection)"/>
41-
<let name="map_based_detector_output_topic" value="$(var output/rois1)" unless="$(var enable_fine_detection)"/>
42-
43-
<group unless="$(var fusion_only)">
44-
<node pkg="topic_tools" exec="relay" name="traffic_light_camera_info_relay" args="$(var input/camera_info) camera_info"/>
45-
<group>
46-
<push-ros-namespace namespace="detection"/>
47-
<include file="$(find-pkg-share autoware_traffic_light_map_based_detector)/launch/traffic_light_map_based_detector.launch.xml">
48-
<arg name="input/camera_info" value="$(var input/camera_info)"/>
49-
<arg name="expect/rois" value="expect/rois"/>
50-
<arg name="output/rois" value="$(var map_based_detector_output_topic)"/>
51-
<!-- This parameter should be configured differently for each camera considering their delay. -->
52-
<arg name="min_timestamp_offset" value="-0.3"/>
53-
<arg name="max_timestamp_offset" value="0.0"/>
54-
</include>
55-
</group>
56-
57-
<include file="$(find-pkg-share tier4_perception_launch)/launch/traffic_light_recognition/traffic_light_node_container.launch.py">
58-
<arg name="input/image" value="$(var input/image)"/>
59-
<arg name="enable_image_decompressor" value="$(var enable_image_decompressor)"/>
60-
<arg name="enable_fine_detection" value="$(var enable_fine_detection)"/>
61-
<arg name="use_intra_process" value="true"/>
62-
<arg name="use_multithread" value="true"/>
63-
<arg name="fine_detector_param_path" value="$(var fine_detector_param_path)"/>
64-
<arg name="car_classifier_param_path" value="$(var car_classifier_param_path)"/>
65-
<arg name="pedestrian_classifier_param_path" value="$(var pedestrian_classifier_param_path)"/>
66-
<arg name="output/rois" value="$(var output/rois1)"/>
67-
<arg name="output/traffic_signals" value="$(var output/traffic_signals1)"/>
68-
<arg name="output/car/traffic_signals" value="$(var output/car/traffic_signals1)"/>
69-
<arg name="output/pedestrian/traffic_signals" value="$(var output/pedestrian/traffic_signals1)"/>
70-
</include>
71-
</group>
72-
73-
<group>
74-
<push-ros-namespace namespace="classification"/>
75-
<include file="$(find-pkg-share autoware_traffic_light_occlusion_predictor)/launch/traffic_light_occlusion_predictor.launch.xml">
76-
<arg name="input/camera_info" value="$(var input/camera_info)"/>
77-
<arg name="input/cloud" value="$(var input/cloud)"/>
78-
<arg name="input/rois" value="$(var output/rois1)"/>
79-
<arg name="input/car/traffic_signals" value="classified/car/traffic_signals"/>
80-
<arg name="input/pedestrian/traffic_signals" value="classified/pedestrian/traffic_signals"/>
81-
<arg name="output/traffic_signals" value="$(var output/traffic_signals1)"/>
82-
</include>
83-
</group>
28+
<!-- main TLR pipeline on each camera -->
29+
<group unless="$(var fusion_only)">
30+
<include file="$(find-pkg-share tier4_perception_launch)/launch/traffic_light_recognition/traffic_light_camera_info_relay.launch.py">
31+
<arg name="all_camera_namespaces" value="$(var all_camera_namespaces)"/>
32+
</include>
33+
<include file="$(find-pkg-share tier4_perception_launch)/launch/traffic_light_recognition/traffic_light_map_based_detector.launch.py">
34+
<arg name="all_camera_namespaces" value="$(var all_camera_namespaces)"/>
35+
<arg name="enable_fine_detection" value="$(var enable_fine_detection)"/>
36+
</include>
37+
<include file="$(find-pkg-share tier4_perception_launch)/launch/traffic_light_recognition/traffic_light_node_container.launch.py">
38+
<arg name="all_camera_namespaces" value="$(var all_camera_namespaces)"/>
39+
<arg name="enable_image_decompressor" value="$(var enable_image_decompressor)"/>
40+
<arg name="enable_fine_detection" value="$(var enable_fine_detection)"/>
41+
<arg name="use_intra_process" value="true"/>
42+
<arg name="use_multithread" value="true"/>
43+
<arg name="fine_detector_param_path" value="$(var fine_detector_param_path)"/>
44+
<arg name="car_classifier_param_path" value="$(var car_classifier_param_path)"/>
45+
<arg name="pedestrian_classifier_param_path" value="$(var pedestrian_classifier_param_path)"/>
46+
</include>
8447
</group>
8548

86-
<!-- namespace2 camera TLR pipeline -->
87-
<group if="$(eval &quot; '$(var image_number)' >= '2' &quot;)">
88-
<push-ros-namespace namespace="$(var namespace2)"/>
89-
<let name="input/image" value="/sensing/camera/$(var namespace2)/image_raw"/>
90-
<let name="input/camera_info" value="/sensing/camera/$(var namespace2)/camera_info"/>
91-
<let name="output/rois2" value="/perception/traffic_light_recognition/$(var namespace2)/detection/rois"/>
92-
<let name="output/traffic_signals2" value="/perception/traffic_light_recognition/$(var namespace2)/classification/traffic_signals"/>
93-
<let name="output/car/traffic_signals2" value="/perception/traffic_light_recognition/$(var namespace2)/classification/car/traffic_signals"/>
94-
<let name="output/pedestrian/traffic_signals2" value="/perception/traffic_light_recognition/$(var namespace2)/classification/pedestrian/traffic_signals"/>
95-
<let name="map_based_detector_output_topic" value="rough/rois" if="$(var enable_fine_detection)"/>
96-
<let name="map_based_detector_output_topic" value="rois" unless="$(var enable_fine_detection)"/>
97-
98-
<group unless="$(var fusion_only)">
99-
<node pkg="topic_tools" exec="relay" name="traffic_light_camera_info_relay" args="$(var input/camera_info) camera_info"/>
100-
<group>
101-
<push-ros-namespace namespace="detection"/>
102-
<include file="$(find-pkg-share autoware_traffic_light_map_based_detector)/launch/traffic_light_map_based_detector.launch.xml">
103-
<arg name="input/camera_info" value="$(var input/camera_info)"/>
104-
<arg name="expect/rois" value="expect/rois"/>
105-
<arg name="output/rois" value="$(var map_based_detector_output_topic)"/>
106-
<!-- This parameter should be configured differently for each camera considering their delay. -->
107-
<arg name="min_timestamp_offset" value="-0.04"/>
108-
<arg name="max_timestamp_offset" value="0.0"/>
109-
</include>
110-
</group>
111-
112-
<include file="$(find-pkg-share tier4_perception_launch)/launch/traffic_light_recognition/traffic_light_node_container.launch.py">
113-
<arg name="input/image" value="$(var input/image)"/>
114-
<arg name="enable_image_decompressor" value="$(var enable_image_decompressor)"/>
115-
<arg name="enable_fine_detection" value="$(var enable_fine_detection)"/>
116-
<arg name="use_intra_process" value="true"/>
117-
<arg name="use_multithread" value="true"/>
118-
<arg name="fine_detector_param_path" value="$(var fine_detector_param_path)"/>
119-
<arg name="car_classifier_param_path" value="$(var car_classifier_param_path)"/>
120-
<arg name="pedestrian_classifier_param_path" value="$(var pedestrian_classifier_param_path)"/>
121-
<arg name="output/rois" value="$(var output/rois2)"/>
122-
<arg name="output/traffic_signals" value="$(var output/traffic_signals2)"/>
123-
<arg name="output/car/traffic_signals" value="$(var output/car/traffic_signals2)"/>
124-
<arg name="output/pedestrian/traffic_signals" value="$(var output/pedestrian/traffic_signals2)"/>
125-
</include>
126-
</group>
127-
128-
<group>
129-
<push-ros-namespace namespace="classification"/>
130-
<include file="$(find-pkg-share autoware_traffic_light_occlusion_predictor)/launch/traffic_light_occlusion_predictor.launch.xml">
131-
<arg name="input/camera_info" value="$(var input/camera_info)"/>
132-
<arg name="input/cloud" value="$(var input/cloud)"/>
133-
<arg name="input/rois" value="$(var output/rois2)"/>
134-
<arg name="input/car/traffic_signals" value="classified/car/traffic_signals"/>
135-
<arg name="input/pedestrian/traffic_signals" value="classified/pedestrian/traffic_signals"/>
136-
<arg name="output/traffic_signals" value="$(var output/traffic_signals2)"/>
137-
</include>
138-
</group>
49+
<!-- traffic_light_occlusion_predictor on each camera -->
50+
<group>
51+
<include file="$(find-pkg-share tier4_perception_launch)/launch/traffic_light_recognition/traffic_light_occlusion_predictor.launch.py">
52+
<arg name="all_camera_namespaces" value="$(var all_camera_namespaces)"/>
53+
<arg name="input/cloud" value="$(var input/cloud)"/>
54+
</include>
13955
</group>
14056

14157
<!-- traffic_light_multi_camera_fusion -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# Copyright 2024 TIER IV, Inc.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
16+
import launch
17+
from launch.actions import DeclareLaunchArgument
18+
from launch.actions import GroupAction
19+
from launch.actions import OpaqueFunction
20+
from launch.substitutions import LaunchConfiguration
21+
from launch_ros.actions import Node
22+
from launch_ros.actions import PushRosNamespace
23+
import yaml
24+
25+
26+
def create_traffic_light_camera_info_relay(namespace):
27+
relay_node = Node(
28+
package="topic_tools",
29+
executable="relay",
30+
name="traffic_light_camera_info_relay",
31+
arguments=[f"/sensing/camera/{namespace}/camera_info", "camera_info"],
32+
)
33+
34+
group = GroupAction(
35+
[
36+
PushRosNamespace(namespace),
37+
relay_node,
38+
]
39+
)
40+
41+
return group
42+
43+
44+
def launch_setup(context, *args, **kwargs):
45+
# Load all camera namespaces
46+
all_camera_namespaces = LaunchConfiguration("all_camera_namespaces").perform(context)
47+
48+
# Convert string to list
49+
all_camera_namespaces = yaml.load(all_camera_namespaces, Loader=yaml.FullLoader)
50+
if not isinstance(all_camera_namespaces, list):
51+
raise ValueError(
52+
"all_camera_namespaces is not a list. You should declare it like `['camera6', 'camera7']`."
53+
)
54+
if not all((isinstance(v, str) for v in all_camera_namespaces)):
55+
raise ValueError(
56+
"all_camera_namespaces is not a list of strings. You should declare it like `['camera6', 'camera7']`."
57+
)
58+
59+
# Create containers for all cameras
60+
traffic_light_recognition_containers = [
61+
create_traffic_light_camera_info_relay(namespace) for namespace in all_camera_namespaces
62+
]
63+
return traffic_light_recognition_containers
64+
65+
66+
def generate_launch_description():
67+
return launch.LaunchDescription(
68+
[
69+
DeclareLaunchArgument("all_camera_namespaces", description="camera namespace list"),
70+
OpaqueFunction(function=launch_setup),
71+
]
72+
)

0 commit comments

Comments
 (0)