From b15f64606c38cff3ff94691f15f410d1f4c3fafb Mon Sep 17 00:00:00 2001 From: tzhong518 Date: Mon, 29 Jan 2024 19:58:05 +0900 Subject: [PATCH 1/3] chore: use config Signed-off-by: tzhong518 --- .../traffic_light.launch.xml | 27 +-- .../traffic_light_node_container.launch.py | 179 +++++++----------- .../traffic_light_classifier/CMakeLists.txt | 2 + .../car_traffic_light_classifier.param.yaml | 12 ++ ...strian_traffic_light_classifier.param.yaml | 12 ++ .../traffic_light_classifier.launch.xml | 24 +-- .../CMakeLists.txt | 2 + .../traffic_light_fine_detector.param.yaml | 9 + .../traffic_light_fine_detector.launch.xml | 16 +- 9 files changed, 117 insertions(+), 166 deletions(-) create mode 100644 perception/traffic_light_classifier/config/car_traffic_light_classifier.param.yaml create mode 100644 perception/traffic_light_classifier/config/pedestrian_traffic_light_classifier.param.yaml create mode 100644 perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml diff --git a/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light.launch.xml b/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light.launch.xml index 7b81a42fdb79f..dacdad933ebf8 100644 --- a/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light.launch.xml +++ b/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light.launch.xml @@ -24,12 +24,9 @@ - - - - - - + + + @@ -62,12 +59,9 @@ - - - - - - + + + @@ -119,12 +113,9 @@ - - - - - - + + + diff --git a/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light_node_container.launch.py b/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light_node_container.launch.py index dc5a2443d3f45..2c85bceb9f84e 100644 --- a/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light_node_container.launch.py +++ b/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light_node_container.launch.py @@ -18,89 +18,32 @@ from launch import LaunchDescription from launch.actions import DeclareLaunchArgument from launch.actions import SetLaunchConfiguration +from launch.actions import OpaqueFunction from launch.conditions import IfCondition from launch.conditions import UnlessCondition from launch.substitutions import LaunchConfiguration from launch_ros.actions import ComposableNodeContainer from launch_ros.actions import LoadComposableNodes from launch_ros.descriptions import ComposableNode +from launch_ros.parameter_descriptions import ParameterFile - -def generate_launch_description(): - launch_arguments = [] - - def add_launch_arg(name: str, default_value=None, description=None): - # a default_value of None is equivalent to not passing that kwarg at all - launch_arguments.append( - DeclareLaunchArgument(name, default_value=default_value, description=description) - ) - - fine_detector_share_dir = get_package_share_directory("traffic_light_fine_detector") - classifier_share_dir = get_package_share_directory("traffic_light_classifier") - add_launch_arg("enable_image_decompressor", "True") - add_launch_arg("enable_fine_detection", "True") - add_launch_arg("input/image", "/sensing/camera/traffic_light/image_raw") - add_launch_arg("output/rois", "/perception/traffic_light_recognition/rois") - add_launch_arg( - "output/traffic_signals", - "/perception/traffic_light_recognition/traffic_signals", - ) - add_launch_arg( - "output/car/traffic_signals", "/perception/traffic_light_recognition/car/traffic_signals" - ) - add_launch_arg( - "output/pedestrian/traffic_signals", - "/perception/traffic_light_recognition/pedestrian/traffic_signals", - ) - - # traffic_light_fine_detector - add_launch_arg( - "fine_detector_model_path", - os.path.join(fine_detector_share_dir, "data", "tlr_yolox_s.onnx"), - ) - add_launch_arg( - "fine_detector_label_path", - os.path.join(fine_detector_share_dir, "data", "tlr_labels.txt"), - ) - add_launch_arg("fine_detector_precision", "fp16") - add_launch_arg("fine_detector_score_thresh", "0.3") - add_launch_arg("fine_detector_nms_thresh", "0.65") - - add_launch_arg("approximate_sync", "False") - - # traffic_light_classifier - add_launch_arg("classifier_type", "1") - add_launch_arg( - "car_classifier_model_path", - os.path.join(classifier_share_dir, "data", "traffic_light_classifier_efficientNet_b1.onnx"), - ) - add_launch_arg( - "pedestrian_classifier_model_path", - os.path.join( - classifier_share_dir, "data", "pedestrian_traffic_light_classifier_efficientNet_b1.onnx" - ), - ) - add_launch_arg( - "car_classifier_label_path", os.path.join(classifier_share_dir, "data", "lamp_labels.txt") - ) - add_launch_arg( - "pedestrian_classifier_label_path", - os.path.join(classifier_share_dir, "data", "lamp_labels_ped.txt"), - ) - add_launch_arg("classifier_precision", "fp16") - add_launch_arg("classifier_mean", "[123.675, 116.28, 103.53]") - add_launch_arg("classifier_std", "[58.395, 57.12, 57.375]") - add_launch_arg("backlight_threshold", "0.85") - - add_launch_arg("use_intra_process", "False") - add_launch_arg("use_multithread", "False") - +def launch_setup(context, *args, **kwargs): def create_parameter_dict(*args): result = {} for x in args: result[x] = LaunchConfiguration(x) return result + fine_detector_model_param = ParameterFile( + param_file=LaunchConfiguration("fine_detector_param_path").perform(context), allow_substs=True + ) + car_traffic_light_classifier_model_param = ParameterFile( + param_file=LaunchConfiguration("car_classifier_param_path").perform(context), allow_substs=True + ) + pedestrian_traffic_light_classifier_model_param = ParameterFile( + param_file=LaunchConfiguration("pedestrian_classifier_param_path").perform(context), allow_substs=True + ) + container = ComposableNodeContainer( name="traffic_light_node_container", namespace="", @@ -112,19 +55,7 @@ def create_parameter_dict(*args): plugin="traffic_light::TrafficLightClassifierNodelet", name="car_traffic_light_classifier", namespace="classification", - parameters=[ - { - "approximate_sync": LaunchConfiguration("approximate_sync"), - "classifier_type": LaunchConfiguration("classifier_type"), - "classify_traffic_light_type": 0, - "classifier_model_path": LaunchConfiguration("car_classifier_model_path"), - "classifier_label_path": LaunchConfiguration("car_classifier_label_path"), - "classifier_precision": LaunchConfiguration("classifier_precision"), - "classifier_mean": LaunchConfiguration("classifier_mean"), - "classifier_std": LaunchConfiguration("classifier_std"), - "backlight_threshold": LaunchConfiguration("backlight_threshold"), - } - ], + parameters=[car_traffic_light_classifier_model_param], remappings=[ ("~/input/image", LaunchConfiguration("input/image")), ("~/input/rois", LaunchConfiguration("output/rois")), @@ -139,23 +70,7 @@ def create_parameter_dict(*args): plugin="traffic_light::TrafficLightClassifierNodelet", name="pedestrian_traffic_light_classifier", namespace="classification", - parameters=[ - { - "approximate_sync": LaunchConfiguration("approximate_sync"), - "classifier_type": LaunchConfiguration("classifier_type"), - "classify_traffic_light_type": 1, - "classifier_model_path": LaunchConfiguration( - "pedestrian_classifier_model_path" - ), - "classifier_label_path": LaunchConfiguration( - "pedestrian_classifier_label_path" - ), - "classifier_precision": LaunchConfiguration("classifier_precision"), - "classifier_mean": LaunchConfiguration("classifier_mean"), - "classifier_std": LaunchConfiguration("classifier_std"), - "backlight_threshold": LaunchConfiguration("backlight_threshold"), - } - ], + parameters=[pedestrian_traffic_light_classifier_model_param], remappings=[ ("~/input/image", LaunchConfiguration("input/image")), ("~/input/rois", LaunchConfiguration("output/rois")), @@ -214,14 +129,6 @@ def create_parameter_dict(*args): condition=IfCondition(LaunchConfiguration("enable_image_decompressor")), ) - fine_detector_param = create_parameter_dict( - "fine_detector_model_path", - "fine_detector_label_path", - "fine_detector_precision", - "fine_detector_score_thresh", - "fine_detector_nms_thresh", - ) - fine_detector_loader = LoadComposableNodes( composable_node_descriptions=[ ComposableNode( @@ -229,7 +136,7 @@ def create_parameter_dict(*args): plugin="traffic_light::TrafficLightFineDetectorNodelet", name="traffic_light_fine_detector", namespace="detection", - parameters=[fine_detector_param], + parameters=[fine_detector_model_param], remappings=[ ("~/input/image", LaunchConfiguration("input/image")), ("~/input/rois", "rough/rois"), @@ -245,6 +152,56 @@ def create_parameter_dict(*args): condition=IfCondition(LaunchConfiguration("enable_fine_detection")), ) + return [container, decompressor_loader, fine_detector_loader] + +def generate_launch_description(): + launch_arguments = [] + + def add_launch_arg(name: str, default_value=None, description=None): + # a default_value of None is equivalent to not passing that kwarg at all + launch_arguments.append( + DeclareLaunchArgument(name, default_value=default_value, description=description) + ) + + fine_detector_share_dir = get_package_share_directory("traffic_light_fine_detector") + classifier_share_dir = get_package_share_directory("traffic_light_classifier") + add_launch_arg("enable_image_decompressor", "True") + add_launch_arg("enable_fine_detection", "True") + add_launch_arg("input/image", "/sensing/camera/traffic_light/image_raw") + add_launch_arg("output/rois", "/perception/traffic_light_recognition/rois") + add_launch_arg( + "output/traffic_signals", + "/perception/traffic_light_recognition/traffic_signals", + ) + add_launch_arg( + "output/car/traffic_signals", "/perception/traffic_light_recognition/car/traffic_signals" + ) + add_launch_arg( + "output/pedestrian/traffic_signals", + "/perception/traffic_light_recognition/pedestrian/traffic_signals", + ) + + # traffic_light_fine_detector + add_launch_arg( + "fine_detector_param_path", + os.path.join(fine_detector_share_dir, "config", "traffic_light_fine_detector.param.yaml"), + ) + + # traffic_light_classifier + add_launch_arg( + "car_classifier_param_path", + os.path.join(classifier_share_dir, "config", "car_traffic_light_classifier_efficientNet.param.yaml"), + ) + add_launch_arg( + "pedestrian_classifier_param_path", + os.path.join( + classifier_share_dir, "config", "pedestrian_traffic_light_classifier_efficientNet.param.yaml" + ), + ) + + add_launch_arg("use_intra_process", "False") + add_launch_arg("use_multithread", "False") + set_container_executable = SetLaunchConfiguration( "container_executable", "component_container", @@ -262,8 +219,6 @@ def create_parameter_dict(*args): *launch_arguments, set_container_executable, set_container_mt_executable, - container, - decompressor_loader, - fine_detector_loader, + OpaqueFunction(function=launch_setup) ] ) diff --git a/perception/traffic_light_classifier/CMakeLists.txt b/perception/traffic_light_classifier/CMakeLists.txt index 22bc7521c6e31..a81dc6ab1e6ce 100644 --- a/perception/traffic_light_classifier/CMakeLists.txt +++ b/perception/traffic_light_classifier/CMakeLists.txt @@ -123,6 +123,7 @@ if(TRT_AVAIL AND CUDA_AVAIL AND CUDNN_AVAIL) ament_auto_package(INSTALL_TO_SHARE launch + config ) else() @@ -147,6 +148,7 @@ else() ament_auto_package(INSTALL_TO_SHARE launch + config ) endif() diff --git a/perception/traffic_light_classifier/config/car_traffic_light_classifier.param.yaml b/perception/traffic_light_classifier/config/car_traffic_light_classifier.param.yaml new file mode 100644 index 0000000000000..4661645cc961b --- /dev/null +++ b/perception/traffic_light_classifier/config/car_traffic_light_classifier.param.yaml @@ -0,0 +1,12 @@ +/**: + ros__parameters: + approximate_sync: false + classifier_label_path: "$(var traffic_light_classifier_model_path)/$(var car_traffic_light_classifier_label_name)" + classifier_model_path: "$(var traffic_light_classifier_model_path)/$(var car_traffic_light_classifier_model_name).onnx" + classifier_precision: fp16 + classifier_mean: [123.675, 116.28, 103.53] + classifier_std: [58.395, 57.12, 57.375] + backlight_threshold: 0.85 + build_only: false + classifier_type: 1 #classifier_type {hsv_filter: 0, cnn: 1} + classify_traffic_light_type: 0 #classify_traffic_light_type {car: 0, pedestrian:1} diff --git a/perception/traffic_light_classifier/config/pedestrian_traffic_light_classifier.param.yaml b/perception/traffic_light_classifier/config/pedestrian_traffic_light_classifier.param.yaml new file mode 100644 index 0000000000000..4ad71c7e094f2 --- /dev/null +++ b/perception/traffic_light_classifier/config/pedestrian_traffic_light_classifier.param.yaml @@ -0,0 +1,12 @@ +/**: + ros__parameters: + approximate_sync: false + classifier_label_path: "$(var traffic_light_classifier_model_path)/$(var pedestrian_traffic_light_classifier_label_name)" + classifier_model_path: "$(var traffic_light_classifier_model_path)/$(var pedestrian_traffic_light_classifier_model_name).onnx" + classifier_precision: fp16 + classifier_mean: [123.675, 116.28, 103.53] + classifier_std: [58.395, 57.12, 57.375] + backlight_threshold: 0.85 + build_only: false + classifier_type: 1 #classifier_type {hsv_filter: 0, cnn: 1} + classify_traffic_light_type: 1 #classify_traffic_light_type {car: 0, pedestrian:1} diff --git a/perception/traffic_light_classifier/launch/traffic_light_classifier.launch.xml b/perception/traffic_light_classifier/launch/traffic_light_classifier.launch.xml index 343531f4a00f1..902a83b679441 100644 --- a/perception/traffic_light_classifier/launch/traffic_light_classifier.launch.xml +++ b/perception/traffic_light_classifier/launch/traffic_light_classifier.launch.xml @@ -2,32 +2,12 @@ - - - - - - - - - - - - - - + - - - - - - - - + diff --git a/perception/traffic_light_fine_detector/CMakeLists.txt b/perception/traffic_light_fine_detector/CMakeLists.txt index f1f30a9da3195..fe9fa2ffcaa8b 100644 --- a/perception/traffic_light_fine_detector/CMakeLists.txt +++ b/perception/traffic_light_fine_detector/CMakeLists.txt @@ -101,6 +101,7 @@ if(TRT_AVAIL AND CUDA_AVAIL AND CUDNN_AVAIL) ament_auto_package(INSTALL_TO_SHARE launch + config ) else() @@ -108,5 +109,6 @@ else() # to avoid launch file missing without a gpu ament_auto_package(INSTALL_TO_SHARE launch + config ) endif() diff --git a/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml b/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml new file mode 100644 index 0000000000000..aac460293c7d3 --- /dev/null +++ b/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml @@ -0,0 +1,9 @@ +/**: + ros__parameters: + fine_detector_label_path: "$(var traffic_light_fine_detector_model_path)/$(var traffic_light_fine_detector_label_name)" + fine_detector_model_path: "$(var traffic_light_fine_detector_model_path)/$(var traffic_light_fine_detector_model_name).onnx" + fine_detector_precision: fp16 + build_only: false + fine_detector_score_thresh: 0.3 + fine_detector_nms_thresh: 0.65 + diff --git a/perception/traffic_light_fine_detector/launch/traffic_light_fine_detector.launch.xml b/perception/traffic_light_fine_detector/launch/traffic_light_fine_detector.launch.xml index 6e32d3410c260..f6411b1d105c4 100644 --- a/perception/traffic_light_fine_detector/launch/traffic_light_fine_detector.launch.xml +++ b/perception/traffic_light_fine_detector/launch/traffic_light_fine_detector.launch.xml @@ -1,27 +1,15 @@ - - - - - - - - + - - - - - - + From 33e2c3a2ea927387db311272a0d552a33f9a86eb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:03:43 +0000 Subject: [PATCH 2/3] style(pre-commit): autofix --- .../traffic_light_node_container.launch.py | 25 +++++++++++++------ .../traffic_light_fine_detector.param.yaml | 1 - 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light_node_container.launch.py b/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light_node_container.launch.py index 2c85bceb9f84e..e467aba5d4e98 100644 --- a/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light_node_container.launch.py +++ b/launch/tier4_perception_launch/launch/traffic_light_recognition/traffic_light_node_container.launch.py @@ -17,8 +17,8 @@ from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch.actions import DeclareLaunchArgument -from launch.actions import SetLaunchConfiguration from launch.actions import OpaqueFunction +from launch.actions import SetLaunchConfiguration from launch.conditions import IfCondition from launch.conditions import UnlessCondition from launch.substitutions import LaunchConfiguration @@ -27,6 +27,7 @@ from launch_ros.descriptions import ComposableNode from launch_ros.parameter_descriptions import ParameterFile + def launch_setup(context, *args, **kwargs): def create_parameter_dict(*args): result = {} @@ -35,13 +36,16 @@ def create_parameter_dict(*args): return result fine_detector_model_param = ParameterFile( - param_file=LaunchConfiguration("fine_detector_param_path").perform(context), allow_substs=True + param_file=LaunchConfiguration("fine_detector_param_path").perform(context), + allow_substs=True, ) car_traffic_light_classifier_model_param = ParameterFile( - param_file=LaunchConfiguration("car_classifier_param_path").perform(context), allow_substs=True + param_file=LaunchConfiguration("car_classifier_param_path").perform(context), + allow_substs=True, ) pedestrian_traffic_light_classifier_model_param = ParameterFile( - param_file=LaunchConfiguration("pedestrian_classifier_param_path").perform(context), allow_substs=True + param_file=LaunchConfiguration("pedestrian_classifier_param_path").perform(context), + allow_substs=True, ) container = ComposableNodeContainer( @@ -152,7 +156,8 @@ def create_parameter_dict(*args): condition=IfCondition(LaunchConfiguration("enable_fine_detection")), ) - return [container, decompressor_loader, fine_detector_loader] + return [container, decompressor_loader, fine_detector_loader] + def generate_launch_description(): launch_arguments = [] @@ -190,12 +195,16 @@ def add_launch_arg(name: str, default_value=None, description=None): # traffic_light_classifier add_launch_arg( "car_classifier_param_path", - os.path.join(classifier_share_dir, "config", "car_traffic_light_classifier_efficientNet.param.yaml"), + os.path.join( + classifier_share_dir, "config", "car_traffic_light_classifier_efficientNet.param.yaml" + ), ) add_launch_arg( "pedestrian_classifier_param_path", os.path.join( - classifier_share_dir, "config", "pedestrian_traffic_light_classifier_efficientNet.param.yaml" + classifier_share_dir, + "config", + "pedestrian_traffic_light_classifier_efficientNet.param.yaml", ), ) @@ -219,6 +228,6 @@ def add_launch_arg(name: str, default_value=None, description=None): *launch_arguments, set_container_executable, set_container_mt_executable, - OpaqueFunction(function=launch_setup) + OpaqueFunction(function=launch_setup), ] ) diff --git a/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml b/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml index aac460293c7d3..ec40fae199f15 100644 --- a/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml +++ b/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml @@ -6,4 +6,3 @@ build_only: false fine_detector_score_thresh: 0.3 fine_detector_nms_thresh: 0.65 - From 76e0585df26722a472f0614f8b49127527393303 Mon Sep 17 00:00:00 2001 From: tzhong518 Date: Thu, 1 Feb 2024 09:45:25 +0900 Subject: [PATCH 3/3] chore: move build only back Signed-off-by: tzhong518 --- .../config/car_traffic_light_classifier.param.yaml | 1 - .../config/pedestrian_traffic_light_classifier.param.yaml | 1 - .../launch/traffic_light_classifier.launch.xml | 2 ++ .../config/traffic_light_fine_detector.param.yaml | 1 - .../launch/traffic_light_fine_detector.launch.xml | 2 ++ 5 files changed, 4 insertions(+), 3 deletions(-) diff --git a/perception/traffic_light_classifier/config/car_traffic_light_classifier.param.yaml b/perception/traffic_light_classifier/config/car_traffic_light_classifier.param.yaml index 4661645cc961b..78490a6f8ee0d 100644 --- a/perception/traffic_light_classifier/config/car_traffic_light_classifier.param.yaml +++ b/perception/traffic_light_classifier/config/car_traffic_light_classifier.param.yaml @@ -7,6 +7,5 @@ classifier_mean: [123.675, 116.28, 103.53] classifier_std: [58.395, 57.12, 57.375] backlight_threshold: 0.85 - build_only: false classifier_type: 1 #classifier_type {hsv_filter: 0, cnn: 1} classify_traffic_light_type: 0 #classify_traffic_light_type {car: 0, pedestrian:1} diff --git a/perception/traffic_light_classifier/config/pedestrian_traffic_light_classifier.param.yaml b/perception/traffic_light_classifier/config/pedestrian_traffic_light_classifier.param.yaml index 4ad71c7e094f2..9974ef3c55b73 100644 --- a/perception/traffic_light_classifier/config/pedestrian_traffic_light_classifier.param.yaml +++ b/perception/traffic_light_classifier/config/pedestrian_traffic_light_classifier.param.yaml @@ -7,6 +7,5 @@ classifier_mean: [123.675, 116.28, 103.53] classifier_std: [58.395, 57.12, 57.375] backlight_threshold: 0.85 - build_only: false classifier_type: 1 #classifier_type {hsv_filter: 0, cnn: 1} classify_traffic_light_type: 1 #classify_traffic_light_type {car: 0, pedestrian:1} diff --git a/perception/traffic_light_classifier/launch/traffic_light_classifier.launch.xml b/perception/traffic_light_classifier/launch/traffic_light_classifier.launch.xml index 902a83b679441..5ccbef60e7abf 100644 --- a/perception/traffic_light_classifier/launch/traffic_light_classifier.launch.xml +++ b/perception/traffic_light_classifier/launch/traffic_light_classifier.launch.xml @@ -3,11 +3,13 @@ + + diff --git a/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml b/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml index aac460293c7d3..5a04beaca74ab 100644 --- a/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml +++ b/perception/traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml @@ -3,7 +3,6 @@ fine_detector_label_path: "$(var traffic_light_fine_detector_model_path)/$(var traffic_light_fine_detector_label_name)" fine_detector_model_path: "$(var traffic_light_fine_detector_model_path)/$(var traffic_light_fine_detector_model_name).onnx" fine_detector_precision: fp16 - build_only: false fine_detector_score_thresh: 0.3 fine_detector_nms_thresh: 0.65 diff --git a/perception/traffic_light_fine_detector/launch/traffic_light_fine_detector.launch.xml b/perception/traffic_light_fine_detector/launch/traffic_light_fine_detector.launch.xml index f6411b1d105c4..b87fe0d269453 100644 --- a/perception/traffic_light_fine_detector/launch/traffic_light_fine_detector.launch.xml +++ b/perception/traffic_light_fine_detector/launch/traffic_light_fine_detector.launch.xml @@ -4,6 +4,7 @@ + @@ -11,5 +12,6 @@ +