From f496b372fc3b2e4c23762909af19df298d4a83e1 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Thu, 30 Jan 2025 13:58:03 +0900 Subject: [PATCH 1/2] feat: introduce motion_velocity_obstacle__module (#9807) * implement obstacle stop, slow_down, and cruise Signed-off-by: Takayuki Murooka * fix clang-tidy Signed-off-by: Takayuki Murooka * revert obstacle_cruise_planner Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka --- planning/.pages | 3 + .../CMakeLists.txt | 12 + .../README.md | 118 ++ .../config/obstacle_cruise.param.yaml | 120 ++ .../docs/cruise_visualization.png | Bin 0 -> 77700 bytes .../package.xml | 41 + .../plugins.xml | 3 + .../src/cruise_planner_interface.hpp | 104 ++ .../src/metrics_manager.hpp | 60 + .../src/obstacle_cruise_module.cpp | 826 ++++++++++++ .../src/obstacle_cruise_module.hpp | 137 ++ .../optimization_based_planner.cpp | 754 +++++++++++ .../optimization_based_planner.hpp | 141 ++ .../optimization_based_planner/s_boundary.hpp | 36 + .../velocity_optimizer.cpp | 287 ++++ .../velocity_optimizer.hpp | 77 ++ .../src/parameters.hpp | 159 +++ .../cruise_planning_debug_info.hpp | 100 ++ .../pid_based_planner/pid_based_planner.cpp | 774 +++++++++++ .../pid_based_planner/pid_based_planner.hpp | 158 +++ .../src/pid_based_planner/pid_controller.hpp | 65 + .../src/type_alias.hpp | 70 + .../src/types.hpp | 67 + .../CMakeLists.txt | 12 + .../README.md | 52 + .../config/obstacle_slow_down.param.yaml | 50 + .../docs/slow_down_planning.drawio.svg | 133 ++ .../docs/slow_down_velocity_calculation.svg | 534 ++++++++ .../docs/slow_down_visualization.png | Bin 0 -> 88932 bytes .../package.xml | 40 + .../plugins.xml | 3 + .../src/metrics_manager.hpp | 60 + .../src/obstacle_slow_down_module.cpp | 907 +++++++++++++ .../src/obstacle_slow_down_module.hpp | 123 ++ .../src/parameters.hpp | 176 +++ .../src/type_alias.hpp | 70 + .../src/types.hpp | 144 ++ .../CMakeLists.txt | 12 + .../README.md | 82 ++ .../config/obstacle_stop.param.yaml | 74 ++ .../docs/collision_point.png | Bin 0 -> 263981 bytes .../docs/detection_area.png | Bin 0 -> 220257 bytes .../docs/stop_visualization.png | Bin 0 -> 74067 bytes .../package.xml | 40 + .../plugins.xml | 3 + .../src/metrics_manager.hpp | 102 ++ .../src/obstacle_stop_module.cpp | 1180 +++++++++++++++++ .../src/obstacle_stop_module.hpp | 196 +++ .../src/parameters.hpp | 210 +++ .../src/stop_planning_debug_info.hpp | 90 ++ .../src/type_alias.hpp | 63 + .../src/types.hpp | 73 + 52 files changed, 8541 insertions(+) create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/CMakeLists.txt create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/README.md create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/config/obstacle_cruise.param.yaml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/docs/cruise_visualization.png create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/package.xml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/plugins.xml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/cruise_planner_interface.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/metrics_manager.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/obstacle_cruise_module.cpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/obstacle_cruise_module.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/optimization_based_planner.cpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/optimization_based_planner.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/s_boundary.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/velocity_optimizer.cpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/velocity_optimizer.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/parameters.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/cruise_planning_debug_info.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_based_planner.cpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_based_planner.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_controller.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/type_alias.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/types.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/CMakeLists.txt create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/README.md create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/config/obstacle_slow_down.param.yaml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_planning.drawio.svg create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_velocity_calculation.svg create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_visualization.png create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/package.xml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/plugins.xml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/metrics_manager.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/obstacle_slow_down_module.cpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/obstacle_slow_down_module.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/parameters.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/type_alias.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/types.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/CMakeLists.txt create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/README.md create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/config/obstacle_stop.param.yaml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/docs/collision_point.png create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/docs/detection_area.png create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/docs/stop_visualization.png create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/package.xml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/plugins.xml create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/metrics_manager.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/obstacle_stop_module.cpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/obstacle_stop_module.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/parameters.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/stop_planning_debug_info.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/type_alias.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/types.hpp diff --git a/planning/.pages b/planning/.pages index 7444815cdd28a..735e2b2c907c0 100644 --- a/planning/.pages +++ b/planning/.pages @@ -63,6 +63,9 @@ nav: - 'Motion Velocity Planner': - 'About Motion Velocity Planner': planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/ - 'Available Modules': + - 'Obstacle Stop': planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/ + - 'Obstacle Slow Down': planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/ + - 'Obstacle Cruise': planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/ - 'Dynamic Obstacle Stop': planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/ - 'Out of Lane': planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/ - 'Obstacle Velocity Limiter': planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/CMakeLists.txt b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/CMakeLists.txt new file mode 100644 index 0000000000000..f51e026428aec --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.14) +project(autoware_motion_velocity_obstacle_cruise_module) + +find_package(autoware_cmake REQUIRED) +autoware_package() +pluginlib_export_plugin_description_file(autoware_motion_velocity_planner_node_universe plugins.xml) + +ament_auto_add_library(${PROJECT_NAME} SHARED + DIRECTORY src +) + +ament_auto_package(INSTALL_TO_SHARE config) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/README.md b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/README.md new file mode 100644 index 0000000000000..296bb6290e398 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/README.md @@ -0,0 +1,118 @@ +# Obstacle Cruise + +## Role + +The `obstacle_cruise` module does the cruise planning against a dynamic obstacle in front of the ego. + +## Activation + +This module is activated if the launch parameter `launch_obstacle_cruise_module` is set to true. + +## Inner-workings / Algorithms + +### Obstacle Filtering + +The obstacles meeting the following condition are determined as obstacles for cruising. + +- The lateral distance from the object to the ego's trajectory is smaller than `obstacle_filtering.max_lat_margin`. + +- The object type is for cruising according to `obstacle_filtering.object_type.*`. +- The object is not crossing the ego's trajectory (\*1). +- If the object is inside the trajectory. + - The object type is for inside cruising according to `obstacle_filtering.object_type.inside.*`. + - The object velocity is larger than `obstacle_filtering.obstacle_velocity_threshold_from_cruise`. +- If the object is outside the trajectory. + - The object type is for outside cruising according to `obstacle_filtering.object_type.outside.*`. + - The object velocity is larger than `obstacle_filtering.outside_obstacle.obstacle_velocity_threshold`. + - The highest confident predicted path collides with the ego's trajectory. + - Its collision's period is larger than `obstacle_filtering.outside_obstacle.ego_obstacle_overlap_time_threshold`. + +#### NOTE + +##### \*1: Crossing obstacles + +Crossing obstacle is the object whose orientation's yaw angle against the ego's trajectory is smaller than `obstacle_filtering.crossing_obstacle.obstacle_traj_angle_threshold`. + +##### Yield for vehicles that might cut in into the ego's lane + +It is also possible to yield (cruise) behind vehicles in neighbor lanes if said vehicles might cut in the ego vehicle's current lane. + +The obstacles meeting the following condition are determined as obstacles for yielding (cruising). + +- The object type is for cruising according to `obstacle_filtering.object_type.*` and it is moving with a speed greater than `obstacle_filtering.yield.stopped_obstacle_velocity_threshold`. +- The object is not crossing the ego's trajectory (\*1). +- There is another object of type `obstacle_filtering.object_type.*` stopped in front of the moving obstacle. +- The lateral distance (using the ego's trajectory as reference) between both obstacles is less than `obstacle_filtering.yield.max_lat_dist_between_obstacles` +- Both obstacles, moving and stopped, are within `obstacle_filtering.yield.lat_distance_threshold` and `obstacle_filtering.yield.lat_distance_threshold` + `obstacle_filtering.yield.max_lat_dist_between_obstacles` lateral distance from the ego's trajectory respectively. + +If the above conditions are met, the ego vehicle will cruise behind the moving obstacle, yielding to it so it can cut in into the ego's lane to avoid the stopped obstacle. + +### Cruise Planning + +The role of the cruise planning is keeping a safe distance with dynamic vehicle objects with smoothed velocity transition. +This includes not only cruising a front vehicle, but also reacting a cut-in and cut-out vehicle. + +The safe distance is calculated dynamically based on the Responsibility-Sensitive Safety (RSS) by the following equation. + +$$ +d_{rss} = v_{ego} t_{idling} + \frac{1}{2} a_{ego} t_{idling}^2 + \frac{v_{ego}^2}{2 a_{ego}} - \frac{v_{obstacle}^2}{2 a_{obstacle}}, +$$ + +assuming that $d_{rss}$ is the calculated safe distance, $t_{idling}$ is the idling time for the ego to detect the front vehicle's deceleration, $v_{ego}$ is the ego's current velocity, $v_{obstacle}$ is the front obstacle's current velocity, $a_{ego}$ is the ego's acceleration, and $a_{obstacle}$ is the obstacle's acceleration. +These values are parameterized as follows. Other common values such as ego's minimum acceleration is defined in `common.param.yaml`. + +| Parameter | Type | Description | +| ------------------------------------------ | ------ | ----------------------------------------------------------------------------- | +| `cruise_planning.idling_time` | double | idling time for the ego to detect the front vehicle starting deceleration [s] | +| `cruise_planning.min_ego_accel_for_rss` | double | ego's acceleration for RSS [m/ss] | +| `cruise_planning.min_object_accel_for_rss` | double | front obstacle's acceleration for RSS [m/ss] | + +The detailed formulation is as follows. + +$$ +\begin{align} +d_{error} & = d - d_{rss} \\ +d_{normalized} & = lpf(d_{error} / d_{obstacle}) \\ +d_{quad, normalized} & = sign(d_{normalized}) *d_{normalized}*d_{normalized} \\ +v_{pid} & = pid(d_{quad, normalized}) \\ +v_{add} & = v_{pid} > 0 ? v_{pid}* w_{acc} : v_{pid} \\ +v_{target} & = max(v_{ego} + v_{add}, v_{min, cruise}) +\end{align} +$$ + +| Variable | Description | +| ----------------- | --------------------------------------- | +| `d` | actual distance to obstacle | +| `d_{rss}` | ideal distance to obstacle based on RSS | +| `v_{min, cruise}` | `min_cruise_target_vel` | +| `w_{acc}` | `output_ratio_during_accel` | +| `lpf(val)` | apply low-pass filter to `val` | +| `pid(val)` | apply pid to `val` | + +#### Algorithm selection for cruise planner + +Currently, only a PID-based planner is supported. +Each planner will be explained in the following. + +| Parameter | Type | Description | +| --------------------------- | ------ | ------------------------------------------------------------ | +| `option.planning_algorithm` | string | cruise and stop planning algorithm, selected from "pid_base" | + +#### PID-based planner + +In order to keep the safe distance, the target velocity and acceleration is calculated and sent as an external velocity limit to the velocity smoothing package (`velocity_smoother` by default). +The target velocity and acceleration is respectively calculated with the PID controller according to the error between the reference safe distance and the actual distance. + +#### Optimization-based planner + +under construction + +## Debugging + +### Obstacle for cruise + +Orange sphere which is an obstacle for cruise is visualized by `obstacles_to_cruise` in the `~/debug/marker` topic. + +Orange wall which means a safe distance to cruise if the ego's front meets the wall is visualized in the `~/debug/cruise/virtual_wall` topic. + +![cruise_visualization](./docs/cruise_visualization.png) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/config/obstacle_cruise.param.yaml b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/config/obstacle_cruise.param.yaml new file mode 100644 index 0000000000000..214f7bb35a155 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/config/obstacle_cruise.param.yaml @@ -0,0 +1,120 @@ +/**: + ros__parameters: + obstacle_cruise: + option: + planning_algorithm: "pid_base" # currently supported algorithm is "pid_base" + + cruise_planning: + idling_time: 2.0 # idling time to detect front vehicle starting deceleration [s] + min_ego_accel_for_rss: -1.0 # ego's acceleration to calculate RSS distance [m/ss] + min_object_accel_for_rss: -1.0 # front obstacle's acceleration to calculate RSS distance [m/ss] + safe_distance_margin : 5.0 # This is also used as a stop margin [m] + + pid_based_planner: + use_velocity_limit_based_planner: true + error_function_type: quadratic # choose from linear, quadratic + + velocity_limit_based_planner: + # PID gains to keep safe distance with the front vehicle + kp: 10.0 + ki: 0.0 + kd: 2.0 + + output_ratio_during_accel: 0.6 # target acceleration is multiplied with this value while ego accelerates to catch up the front vehicle [-] + vel_to_acc_weight: 12.0 # target acceleration is calculated by (target_velocity - current_velocity) * vel_to_acc_weight [-] + + enable_jerk_limit_to_output_acc: false + + disable_target_acceleration: true + + velocity_insertion_based_planner: + kp_acc: 6.0 + ki_acc: 0.0 + kd_acc: 2.0 + + kp_jerk: 20.0 + ki_jerk: 0.0 + kd_jerk: 0.0 + + output_acc_ratio_during_accel: 0.6 # target acceleration is multiplied with this value while ego accelerates to catch up the front vehicle [-] + output_jerk_ratio_during_accel: 1.0 # target acceleration is multiplied with this value while ego accelerates to catch up the front vehicle [-] + + enable_jerk_limit_to_output_acc: true + + min_accel_during_cruise: -2.0 # minimum acceleration during cruise to slow down [m/ss] + min_cruise_target_vel: 0.0 # minimum target velocity during slow down [m/s] + time_to_evaluate_rss: 0.0 + + lpf_normalized_error_cruise_dist_gain: 0.2 + + optimization_based_planner: + dense_resampling_time_interval: 0.2 + sparse_resampling_time_interval: 2.0 + dense_time_horizon: 5.0 + max_time_horizon: 25.0 + velocity_margin: 0.2 #[m/s] + + # Parameters for safe distance + t_dangerous: 0.5 + + # For initial Motion + replan_vel_deviation: 5.0 # velocity deviation to replan initial velocity [m/s] + engage_velocity: 0.25 # engage velocity threshold [m/s] (if the trajectory velocity is higher than this value, use this velocity for engage vehicle speed) + engage_acceleration: 0.1 # engage acceleration [m/ss] (use this acceleration when engagement) + engage_exit_ratio: 0.5 # exit engage sequence to normal velocity planning when the velocity exceeds engage_exit_ratio x engage_velocity. + stop_dist_to_prohibit_engage: 0.5 # if the stop point is in this distance, the speed is set to 0 not to move the vehicle [m] + + # Weights for optimization + max_s_weight: 100.0 + max_v_weight: 1.0 + over_s_safety_weight: 1000000.0 + over_s_ideal_weight: 50.0 + over_v_weight: 500000.0 + over_a_weight: 5000.0 + over_j_weight: 10000.0 + + obstacle_filtering: + object_type: + inside: + unknown: true + car: true + truck: true + bus: true + trailer: true + motorcycle: true + bicycle: true + pedestrian: false + + outside: + unknown: false + car: true + truck: true + bus: true + trailer: true + motorcycle: true + bicycle: false + pedestrian: false + + max_lat_margin: 1.0 # lateral margin between obstacle and trajectory band with ego's width + + # if crossing vehicle is determined as target obstacles or not + crossing_obstacle: + obstacle_velocity_threshold : 1.0 # velocity threshold for crossing obstacle for cruise or stop [m/s] + obstacle_traj_angle_threshold : 0.523599 # [rad] = 70 [deg], yaw threshold of crossing obstacle against the nearest trajectory point for cruise or stop + + outside_obstacle: + obstacle_velocity_threshold : 1.5 # minimum velocity threshold of obstacles outside the trajectory to cruise or stop [m/s] + ego_obstacle_overlap_time_threshold : 0.2 # time threshold to decide cut-in obstacle for cruise or stop [s] + max_prediction_time_for_collision_check : 10.0 # prediction time to check collision between obstacle and ego + max_lateral_time_margin: 5.0 # time threshold of lateral margin between obstacle and trajectory band with ego's width [s] + num_of_predicted_paths: 1 # number of the highest confidence predicted path to check collision between obstacle and ego + yield: + enable_yield: true + lat_distance_threshold: 5.0 # lateral margin between obstacle in neighbor lanes and trajectory band with ego's width for yielding + max_lat_dist_between_obstacles: 2.5 # lateral margin between moving obstacle in neighbor lanes and stopped obstacle in front of it + max_obstacles_collision_time: 10.0 # how far the blocking obstacle + stopped_obstacle_velocity_threshold: 0.5 + + # hysteresis for cruise and stop + obstacle_velocity_threshold_from_cruise : 3.0 # stop planning is executed to the obstacle whose velocity is less than this value [m/s] + obstacle_velocity_threshold_to_cruise : 3.5 # stop planning is executed to the obstacle whose velocity is less than this value [m/s] diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/docs/cruise_visualization.png b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/docs/cruise_visualization.png new file mode 100644 index 0000000000000000000000000000000000000000..acb094135e884286d9db99a65ea5aad6eadd3b92 GIT binary patch literal 77700 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 E2ZTm65C8xG literal 0 HcmV?d00001 diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/package.xml b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/package.xml new file mode 100644 index 0000000000000..e0cbf2c193b7a --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/package.xml @@ -0,0 +1,41 @@ + + + + autoware_motion_velocity_obstacle_cruise_module + 0.40.0 + obstacle cruise feature in motion_velocity_planner + + Takayuki Murooka + Yuki Takagi + Maxime Clement + + Apache License 2.0 + + ament_cmake_auto + autoware_cmake + autoware_motion_utils + autoware_motion_velocity_planner_common_universe + autoware_osqp_interface + autoware_perception_msgs + autoware_planning_msgs + autoware_route_handler + autoware_signal_processing + autoware_universe_utils + autoware_vehicle_info_utils + geometry_msgs + libboost-dev + pluginlib + rclcpp + tf2 + tier4_metric_msgs + tier4_planning_msgs + visualization_msgs + + ament_cmake_ros + ament_lint_auto + autoware_lint_common + + + ament_cmake + + diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/plugins.xml b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/plugins.xml new file mode 100644 index 0000000000000..d841b9beba5c9 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/plugins.xml @@ -0,0 +1,3 @@ + + + diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/cruise_planner_interface.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/cruise_planner_interface.hpp new file mode 100644 index 0000000000000..63f979813e78f --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/cruise_planner_interface.hpp @@ -0,0 +1,104 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRUISE_PLANNER_INTERFACE_HPP_ +#define CRUISE_PLANNER_INTERFACE_HPP_ + +#include "autoware/motion_velocity_planner_common_universe/planner_data.hpp" +#include "parameters.hpp" +#include "type_alias.hpp" +#include "types.hpp" + +#include + +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +class CruisePlannerInterface +{ +public: + CruisePlannerInterface( + rclcpp::Node & node, const CommonParam & common_param, + const CruisePlanningParam & cruise_planning_param) + { + clock_ = node.get_clock(); + logger_ = node.get_logger(); + common_param_ = common_param; + cruise_planning_param_ = cruise_planning_param; + } + + virtual ~CruisePlannerInterface() = default; + + virtual std::vector plan_cruise( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & obstacles, std::shared_ptr debug_data_ptr, + std::unique_ptr & + planning_factor_interface, + std::optional & velocity_limit) = 0; + + virtual void update_parameters(const std::vector & parameters) = 0; + + virtual Float32MultiArrayStamped get_cruise_planning_debug_message( + [[maybe_unused]] const rclcpp::Time & current_time) const + { + return Float32MultiArrayStamped{}; + } + +protected: + rclcpp::Clock::SharedPtr clock_{}; + rclcpp::Logger logger_{rclcpp::get_logger("")}; + CommonParam common_param_; + CruisePlanningParam cruise_planning_param_; + + static double calc_distance_to_collisionPoint( + const std::vector & traj_points, + const std::shared_ptr planner_data, + const geometry_msgs::msg::Point & collision_point) + { + const double offset = planner_data->is_driving_forward + ? std::abs(planner_data->vehicle_info_.max_longitudinal_offset_m) + : std::abs(planner_data->vehicle_info_.min_longitudinal_offset_m); + + const size_t ego_segment_idx = + planner_data->find_segment_index(traj_points, planner_data->current_odometry.pose.pose); + + const size_t collision_segment_idx = + autoware::motion_utils::findNearestSegmentIndex(traj_points, collision_point); + + const auto dist_to_collision_point = autoware::motion_utils::calcSignedArcLength( + traj_points, planner_data->current_odometry.pose.pose.position, ego_segment_idx, + collision_point, collision_segment_idx); + + return dist_to_collision_point - offset; + } + + double calc_rss_distance( + const double ego_vel, const double obstacle_vel, const double margin = 0.0) const + { + const double rss_dist_with_margin = + ego_vel * cruise_planning_param_.idling_time + + std::pow(ego_vel, 2) * 0.5 / std::abs(cruise_planning_param_.min_ego_accel_for_rss) - + std::pow(obstacle_vel, 2) * 0.5 / std::abs(cruise_planning_param_.min_object_accel_for_rss) + + margin; + return rss_dist_with_margin; + } +}; +} // namespace autoware::motion_velocity_planner + +#endif // CRUISE_PLANNER_INTERFACE_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/metrics_manager.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/metrics_manager.hpp new file mode 100644 index 0000000000000..11554121a0882 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/metrics_manager.hpp @@ -0,0 +1,60 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef METRICS_MANAGER_HPP_ +#define METRICS_MANAGER_HPP_ + +#include "type_alias.hpp" +#include "types.hpp" + +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +class MetricsManager +{ +public: + void init() { metrics_.clear(); } + + void calculate_metrics(const std::string & module_name, const std::string & reason) + { + // Create status + { + // Decision + Metric decision_metric; + decision_metric.name = module_name + "/decision"; + decision_metric.unit = "string"; + decision_metric.value = reason; + metrics_.push_back(decision_metric); + } + } + + MetricArray create_metric_array(const rclcpp::Time & current_time) + { + MetricArray metrics_msg; + metrics_msg.stamp = current_time; + metrics_msg.metric_array.insert( + metrics_msg.metric_array.end(), metrics_.begin(), metrics_.end()); + return metrics_msg; + } + +private: + std::vector metrics_; +}; + +} // namespace autoware::motion_velocity_planner + +#endif // METRICS_MANAGER_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/obstacle_cruise_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/obstacle_cruise_module.cpp new file mode 100644 index 0000000000000..c1d02842de1bb --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/obstacle_cruise_module.cpp @@ -0,0 +1,826 @@ +// Copyright 2025 TIER IV, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "obstacle_cruise_module.hpp" + +#include "autoware/universe_utils/ros/uuid_helper.hpp" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +namespace +{ +double calc_diff_angle_against_trajectory( + const std::vector & traj_points, const geometry_msgs::msg::Pose & target_pose) +{ + const size_t nearest_idx = + autoware::motion_utils::findNearestIndex(traj_points, target_pose.position); + const double traj_yaw = tf2::getYaw(traj_points.at(nearest_idx).pose.orientation); + + const double target_yaw = tf2::getYaw(target_pose.orientation); + + const double diff_yaw = autoware::universe_utils::normalizeRadian(target_yaw - traj_yaw); + return diff_yaw; +} + +std::vector resample_highest_confidence_predicted_paths( + const std::vector & predicted_paths, const double time_interval, + const double time_horizon, const size_t num_paths) +{ + std::vector sorted_paths = predicted_paths; + + // Sort paths by descending confidence + std::sort( + sorted_paths.begin(), sorted_paths.end(), + [](const PredictedPath & a, const PredictedPath & b) { return a.confidence > b.confidence; }); + + std::vector selected_paths; + size_t path_count = 0; + + // Select paths that meet the confidence thresholds + for (const auto & path : sorted_paths) { + if (path_count < num_paths) { + selected_paths.push_back(path); + ++path_count; + } + } + + // Resample each selected path + std::vector resampled_paths; + for (const auto & path : selected_paths) { + if (path.path.size() < 2) { + continue; + } + resampled_paths.push_back( + autoware::object_recognition_utils::resamplePredictedPath(path, time_interval, time_horizon)); + } + + return resampled_paths; +} + +VelocityLimitClearCommand create_velocity_limit_clear_command( + const rclcpp::Time & current_time, [[maybe_unused]] const std::string & module_name) +{ + VelocityLimitClearCommand msg; + msg.stamp = current_time; + msg.sender = "obstacle_cruise"; + msg.command = true; + return msg; +} + +Float64Stamped create_float64_stamped(const rclcpp::Time & now, const float & data) +{ + Float64Stamped msg; + msg.stamp = now; + msg.data = data; + return msg; +} +} // namespace + +void ObstacleCruiseModule::init(rclcpp::Node & node, const std::string & module_name) +{ + module_name_ = module_name; + clock_ = node.get_clock(); + logger_ = node.get_logger(); + + // ros parameters + planning_algorithm_ = + getOrDeclareParameter(node, "obstacle_cruise.option.planning_algorithm"); + common_param_ = CommonParam(node); + cruise_planning_param_ = CruisePlanningParam(node); + obstacle_filtering_param_ = ObstacleFilteringParam(node); + + // common publisher + processing_time_publisher_ = + node.create_publisher("~/debug/obstacle_cruise/processing_time_ms", 1); + virtual_wall_publisher_ = + node.create_publisher("~/obstacle_cruise/virtual_walls", 1); + debug_publisher_ = node.create_publisher("~/obstacle_cruise/debug_markers", 1); + + // module publisher + metrics_pub_ = node.create_publisher("~/cruise/metrics", 10); + debug_cruise_planning_info_pub_ = + node.create_publisher("~/debug/cruise_planning_info", 1); + processing_time_detail_pub_ = node.create_publisher( + "~/debug/processing_time_detail_ms/obstacle_cruise", 1); + + // interface + objects_of_interest_marker_interface_ = std::make_unique< + autoware::objects_of_interest_marker_interface::ObjectsOfInterestMarkerInterface>( + &node, "obstacle_cruise"); + planning_factor_interface_ = + std::make_unique( + &node, "obstacle_cruise"); + + // time keeper + time_keeper_ = std::make_shared(processing_time_detail_pub_); + + // cruise planner + cruise_planner_ = create_cruise_planner(node); +} + +void ObstacleCruiseModule::update_parameters(const std::vector & parameters) +{ + cruise_planner_->update_parameters(parameters); +} + +VelocityPlanningResult ObstacleCruiseModule::plan( + const std::vector & raw_trajectory_points, + [[maybe_unused]] const std::vector & + smoothed_trajectory_points, + const std::shared_ptr planner_data) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + // 1. init variables + stop_watch_.tic(); + debug_data_ptr_ = std::make_shared(); + metrics_manager_.init(); + + // filter obstacles of predicted objects + const auto cruise_obstacles = filter_cruise_obstacle_for_predicted_object( + planner_data->current_odometry, planner_data->ego_nearest_dist_threshold, + planner_data->ego_nearest_yaw_threshold, raw_trajectory_points, planner_data->objects, + rclcpp::Time(planner_data->predicted_objects_header.stamp), planner_data->is_driving_forward, + planner_data->vehicle_info_, planner_data->trajectory_polygon_collision_check); + + // plan cruise + VelocityPlanningResult result; + [[maybe_unused]] const auto cruise_traj_points = cruise_planner_->plan_cruise( + planner_data, raw_trajectory_points, cruise_obstacles, debug_data_ptr_, + planning_factor_interface_, result.velocity_limit); + metrics_manager_.calculate_metrics("PlannerInterface", "cruise"); + + // clear velocity limit if necessary + if (result.velocity_limit) { + need_to_clear_velocity_limit_ = true; + } else { + if (need_to_clear_velocity_limit_) { + // clear velocity limit + result.velocity_limit_clear_command = + create_velocity_limit_clear_command(clock_->now(), module_name_); + need_to_clear_velocity_limit_ = false; + } + } + + publish_debug_info(); + + return result; +} + +std::string ObstacleCruiseModule::get_module_name() const +{ + return module_name_; +} + +std::unique_ptr ObstacleCruiseModule::create_cruise_planner( + rclcpp::Node & node) const +{ + if (planning_algorithm_ == "pid_base") { + return std::make_unique(node, common_param_, cruise_planning_param_); + } else if (planning_algorithm_ == "optimization_base") { + return std::make_unique(node, common_param_, cruise_planning_param_); + } + throw std::logic_error("Designated algorithm is not supported."); +} + +std::vector ObstacleCruiseModule::filter_cruise_obstacle_for_predicted_object( + const Odometry & odometry, const double ego_nearest_dist_threshold, + const double ego_nearest_yaw_threshold, const std::vector & traj_points, + const std::vector> & objects, + const rclcpp::Time & predicted_objects_stamp, const bool is_driving_forward, + const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + const auto & current_pose = odometry.pose.pose; + + const auto & p = trajectory_polygon_collision_check; + const auto decimated_traj_points = utils::decimate_trajectory_points_from_ego( + traj_points, current_pose, ego_nearest_dist_threshold, ego_nearest_yaw_threshold, + p.decimate_trajectory_step_length, 0.0); + const auto decimated_traj_polys = polygon_utils::create_one_step_polygons( + decimated_traj_points, vehicle_info, current_pose, 0.0, p.enable_to_consider_current_pose, + p.time_to_convergence, p.decimate_trajectory_step_length); + debug_data_ptr_->decimated_traj_polys = decimated_traj_polys; + + // cruise + std::vector cruise_obstacles; + for (const auto & object : objects) { + // 1. rough filtering + // 1.1. Check if the obstacle is in front of the ego. + const double lon_dist_from_ego_to_obj = + object->get_dist_from_ego_longitudinal(traj_points, current_pose.position); + if (lon_dist_from_ego_to_obj < 0.0) { + continue; + } + + // 1.2. Check if the rough lateral distance is smaller than the threshold. + const double min_lat_dist_to_traj_poly = + utils::calc_possible_min_dist_from_obj_to_traj_poly(object, traj_points, vehicle_info); + if (obstacle_filtering_param_.max_lat_margin < min_lat_dist_to_traj_poly) { + continue; + } + + // 2. precise filtering for cruise + const auto cruise_obstacle = create_cruise_obstacle( + odometry, traj_points, decimated_traj_points, decimated_traj_polys, object, + predicted_objects_stamp, object->get_dist_to_traj_poly(decimated_traj_polys), + is_driving_forward, vehicle_info, trajectory_polygon_collision_check); + if (cruise_obstacle) { + cruise_obstacles.push_back(*cruise_obstacle); + continue; + } + + // 3. precise filtering for yield cruise + if (obstacle_filtering_param_.enable_yield) { + const auto yield_obstacles = find_yield_cruise_obstacles( + odometry, objects, predicted_objects_stamp, traj_points, vehicle_info); + if (yield_obstacles) { + for (const auto & y : yield_obstacles.value()) { + // Check if there is no member with the same UUID in cruise_obstacles + auto it = std::find_if( + cruise_obstacles.begin(), cruise_obstacles.end(), + [&y](const auto & c) { return y.uuid == c.uuid; }); + + // If no matching UUID found, insert yield obstacle into cruise_obstacles + if (it == cruise_obstacles.end()) { + cruise_obstacles.push_back(y); + } + } + } + } + } + prev_cruise_object_obstacles_ = cruise_obstacles; + + return cruise_obstacles; +} + +void ObstacleCruiseModule::publish_debug_info() +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + // 1. debug marker + MarkerArray debug_marker; + + // 1.1. obstacles + std::vector stop_collision_points; + for (size_t i = 0; i < debug_data_ptr_->obstacles_to_cruise.size(); ++i) { + // obstacle + const auto obstacle_marker = utils::get_object_marker( + debug_data_ptr_->obstacles_to_cruise.at(i).pose, i, "obstacles", 1.0, 0.6, 0.1); + debug_marker.markers.push_back(obstacle_marker); + + // collision points + for (size_t j = 0; j < debug_data_ptr_->obstacles_to_cruise.at(i).collision_points.size(); + ++j) { + stop_collision_points.push_back( + debug_data_ptr_->obstacles_to_cruise.at(i).collision_points.at(j).point); + } + } + + // 1.2. collision points + for (size_t i = 0; i < stop_collision_points.size(); ++i) { + auto collision_point_marker = autoware::universe_utils::createDefaultMarker( + "map", clock_->now(), "collision_points", i, Marker::SPHERE, + autoware::universe_utils::createMarkerScale(0.25, 0.25, 0.25), + autoware::universe_utils::createMarkerColor(1.0, 0.0, 0.0, 0.999)); + collision_point_marker.pose.position = stop_collision_points.at(i); + debug_marker.markers.push_back(collision_point_marker); + } + + // 1.3. intentionally ignored obstacles + for (size_t i = 0; i < debug_data_ptr_->intentionally_ignored_obstacles.size(); ++i) { + const auto marker = utils::get_object_marker( + debug_data_ptr_->intentionally_ignored_obstacles.at(i) + ->predicted_object.kinematics.initial_pose_with_covariance.pose, + i, "intentionally_ignored_obstacles", 0.0, 1.0, 0.0); + debug_marker.markers.push_back(marker); + } + + // 1.4. detection area + auto decimated_traj_polys_marker = autoware::universe_utils::createDefaultMarker( + "map", clock_->now(), "detection_area", 0, Marker::LINE_LIST, + autoware::universe_utils::createMarkerScale(0.01, 0.0, 0.0), + autoware::universe_utils::createMarkerColor(0.0, 1.0, 0.0, 0.999)); + for (const auto & decimated_traj_poly : debug_data_ptr_->decimated_traj_polys) { + for (size_t dp_idx = 0; dp_idx < decimated_traj_poly.outer().size(); ++dp_idx) { + const auto & current_point = decimated_traj_poly.outer().at(dp_idx); + const auto & next_point = + decimated_traj_poly.outer().at((dp_idx + 1) % decimated_traj_poly.outer().size()); + + decimated_traj_polys_marker.points.push_back( + autoware::universe_utils::createPoint(current_point.x(), current_point.y(), 0.0)); + decimated_traj_polys_marker.points.push_back( + autoware::universe_utils::createPoint(next_point.x(), next_point.y(), 0.0)); + } + } + debug_marker.markers.push_back(decimated_traj_polys_marker); + + debug_publisher_->publish(debug_marker); + + // 2. virtual wall + virtual_wall_publisher_->publish(debug_data_ptr_->cruise_wall_marker); + + // 3. cruise planning info + const auto cruise_debug_msg = cruise_planner_->get_cruise_planning_debug_message(clock_->now()); + debug_cruise_planning_info_pub_->publish(cruise_debug_msg); + + // 4. objects of interest + objects_of_interest_marker_interface_->publishMarkerArray(); + + // 5. metrics + const auto metrics_msg = metrics_manager_.create_metric_array(clock_->now()); + metrics_pub_->publish(metrics_msg); + + // 6. processing time + processing_time_publisher_->publish(create_float64_stamped(clock_->now(), stop_watch_.toc())); + + // 7. planning factor + planning_factor_interface_->publish(); +} + +std::optional ObstacleCruiseModule::create_cruise_obstacle( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector & decimated_traj_polys, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const double dist_from_obj_poly_to_traj_poly, const bool is_driving_forward, + const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const +{ + const auto & obj_uuid = object->predicted_object.object_id; + const auto & obj_uuid_str = autoware::universe_utils::toHexString(obj_uuid); + + // NOTE: When driving backward, Stop will be planned instead of cruise. + // When the obstacle is crossing the ego's trajectory, cruise can be ignored. + if ( + !is_cruise_obstacle(object->predicted_object.classification.at(0).label) || + !is_driving_forward) { + return std::nullopt; + } + + if (object->get_lon_vel_relative_to_traj(traj_points) < 0.0) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore obstacle (%s) since it's driving in opposite direction.", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + if (obstacle_filtering_param_.max_lat_margin < dist_from_obj_poly_to_traj_poly) { + const auto time_to_traj = dist_from_obj_poly_to_traj_poly / + std::max(1e-6, object->get_lat_vel_relative_to_traj(traj_points)); + if (time_to_traj > obstacle_filtering_param_.max_lateral_time_margin) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore obstacle (%s) since it's far from trajectory.", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + } + + if (is_obstacle_crossing(traj_points, object)) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore obstacle (%s) since it's crossing the ego's trajectory..", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + const auto collision_points = [&]() -> std::optional> { + constexpr double epsilon = 1e-6; + if (dist_from_obj_poly_to_traj_poly < epsilon) { + // obstacle is inside the trajectory + return create_collision_points_for_inside_cruise_obstacle( + traj_points, decimated_traj_points, decimated_traj_polys, object, predicted_objects_stamp, + is_driving_forward, vehicle_info, trajectory_polygon_collision_check); + } + // obstacle is outside the trajectory + // If the ego is stopping, do not plan cruise for outside obstacles. Stop will be planned. + if (odometry.twist.twist.linear.x < 0.1) { + return std::nullopt; + } + return create_collision_points_for_outside_cruise_obstacle( + traj_points, decimated_traj_points, decimated_traj_polys, object, predicted_objects_stamp, + is_driving_forward, vehicle_info, trajectory_polygon_collision_check); + }(); + if (!collision_points) { + return std::nullopt; + } + + return CruiseObstacle{ + obj_uuid_str, + predicted_objects_stamp, + object->get_predicted_pose(clock_->now(), predicted_objects_stamp), + object->get_lon_vel_relative_to_traj(traj_points), + object->get_lat_vel_relative_to_traj(traj_points), + *collision_points}; +} + +std::optional> ObstacleCruiseModule::find_yield_cruise_obstacles( + const Odometry & odometry, const std::vector> & objects, + const rclcpp::Time & predicted_objects_stamp, const std::vector & traj_points, + const VehicleInfo & vehicle_info) +{ + const auto & current_pose = odometry.pose.pose; + + if (objects.empty() || traj_points.empty()) return std::nullopt; + + std::vector> stopped_objects; + std::vector> moving_objects; + + std::for_each(objects.begin(), objects.end(), [&](const auto & o) { + const bool is_moving = + std::hypot( + o->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x, + o->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.y) > + obstacle_filtering_param_.stopped_obstacle_velocity_threshold; + if (is_moving) { + const bool is_within_lat_dist_threshold = + o->get_dist_to_traj_lateral(traj_points) < + obstacle_filtering_param_.yield_lat_distance_threshold; + if (is_within_lat_dist_threshold) moving_objects.push_back(o); + return; + } + // lat threshold is larger for stopped obstacles + const bool is_within_lat_dist_threshold = + o->get_dist_to_traj_lateral(traj_points) < + obstacle_filtering_param_.yield_lat_distance_threshold + + obstacle_filtering_param_.max_lat_dist_between_obstacles; + if (is_within_lat_dist_threshold) stopped_objects.push_back(o); + return; + }); + + if (stopped_objects.empty() || moving_objects.empty()) return std::nullopt; + + std::sort(stopped_objects.begin(), stopped_objects.end(), [&](const auto & o1, const auto & o2) { + return o1->get_dist_from_ego_longitudinal(traj_points, current_pose.position) < + o2->get_dist_from_ego_longitudinal(traj_points, current_pose.position); + }); + + std::sort(moving_objects.begin(), moving_objects.end(), [&](const auto & o1, const auto & o2) { + return o1->get_dist_from_ego_longitudinal(traj_points, current_pose.position) < + o2->get_dist_from_ego_longitudinal(traj_points, current_pose.position); + }); + + std::vector yield_obstacles; + for (const auto & moving_object : moving_objects) { + for (const auto & stopped_object : stopped_objects) { + const bool is_moving_obs_behind_of_stopped_obs = + moving_object->get_dist_from_ego_longitudinal(traj_points, current_pose.position) < + stopped_object->get_dist_from_ego_longitudinal(traj_points, current_pose.position); + const bool is_moving_obs_ahead_of_ego_front = + moving_object->get_dist_from_ego_longitudinal(traj_points, current_pose.position) > + vehicle_info.vehicle_length_m; + + if (!is_moving_obs_ahead_of_ego_front || !is_moving_obs_behind_of_stopped_obs) continue; + + const double lateral_distance_between_obstacles = std::abs( + moving_object->get_dist_to_traj_lateral(traj_points) - + stopped_object->get_dist_to_traj_lateral(traj_points)); + + const double longitudinal_distance_between_obstacles = std::abs( + moving_object->get_dist_from_ego_longitudinal(traj_points, current_pose.position) - + stopped_object->get_dist_from_ego_longitudinal(traj_points, current_pose.position)); + + const double moving_object_speed = std::hypot( + moving_object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x, + moving_object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.y); + + const bool are_obstacles_aligned = lateral_distance_between_obstacles < + obstacle_filtering_param_.max_lat_dist_between_obstacles; + const bool obstacles_collide_within_threshold_time = + longitudinal_distance_between_obstacles / moving_object_speed < + obstacle_filtering_param_.max_obstacles_collision_time; + if (are_obstacles_aligned && obstacles_collide_within_threshold_time) { + const auto yield_obstacle = + create_yield_cruise_obstacle(moving_object, predicted_objects_stamp, traj_points); + if (yield_obstacle) { + yield_obstacles.push_back(*yield_obstacle); + using autoware::objects_of_interest_marker_interface::ColorName; + objects_of_interest_marker_interface_->insertObjectData( + stopped_object->predicted_object.kinematics.initial_pose_with_covariance.pose, + stopped_object->predicted_object.shape, ColorName::RED); + } + } + } + } + if (yield_obstacles.empty()) return std::nullopt; + return yield_obstacles; +} + +std::optional> +ObstacleCruiseModule::create_collision_points_for_inside_cruise_obstacle( + const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector & decimated_traj_polys, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const bool is_driving_forward, const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const +{ + const auto & obj_uuid = object->predicted_object.object_id; + const auto & obj_uuid_str = autoware::universe_utils::toHexString(obj_uuid); + + // check label + if (!is_inside_cruise_obstacle(object->predicted_object.classification.at(0).label)) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore inside obstacle (%s) since its type is not designated.", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + { // consider hysteresis + // const bool is_prev_obstacle_stop = get_obstacle_from_uuid(prev_stop_obstacles_, + // obstacle.uuid).has_value(); + const bool is_prev_obstacle_cruise = + utils::get_obstacle_from_uuid(prev_cruise_object_obstacles_, obj_uuid_str).has_value(); + + if (is_prev_obstacle_cruise) { + if ( + object->get_lon_vel_relative_to_traj(traj_points) < + obstacle_filtering_param_.obstacle_velocity_threshold_from_cruise) { + return std::nullopt; + } + // NOTE: else is keeping cruise + } else { + // If previous obstacle is stop or does not exist. + if ( + object->get_lon_vel_relative_to_traj(traj_points) < + obstacle_filtering_param_.obstacle_velocity_threshold_to_cruise) { + return std::nullopt; + } + // NOTE: else is cruise from stop + } + } + + // Get highest confidence predicted path + constexpr double prediction_resampling_time_interval = 0.1; + constexpr double prediction_resampling_time_horizon = 10.0; + std::vector predicted_paths; + for (const auto & path : object->predicted_object.kinematics.predicted_paths) { + predicted_paths.push_back(path); + } + const auto resampled_predicted_paths = resample_highest_confidence_predicted_paths( + predicted_paths, prediction_resampling_time_interval, prediction_resampling_time_horizon, 1); + + if (resampled_predicted_paths.empty()) { + return std::nullopt; + } + + // calculate nearest collision point + std::vector collision_index; + const auto collision_points = polygon_utils::get_collision_points( + decimated_traj_points, decimated_traj_polys, predicted_objects_stamp, + resampled_predicted_paths.front(), object->predicted_object.shape, clock_->now(), + is_driving_forward, collision_index, + utils::calc_object_possible_max_dist_from_center(object->predicted_object.shape) + + trajectory_polygon_collision_check.decimate_trajectory_step_length + + std::hypot( + vehicle_info.vehicle_length_m, + vehicle_info.vehicle_width_m * 0.5 + obstacle_filtering_param_.max_lat_margin)); + return collision_points; +} + +std::optional> +ObstacleCruiseModule::create_collision_points_for_outside_cruise_obstacle( + const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector & decimated_traj_polys, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const bool is_driving_forward, const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const +{ + const auto & obj_uuid = object->predicted_object.object_id; + const auto & obj_uuid_str = autoware::universe_utils::toHexString(obj_uuid); + + // check label + if (!is_outside_cruise_obstacle(object->predicted_object.classification.at(0).label)) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore outside obstacle (%s) since its type is not designated.", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + if ( + std::hypot( + object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x, + object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.y) < + obstacle_filtering_param_.outside_obstacle_velocity_threshold) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore outside obstacle (%s) since the obstacle velocity is low.", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + // Get the highest confidence predicted paths + constexpr double prediction_resampling_time_interval = 0.1; + constexpr double prediction_resampling_time_horizon = 10.0; + std::vector predicted_paths; + for (const auto & path : object->predicted_object.kinematics.predicted_paths) { + predicted_paths.push_back(path); + } + + const auto resampled_predicted_paths = resample_highest_confidence_predicted_paths( + predicted_paths, prediction_resampling_time_interval, prediction_resampling_time_horizon, + obstacle_filtering_param_.num_of_predicted_paths_for_outside_cruise_obstacle); + + // calculate collision condition for cruise + std::vector collision_index; + const auto get_collision_points = [&]() -> std::vector { + for (const auto & predicted_path : resampled_predicted_paths) { + const auto collision_points = polygon_utils::get_collision_points( + decimated_traj_points, decimated_traj_polys, predicted_objects_stamp, predicted_path, + object->predicted_object.shape, clock_->now(), is_driving_forward, collision_index, + utils::calc_object_possible_max_dist_from_center(object->predicted_object.shape) + + trajectory_polygon_collision_check.decimate_trajectory_step_length + + std::hypot( + vehicle_info.vehicle_length_m, + vehicle_info.vehicle_width_m * 0.5 + obstacle_filtering_param_.max_lat_margin), + obstacle_filtering_param_.max_prediction_time_for_collision_check); + if (!collision_points.empty()) { + return collision_points; + } + } + return {}; + }; + + const auto collision_points = get_collision_points(); + + if (collision_points.empty()) { + // Ignore vehicle obstacles outside the trajectory without collision + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore outside obstacle (%s) since there are no collision points.", + obj_uuid_str.substr(0, 4).c_str()); + debug_data_ptr_->intentionally_ignored_obstacles.push_back(object); + return std::nullopt; + } + + const double overlap_time = + (rclcpp::Time(collision_points.back().stamp) - rclcpp::Time(collision_points.front().stamp)) + .seconds(); + if (overlap_time < obstacle_filtering_param_.ego_obstacle_overlap_time_threshold) { + // Ignore vehicle obstacles outside the trajectory, whose predicted path + // overlaps the ego trajectory in a certain time. + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore outside obstacle (%s) since it will not collide with the ego.", + obj_uuid_str.substr(0, 4).c_str()); + debug_data_ptr_->intentionally_ignored_obstacles.push_back(object); + return std::nullopt; + } + + // Ignore obstacles behind the ego vehicle. + // Note: Only using isFrontObstacle(), behind obstacles cannot be filtered + // properly when the trajectory is crossing or overlapping. + const size_t first_collision_index = collision_index.front(); + if (!is_front_collide_obstacle(traj_points, object, first_collision_index)) { + return std::nullopt; + } + return collision_points; +} + +std::optional ObstacleCruiseModule::create_yield_cruise_obstacle( + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const std::vector & traj_points) +{ + if (traj_points.empty()) return std::nullopt; + // check label + + const auto & obj_uuid = object->predicted_object.object_id; + const auto & obj_uuid_str = autoware::universe_utils::toHexString(obj_uuid); + + if (!is_outside_cruise_obstacle(object->predicted_object.classification.at(0).label)) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore yield obstacle (%s) since its type is not designated.", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + if ( + std::hypot( + object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x, + object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.y) < + obstacle_filtering_param_.outside_obstacle_velocity_threshold) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore yield obstacle (%s) since the obstacle velocity is low.", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + if (is_obstacle_crossing(traj_points, object)) { + RCLCPP_DEBUG( + logger_, "[Cruise] Ignore yield obstacle (%s) since it's crossing the ego's trajectory..", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + const auto collision_points = [&]() -> std::optional> { + const auto obstacle_idx = autoware::motion_utils::findNearestIndex( + traj_points, object->predicted_object.kinematics.initial_pose_with_covariance.pose); + if (!obstacle_idx) return std::nullopt; + const auto collision_traj_point = traj_points.at(obstacle_idx.value()); + const auto object_time = clock_->now() + traj_points.at(obstacle_idx.value()).time_from_start; + + polygon_utils::PointWithStamp collision_traj_point_with_stamp; + collision_traj_point_with_stamp.stamp = object_time; + collision_traj_point_with_stamp.point.x = collision_traj_point.pose.position.x; + collision_traj_point_with_stamp.point.y = collision_traj_point.pose.position.y; + collision_traj_point_with_stamp.point.z = collision_traj_point.pose.position.z; + std::vector collision_points_vector{ + collision_traj_point_with_stamp}; + return collision_points_vector; + }(); + + if (!collision_points) return std::nullopt; + // check if obstacle is driving on the opposite direction + if (object->get_lon_vel_relative_to_traj(traj_points) < 0.0) return std::nullopt; + return CruiseObstacle{ + obj_uuid_str, + predicted_objects_stamp, + object->get_predicted_pose(clock_->now(), predicted_objects_stamp), + object->get_lon_vel_relative_to_traj(traj_points), + object->get_lat_vel_relative_to_traj(traj_points), + collision_points.value(), + true}; +} + +bool ObstacleCruiseModule::is_inside_cruise_obstacle(const uint8_t label) const +{ + const auto & types = obstacle_filtering_param_.inside_object_types; + return std::find(types.begin(), types.end(), label) != types.end(); +} + +bool ObstacleCruiseModule::is_outside_cruise_obstacle(const uint8_t label) const +{ + const auto & types = obstacle_filtering_param_.outside_object_types; + return std::find(types.begin(), types.end(), label) != types.end(); +} + +bool ObstacleCruiseModule::is_cruise_obstacle(const uint8_t label) const +{ + return is_inside_cruise_obstacle(label) || is_outside_cruise_obstacle(label); +} + +bool ObstacleCruiseModule::is_front_collide_obstacle( + const std::vector & traj_points, + const std::shared_ptr object, const size_t first_collision_idx) const +{ + const auto obstacle_idx = autoware::motion_utils::findNearestIndex( + traj_points, object->predicted_object.kinematics.initial_pose_with_covariance.pose.position); + + const double obstacle_to_col_points_distance = + autoware::motion_utils::calcSignedArcLength(traj_points, obstacle_idx, first_collision_idx); + const double object_possible_max_dist_from_center = + utils::calc_object_possible_max_dist_from_center(object->predicted_object.shape); + + // If the obstacle is far in front of the collision point, the obstacle is behind the ego. + return obstacle_to_col_points_distance > -object_possible_max_dist_from_center; +} + +bool ObstacleCruiseModule::is_obstacle_crossing( + const std::vector & traj_points, + const std::shared_ptr object) const +{ + const double diff_angle = calc_diff_angle_against_trajectory( + traj_points, object->predicted_object.kinematics.initial_pose_with_covariance.pose); + + // NOTE: Currently predicted objects does not have orientation availability even + // though sometimes orientation is not available. + const bool is_obstacle_crossing_trajectory = + obstacle_filtering_param_.crossing_obstacle_traj_angle_threshold < std::abs(diff_angle) && + obstacle_filtering_param_.crossing_obstacle_traj_angle_threshold < M_PI - std::abs(diff_angle); + if (!is_obstacle_crossing_trajectory) { + return false; + } + + // Only obstacles crossing the ego's trajectory with high speed are considered. + return true; +} +} // namespace autoware::motion_velocity_planner + +#include +PLUGINLIB_EXPORT_CLASS( + autoware::motion_velocity_planner::ObstacleCruiseModule, + autoware::motion_velocity_planner::PluginModuleInterface) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/obstacle_cruise_module.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/obstacle_cruise_module.hpp new file mode 100644 index 0000000000000..d9e65c2a3b7db --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/obstacle_cruise_module.hpp @@ -0,0 +1,137 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef OBSTACLE_CRUISE_MODULE_HPP_ +#define OBSTACLE_CRUISE_MODULE_HPP_ + +#include "autoware/motion_velocity_planner_common_universe/polygon_utils.hpp" +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" +#include "autoware/universe_utils/system/stop_watch.hpp" +#include "autoware/universe_utils/system/time_keeper.hpp" +#include "cruise_planner_interface.hpp" +#include "metrics_manager.hpp" +#include "optimization_based_planner/optimization_based_planner.hpp" +#include "parameters.hpp" +#include "pid_based_planner/pid_based_planner.hpp" +#include "type_alias.hpp" +#include "types.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +class ObstacleCruiseModule : public PluginModuleInterface +{ +public: + void init(rclcpp::Node & node, const std::string & module_name) override; + void update_parameters(const std::vector & parameters) override; + VelocityPlanningResult plan( + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, + const std::shared_ptr planner_data) override; + std::string get_module_name() const override; + +private: + std::string module_name_; + rclcpp::Clock::SharedPtr clock_{}; + + // ros parameters + std::string planning_algorithm_; + CommonParam common_param_; + CruisePlanningParam cruise_planning_param_; + ObstacleFilteringParam obstacle_filtering_param_; + + // common publisher + rclcpp::Publisher::SharedPtr debug_cruise_planning_info_pub_; + + // module publisher + rclcpp::Publisher::SharedPtr metrics_pub_; + std::unique_ptr + objects_of_interest_marker_interface_; + rclcpp::Publisher::SharedPtr + processing_time_detail_pub_; + + // cruise planner + std::unique_ptr cruise_planner_; + + // internal variables + autoware::universe_utils::StopWatch stop_watch_; + std::vector prev_cruise_object_obstacles_; + mutable std::shared_ptr debug_data_ptr_; + bool need_to_clear_velocity_limit_{false}; + MetricsManager metrics_manager_; + mutable std::shared_ptr time_keeper_; + + std::unique_ptr create_cruise_planner(rclcpp::Node & node) const; + std::vector filter_cruise_obstacle_for_predicted_object( + const Odometry & odometry, const double ego_nearest_dist_threshold, + const double ego_nearest_yaw_threshold, const std::vector & traj_points, + const std::vector> & objects, + const rclcpp::Time & predicted_objects_stamp, const bool is_driving_forward, + const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check); + void publish_debug_info(); + std::optional create_cruise_obstacle( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector & decimated_traj_polys, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const double dist_from_obj_poly_to_traj_poly, const bool is_driving_forward, + const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const; + std::optional> find_yield_cruise_obstacles( + const Odometry & odometry, const std::vector> & objects, + const rclcpp::Time & predicted_objects_stamp, const std::vector & traj_points, + const VehicleInfo & vehicle_info); + std::optional> + create_collision_points_for_inside_cruise_obstacle( + const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector & decimated_traj_polys, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const bool is_driving_forward, const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const; + std::optional> + create_collision_points_for_outside_cruise_obstacle( + const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector & decimated_traj_polys, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const bool is_driving_forward, const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const; + std::optional create_yield_cruise_obstacle( + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const std::vector & traj_points); + bool is_inside_cruise_obstacle(const uint8_t label) const; + bool is_outside_cruise_obstacle(const uint8_t label) const; + bool is_cruise_obstacle(const uint8_t label) const; + bool is_front_collide_obstacle( + const std::vector & traj_points, + const std::shared_ptr object, const size_t first_collision_idx) const; + bool is_obstacle_crossing( + const std::vector & traj_points, + const std::shared_ptr object) const; +}; +} // namespace autoware::motion_velocity_planner + +#endif // OBSTACLE_CRUISE_MODULE_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/optimization_based_planner.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/optimization_based_planner.cpp new file mode 100644 index 0000000000000..c2489bbf3039f --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/optimization_based_planner.cpp @@ -0,0 +1,754 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "optimization_based_planner.hpp" + +#include "autoware/interpolation/linear_interpolation.hpp" +#include "autoware/interpolation/spline_interpolation.hpp" +#include "autoware/interpolation/zero_order_hold.hpp" +#include "autoware/motion_utils/marker/marker_helper.hpp" +#include "autoware/motion_utils/resample/resample.hpp" +#include "autoware/motion_utils/trajectory/conversion.hpp" +#include "autoware/motion_utils/trajectory/interpolation.hpp" +#include "autoware/motion_utils/trajectory/trajectory.hpp" +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" +#include "autoware/universe_utils/geometry/geometry.hpp" +#include "autoware/universe_utils/ros/marker_helper.hpp" + +#include +#include +#include +#include +#include + +#ifdef ROS_DISTRO_GALACTIC +#include +#else +#include +#endif + +#include + +namespace autoware::motion_velocity_planner +{ +constexpr double ZERO_VEL_THRESHOLD = 0.01; +constexpr double CLOSE_S_DIST_THRESHOLD = 1e-3; + +OptimizationBasedPlanner::OptimizationBasedPlanner( + rclcpp::Node & node, const CommonParam & common_param, + const CruisePlanningParam & cruise_planning_param) +: CruisePlannerInterface(node, common_param, cruise_planning_param) +{ + smoothed_traj_sub_ = node.create_subscription( + "/planning/scenario_planning/trajectory", rclcpp::QoS{1}, + [this](const Trajectory::ConstSharedPtr msg) { smoothed_trajectory_ptr_ = msg; }); + + // parameter + dense_resampling_time_interval_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.dense_resampling_time_interval"); + sparse_resampling_time_interval_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.sparse_resampling_time_interval"); + dense_time_horizon_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.dense_time_horizon"); + max_time_horizon_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.max_time_horizon"); + + t_dangerous_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.t_dangerous"); + velocity_margin_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.velocity_margin"); + + replan_vel_deviation_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.replan_vel_deviation"); + engage_velocity_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.engage_velocity"); + engage_acceleration_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.engage_acceleration"); + engage_exit_ratio_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.engage_exit_ratio"); + stop_dist_to_prohibit_engage_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.stop_dist_to_prohibit_engage"); + + const double max_s_weight = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.max_s_weight"); + const double max_v_weight = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.max_v_weight"); + const double over_s_safety_weight = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.over_s_safety_weight"); + const double over_s_ideal_weight = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.over_s_ideal_weight"); + const double over_v_weight = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.over_v_weight"); + const double over_a_weight = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.over_a_weight"); + const double over_j_weight = node.declare_parameter( + "obstacle_cruise.cruise_planning.optimization_based_planner.over_j_weight"); + + // velocity optimizer + velocity_optimizer_ptr_ = std::make_shared( + max_s_weight, max_v_weight, over_s_safety_weight, over_s_ideal_weight, over_v_weight, + over_a_weight, over_j_weight); + + // publisher + optimized_sv_pub_ = node.create_publisher("~/optimized_sv_trajectory", 1); + optimized_st_graph_pub_ = node.create_publisher("~/optimized_st_graph", 1); + boundary_pub_ = node.create_publisher("~/boundary", 1); + debug_wall_marker_pub_ = node.create_publisher("~/debug/wall_marker", 1); +} + +std::vector OptimizationBasedPlanner::plan_cruise( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & obstacles, + [[maybe_unused]] std::shared_ptr debug_data_ptr, + [[maybe_unused]] std::unique_ptr & + planning_factor_interface, + [[maybe_unused]] std::optional & velocity_limit) +{ + // Create Time Vector defined by resampling time interval + const std::vector time_vec = createTimeVector(); + if (time_vec.size() < 2) { + RCLCPP_ERROR( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "Resolution size is not enough"); + prev_output_ = stop_traj_points; + return stop_traj_points; + } + + // Get the nearest point on the trajectory + const size_t closest_idx = + planner_data->find_segment_index(stop_traj_points, planner_data->current_odometry.pose.pose); + + // Compute maximum velocity + double v_max = 0.0; + for (const auto & point : stop_traj_points) { + v_max = std::max(v_max, static_cast(point.longitudinal_velocity_mps)); + } + + // Get Current Velocity + double v0; + double a0; + std::tie(v0, a0) = calcInitialMotion(planner_data, stop_traj_points, prev_output_); + a0 = std::min(common_param_.max_accel, std::max(a0, common_param_.min_accel)); + + // Check trajectory size + if (stop_traj_points.size() - closest_idx <= 2) { + RCLCPP_DEBUG( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "The number of points on the trajectory is too small or failed to calculate front offset"); + prev_output_ = stop_traj_points; + return stop_traj_points; + } + + // Check if reached goal + if (checkHasReachedGoal(planner_data, stop_traj_points)) { + prev_output_ = stop_traj_points; + return stop_traj_points; + } + + // Get S Boundaries from the obstacle + const auto s_boundaries = getSBoundaries(planner_data, stop_traj_points, obstacles, time_vec); + if (!s_boundaries) { + prev_output_ = stop_traj_points; + return stop_traj_points; + } + + // Optimization + VelocityOptimizer::OptimizationData data; + data.time_vec = time_vec; + data.s0 = 0.0; + data.a0 = a0; + data.v_max = v_max; + data.a_max = common_param_.max_accel; + data.a_min = common_param_.min_accel; + data.j_max = common_param_.max_jerk; + data.j_min = common_param_.min_jerk; + data.limit_a_max = common_param_.limit_max_accel; + data.limit_a_min = common_param_.limit_min_accel; + data.limit_j_max = common_param_.limit_max_jerk; + data.limit_j_min = common_param_.limit_min_jerk; + data.t_dangerous = t_dangerous_; + data.idling_time = cruise_planning_param_.idling_time; + data.s_boundary = *s_boundaries; + data.v0 = v0; + RCLCPP_DEBUG(rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), "v0 %f", v0); + + const auto optimized_result = velocity_optimizer_ptr_->optimize(data); + + // Publish Debug trajectories + const double traj_front_to_vehicle_offset = + autoware::motion_utils::calcSignedArcLength(stop_traj_points, 0, closest_idx); + publishDebugTrajectory( + planner_data, traj_front_to_vehicle_offset, time_vec, *s_boundaries, optimized_result); + + // Transformation from t to s + const auto processed_result = + processOptimizedResult(data.v0, optimized_result, traj_front_to_vehicle_offset); + if (!processed_result) { + RCLCPP_DEBUG( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "Processed Result is empty"); + prev_output_ = stop_traj_points; + return stop_traj_points; + } + const auto & opt_position = processed_result->s; + const auto & opt_velocity = processed_result->v; + + // Check Size + if (opt_position.size() == 1 && opt_velocity.front() < ZERO_VEL_THRESHOLD) { + auto output = stop_traj_points; + output.at(closest_idx).longitudinal_velocity_mps = data.v0; + for (size_t i = closest_idx + 1; i < output.size(); ++i) { + output.at(i).longitudinal_velocity_mps = 0.0; + } + prev_output_ = output; + return output; + } else if (opt_position.size() == 1) { + RCLCPP_DEBUG( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "Optimized Trajectory is too small"); + prev_output_ = stop_traj_points; + return stop_traj_points; + } + + // Get Zero Velocity Position + double closest_stop_dist = std::numeric_limits::max(); + for (size_t i = 0; i < opt_velocity.size(); ++i) { + if (opt_velocity.at(i) < ZERO_VEL_THRESHOLD) { + closest_stop_dist = std::min(closest_stop_dist, opt_position.at(i)); + break; + } + } + const auto traj_stop_dist = + autoware::motion_utils::calcDistanceToForwardStopPoint(stop_traj_points, closest_idx); + if (traj_stop_dist) { + closest_stop_dist = std::min(*traj_stop_dist + traj_front_to_vehicle_offset, closest_stop_dist); + } + + // Resample Optimum Velocity + size_t break_id = stop_traj_points.size(); + std::vector resampled_opt_position; + for (size_t i = closest_idx; i < stop_traj_points.size(); ++i) { + const double query_s = std::max( + autoware::motion_utils::calcSignedArcLength(stop_traj_points, 0, i), opt_position.front()); + if (query_s > opt_position.back()) { + break_id = i; + break; + } + resampled_opt_position.push_back(query_s); + } + // resample optimum velocity for original each position + auto resampled_opt_velocity = + autoware::interpolation::lerp(opt_position, opt_velocity, resampled_opt_position); + for (size_t i = break_id; i < stop_traj_points.size(); ++i) { + resampled_opt_velocity.push_back(stop_traj_points.at(i).longitudinal_velocity_mps); + } + + // Create Output Data + std::vector output = stop_traj_points; + for (size_t i = 0; i < closest_idx; ++i) { + output.at(i).longitudinal_velocity_mps = data.v0; + } + for (size_t i = closest_idx; i < output.size(); ++i) { + output.at(i).longitudinal_velocity_mps = + resampled_opt_velocity.at(i - closest_idx) + velocity_margin_; + } + output.back().longitudinal_velocity_mps = 0.0; // terminal velocity is zero + + // Insert Closest Stop Point + autoware::motion_utils::insertStopPoint(0, closest_stop_dist, output); + + prev_output_ = output; + return output; +} + +std::vector OptimizationBasedPlanner::createTimeVector() +{ + std::vector time_vec; + for (double t = 0.0; t < dense_time_horizon_; t += dense_resampling_time_interval_) { + time_vec.push_back(t); + } + if (dense_time_horizon_ - time_vec.back() < 1e-3) { + time_vec.back() = dense_time_horizon_; + } else { + time_vec.push_back(dense_time_horizon_); + } + + for (double t = dense_time_horizon_ + sparse_resampling_time_interval_; t < max_time_horizon_; + t += sparse_resampling_time_interval_) { + time_vec.push_back(t); + } + if (max_time_horizon_ - time_vec.back() < 1e-3) { + time_vec.back() = max_time_horizon_; + } else { + time_vec.push_back(max_time_horizon_); + } + + return time_vec; +} + +// v0, a0 +std::tuple OptimizationBasedPlanner::calcInitialMotion( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & prev_traj_points) +{ + const auto & ego_vel = planner_data->current_odometry.twist.twist.linear.x; + const auto & ego_pose = planner_data->current_odometry.pose.pose; + const auto & input_traj_points = stop_traj_points; + const double vehicle_speed{std::abs(ego_vel)}; + const auto current_closest_point = autoware::motion_utils::calcInterpolatedPoint( + autoware::motion_utils::convertToTrajectory(input_traj_points), + planner_data->current_odometry.pose.pose, planner_data->ego_nearest_dist_threshold, + planner_data->ego_nearest_yaw_threshold); + const double target_vel{std::abs(current_closest_point.longitudinal_velocity_mps)}; + + double initial_vel{}; + double initial_acc{}; + + // first time + if (prev_traj_points.empty()) { + initial_vel = vehicle_speed; + initial_acc = 0.0; + return std::make_tuple(initial_vel, initial_acc); + } + + TrajectoryPoint prev_output_closest_point; + if (smoothed_trajectory_ptr_) { + prev_output_closest_point = autoware::motion_utils::calcInterpolatedPoint( + *smoothed_trajectory_ptr_, ego_pose, planner_data->ego_nearest_dist_threshold, + planner_data->ego_nearest_yaw_threshold); + } else { + prev_output_closest_point = autoware::motion_utils::calcInterpolatedPoint( + autoware::motion_utils::convertToTrajectory(prev_traj_points), ego_pose, + planner_data->ego_nearest_dist_threshold, planner_data->ego_nearest_yaw_threshold); + } + + // when velocity tracking deviation is large + const double desired_vel{prev_output_closest_point.longitudinal_velocity_mps}; + const double vel_error{vehicle_speed - std::abs(desired_vel)}; + if (std::abs(vel_error) > replan_vel_deviation_) { + initial_vel = vehicle_speed; // use current vehicle speed + initial_acc = prev_output_closest_point.acceleration_mps2; + RCLCPP_DEBUG( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "calcInitialMotion : Large deviation error for speed control. Use current speed for " + "initial value, desired_vel = %f, vehicle_speed = %f, vel_error = %f, error_thr = %f", + desired_vel, vehicle_speed, vel_error, replan_vel_deviation_); + return std::make_tuple(initial_vel, initial_acc); + } + + // if current vehicle velocity is low && base_desired speed is high, + // use engage_velocity for engage vehicle + const double engage_vel_thr = engage_velocity_ * engage_exit_ratio_; + if (vehicle_speed < engage_vel_thr) { + if (target_vel >= engage_velocity_) { + const auto stop_dist = autoware::motion_utils::calcDistanceToForwardStopPoint( + input_traj_points, ego_pose, planner_data->ego_nearest_dist_threshold, + planner_data->ego_nearest_yaw_threshold); + if (!stop_dist.has_value()) { + RCLCPP_DEBUG( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "calcInitialMotion : vehicle speed is low (%.3f), and desired speed is high (%.3f). Use " + "engage speed (%.3f) until vehicle speed reaches engage_vel_thr (%.3f)", + vehicle_speed, target_vel, engage_velocity_, engage_vel_thr); + return std::make_tuple(engage_velocity_, engage_acceleration_); + } else if (stop_dist.value() > stop_dist_to_prohibit_engage_) { + RCLCPP_DEBUG( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "calcInitialMotion : vehicle speed is low (%.3f), and desired speed is high (%.3f). Use " + "engage speed (%.3f) until vehicle speed reaches engage_vel_thr (%.3f). stop_dist = %.3f", + vehicle_speed, target_vel, engage_velocity_, engage_vel_thr, stop_dist.value()); + return std::make_tuple(engage_velocity_, engage_acceleration_); + } else { + RCLCPP_DEBUG( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "calcInitialMotion : stop point is close (%.3f[m]). no engage.", stop_dist.value()); + } + } else if (target_vel > 0.0) { + auto clock{rclcpp::Clock{RCL_ROS_TIME}}; + RCLCPP_WARN_THROTTLE( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), clock, 3000, + "calcInitialMotion : target velocity(%.3f[m/s]) is lower than engage velocity(%.3f[m/s]). ", + target_vel, engage_velocity_); + } + } + + // normal update: use closest in prev_output + initial_vel = prev_output_closest_point.longitudinal_velocity_mps; + initial_acc = prev_output_closest_point.acceleration_mps2; + return std::make_tuple(initial_vel, initial_acc); +} + +bool OptimizationBasedPlanner::checkHasReachedGoal( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points) +{ + // If goal is close and current velocity is low, we don't optimize trajectory + const auto closest_stop_dist = autoware::motion_utils::calcDistanceToForwardStopPoint( + stop_traj_points, planner_data->current_odometry.pose.pose, + planner_data->ego_nearest_dist_threshold, planner_data->ego_nearest_yaw_threshold); + if ( + closest_stop_dist && *closest_stop_dist < 0.5 && + planner_data->current_odometry.twist.twist.linear.x < 0.6) { + return true; + } + + return false; +} + +std::optional OptimizationBasedPlanner::getSBoundaries( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & obstacles, const std::vector & time_vec) +{ + if (stop_traj_points.empty()) { + return std::nullopt; + } + + const auto traj_length = calcTrajectoryLengthFromCurrentPose( + stop_traj_points, planner_data->current_odometry.pose.pose, planner_data); + if (!traj_length) { + return {}; + } + + SBoundaries s_boundaries(time_vec.size()); + for (size_t i = 0; i < s_boundaries.size(); ++i) { + s_boundaries.at(i).max_s = *traj_length; + } + + double min_slow_down_point_length = std::numeric_limits::max(); + std::optional min_slow_down_idx = {}; + for (size_t o_idx = 0; o_idx < obstacles.size(); ++o_idx) { + const auto & obj = obstacles.at(o_idx); + if (obj.collision_points.empty()) { + continue; + } + + // Step1 Get S boundary from the obstacle + const auto obj_s_boundaries = + getSBoundaries(planner_data, stop_traj_points, obj, time_vec, *traj_length); + if (!obj_s_boundaries) { + continue; + } + + // Step2 update s boundaries + for (size_t i = 0; i < obj_s_boundaries->size(); ++i) { + if (obj_s_boundaries->at(i).max_s < s_boundaries.at(i).max_s) { + s_boundaries.at(i) = obj_s_boundaries->at(i); + } + } + + // Step3 search nearest obstacle to follow for rviz marker + const double obj_vel = std::abs(obj.velocity); + const double rss_dist = + calc_rss_distance(planner_data->current_odometry.twist.twist.linear.x, obj_vel); + + const auto & safe_distance_margin = cruise_planning_param_.safe_distance_margin; + const double ego_obj_length = autoware::motion_utils::calcSignedArcLength( + stop_traj_points, planner_data->current_odometry.pose.pose.position, + obj.collision_points.front().point); + const double slow_down_point_length = ego_obj_length - (rss_dist + safe_distance_margin); + + if (slow_down_point_length < min_slow_down_point_length) { + min_slow_down_point_length = slow_down_point_length; + min_slow_down_idx = o_idx; + } + } + + // Publish wall marker for slowing down or stopping + if (min_slow_down_idx) { + const auto & current_time = clock_->now(); + + const auto marker_pose = autoware::motion_utils::calcLongitudinalOffsetPose( + stop_traj_points, planner_data->current_odometry.pose.pose.position, + min_slow_down_point_length); + + if (marker_pose) { + MarkerArray wall_msg; + + const auto markers = autoware::motion_utils::createSlowDownVirtualWallMarker( + marker_pose.value(), "obstacle to follow", current_time, 0); + autoware::universe_utils::appendMarkerArray(markers, &wall_msg); + + // publish rviz marker + debug_wall_marker_pub_->publish(wall_msg); + } + } + + return s_boundaries; +} + +std::optional OptimizationBasedPlanner::getSBoundaries( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, const CruiseObstacle & object, + const std::vector & time_vec, const double traj_length) +{ + if (object.collision_points.empty()) { + return {}; + } + + const bool onEgoTrajectory = + checkOnTrajectory(planner_data, stop_traj_points, object.collision_points.front()); + const auto & safe_distance_margin = cruise_planning_param_.safe_distance_margin; + + // If the object is on the current ego trajectory, + // we assume the object travels along ego trajectory + if (onEgoTrajectory) { + RCLCPP_DEBUG( + rclcpp::get_logger("ObstacleCruisePlanner::OptimizationBasedPlanner"), + "On Trajectory Object"); + + return getSBoundariesForOnTrajectoryObject( + stop_traj_points, planner_data, time_vec, safe_distance_margin, object, traj_length); + } + + // Ignore low velocity objects that are not on the trajectory + return getSBoundariesForOffTrajectoryObject( + stop_traj_points, planner_data, time_vec, safe_distance_margin, object, traj_length); +} + +std::optional OptimizationBasedPlanner::getSBoundariesForOnTrajectoryObject( + const std::vector & traj_points, + const std::shared_ptr planner_data, const std::vector & time_vec, + const double safety_distance, const CruiseObstacle & object, const double traj_length) const +{ + const double & min_object_accel_for_rss = cruise_planning_param_.min_object_accel_for_rss; + + SBoundaries s_boundaries(time_vec.size()); + for (size_t i = 0; i < s_boundaries.size(); ++i) { + s_boundaries.at(i).max_s = traj_length; + } + + const double v_obj = std::abs(object.velocity); + + const double dist_to_collision_point = calc_distance_to_collisionPoint( + traj_points, planner_data, object.collision_points.front().point); + + double current_s_obj = std::max(dist_to_collision_point - safety_distance, 0.0); + const double current_v_obj = v_obj; + const double initial_s_upper_bound = + current_s_obj + (current_v_obj * current_v_obj) / (2 * std::fabs(min_object_accel_for_rss)); + s_boundaries.front().max_s = std::clamp(initial_s_upper_bound, 0.0, s_boundaries.front().max_s); + s_boundaries.front().is_object = true; + for (size_t i = 1; i < time_vec.size(); ++i) { + const double dt = time_vec.at(i) - time_vec.at(i - 1); + current_s_obj = current_s_obj + current_v_obj * dt; + + const double s_upper_bound = + current_s_obj + (current_v_obj * current_v_obj) / (2 * std::fabs(min_object_accel_for_rss)); + s_boundaries.at(i).max_s = std::clamp(s_upper_bound, 0.0, s_boundaries.at(i).max_s); + s_boundaries.at(i).is_object = true; + } + + return s_boundaries; +} + +std::optional OptimizationBasedPlanner::getSBoundariesForOffTrajectoryObject( + const std::vector & traj_points, + const std::shared_ptr planner_data, const std::vector & time_vec, + const double safety_distance, const CruiseObstacle & object, const double traj_length) +{ + const auto & current_time = clock_->now(); + const double & min_object_accel_for_rss = cruise_planning_param_.min_object_accel_for_rss; + + const double v_obj = std::abs(object.velocity); + + SBoundaries s_boundaries(time_vec.size()); + for (size_t i = 0; i < s_boundaries.size(); ++i) { + s_boundaries.at(i).max_s = traj_length; + } + + for (const auto & collision_point : object.collision_points) { + const double object_time = (rclcpp::Time(collision_point.stamp) - current_time).seconds(); + if (object_time < 0) { + // Ignore Past Positions + continue; + } + + const double dist_to_collision_point = + calc_distance_to_collisionPoint(traj_points, planner_data, collision_point.point); + if (!dist_to_collision_point) { + continue; + } + + const double current_s_obj = std::max(dist_to_collision_point - safety_distance, 0.0); + const double s_upper_bound = + current_s_obj + (v_obj * v_obj) / (2 * std::fabs(min_object_accel_for_rss)); + + size_t object_time_segment_idx = 0; + for (size_t i = 0; i < time_vec.size() - 1; ++i) { + if (time_vec.at(i) < object_time && object_time < time_vec.at(i + 1)) { + object_time_segment_idx = i; + break; + } + } + + for (size_t i = 0; i <= object_time_segment_idx + 1; ++i) { + if (time_vec.at(i) < object_time && s_upper_bound < s_boundaries.at(i).max_s) { + s_boundaries.at(i).max_s = std::max(0.0, s_upper_bound); + s_boundaries.at(i).is_object = true; + } + } + } + + return s_boundaries; +} + +bool OptimizationBasedPlanner::checkOnTrajectory( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const polygon_utils::PointWithStamp & point) +{ + // If the collision point is in the future, we return false + if ((rclcpp::Time(point.stamp) - clock_->now()).seconds() > 0.1) { + return false; + } + + const double lateral_offset = + std::fabs(autoware::motion_utils::calcLateralOffset(stop_traj_points, point.point)); + + if (lateral_offset < planner_data->vehicle_info_.max_lateral_offset_m + 0.1) { + return true; + } + + return false; +} + +std::optional OptimizationBasedPlanner::calcTrajectoryLengthFromCurrentPose( + const std::vector & traj_points, const geometry_msgs::msg::Pose & ego_pose, + const std::shared_ptr planner_data) +{ + const size_t ego_segment_idx = planner_data->find_segment_index(traj_points, ego_pose); + + const double traj_length = autoware::motion_utils::calcSignedArcLength( + traj_points, ego_pose.position, ego_segment_idx, traj_points.size() - 1); + + const auto dist_to_closest_stop_point = autoware::motion_utils::calcDistanceToForwardStopPoint( + traj_points, ego_pose, planner_data->ego_nearest_dist_threshold, + planner_data->ego_nearest_yaw_threshold); + if (dist_to_closest_stop_point) { + return std::min(traj_length, dist_to_closest_stop_point.value()); + } + + return traj_length; +} + +std::optional +OptimizationBasedPlanner::processOptimizedResult( + const double v0, const VelocityOptimizer::OptimizationResult & opt_result, const double offset) +{ + if ( + opt_result.t.empty() || opt_result.s.empty() || opt_result.v.empty() || opt_result.a.empty() || + opt_result.j.empty()) { + return std::nullopt; + } + + size_t break_id = opt_result.s.size(); + VelocityOptimizer::OptimizationResult processed_result; + processed_result.t.push_back(0.0); + processed_result.s.push_back(offset); + processed_result.v.push_back(v0); + processed_result.a.push_back(opt_result.a.front()); + processed_result.j.push_back(opt_result.j.front()); + + for (size_t i = 1; i < opt_result.s.size(); ++i) { + const double prev_s = processed_result.s.back(); + const double current_s = std::max(opt_result.s.at(i), 0.0) + offset; + const double current_v = opt_result.v.at(i); + if (prev_s >= current_s) { + processed_result.v.back() = 0.0; + break_id = i; + break; + } else if (current_v < ZERO_VEL_THRESHOLD) { + break_id = i; + break; + } else if (std::fabs(current_s - prev_s) < CLOSE_S_DIST_THRESHOLD) { + processed_result.v.back() = current_v; + processed_result.s.back() = current_s; + continue; + } + + processed_result.t.push_back(opt_result.t.at(i)); + processed_result.s.push_back(current_s); + processed_result.v.push_back(current_v); + processed_result.a.push_back(opt_result.a.at(i)); + processed_result.j.push_back(opt_result.j.at(i)); + } + + // Padding Zero Velocity after break id + for (size_t i = break_id; i < opt_result.s.size(); ++i) { + const double prev_s = processed_result.s.back(); + const double current_s = std::max(opt_result.s.at(i), 0.0) + offset; + if (prev_s >= current_s) { + processed_result.v.back() = 0.0; + continue; + } else if (std::fabs(current_s - prev_s) < CLOSE_S_DIST_THRESHOLD) { + processed_result.v.back() = 0.0; + processed_result.s.back() = current_s; + continue; + } + processed_result.t.push_back(opt_result.t.at(i)); + processed_result.s.push_back(current_s); + processed_result.v.push_back(0.0); + processed_result.a.push_back(0.0); + processed_result.j.push_back(0.0); + } + + return processed_result; +} + +void OptimizationBasedPlanner::publishDebugTrajectory( + [[maybe_unused]] const std::shared_ptr planner_data, const double offset, + const std::vector & time_vec, const SBoundaries & s_boundaries, + const VelocityOptimizer::OptimizationResult & opt_result) +{ + const auto & current_time = clock_->now(); + // Publish optimized result and boundary + Trajectory boundary_traj; + boundary_traj.header.stamp = current_time; + boundary_traj.points.resize(s_boundaries.size()); + double boundary_s_max = 0.0; + for (size_t i = 0; i < s_boundaries.size(); ++i) { + const double bound_s = s_boundaries.at(i).max_s; + const double bound_t = time_vec.at(i); + boundary_traj.points.at(i).pose.position.x = bound_s; + boundary_traj.points.at(i).pose.position.y = bound_t; + boundary_s_max = std::max(bound_s, boundary_s_max); + } + boundary_pub_->publish(boundary_traj); + + Trajectory optimized_sv_traj; + optimized_sv_traj.header.stamp = current_time; + optimized_sv_traj.points.resize(opt_result.s.size()); + for (size_t i = 0; i < opt_result.s.size(); ++i) { + const double s = opt_result.s.at(i); + const double v = opt_result.v.at(i); + optimized_sv_traj.points.at(i).pose.position.x = s + offset; + optimized_sv_traj.points.at(i).pose.position.y = v; + } + optimized_sv_pub_->publish(optimized_sv_traj); + + Trajectory optimized_st_graph; + optimized_st_graph.header.stamp = current_time; + optimized_st_graph.points.resize(opt_result.s.size()); + for (size_t i = 0; i < opt_result.s.size(); ++i) { + const double bound_s = opt_result.s.at(i); + const double bound_t = opt_result.t.at(i); + optimized_st_graph.points.at(i).pose.position.x = bound_s; + optimized_st_graph.points.at(i).pose.position.y = bound_t; + } + optimized_st_graph_pub_->publish(optimized_st_graph); +} +} // namespace autoware::motion_velocity_planner diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/optimization_based_planner.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/optimization_based_planner.hpp new file mode 100644 index 0000000000000..efb924159d471 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/optimization_based_planner.hpp @@ -0,0 +1,141 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef OPTIMIZATION_BASED_PLANNER__OPTIMIZATION_BASED_PLANNER_HPP_ // NOLINT +#define OPTIMIZATION_BASED_PLANNER__OPTIMIZATION_BASED_PLANNER_HPP_ // NOLINT + +#include "../cruise_planner_interface.hpp" +#include "../type_alias.hpp" +#include "../types.hpp" +#include "s_boundary.hpp" +#include "velocity_optimizer.hpp" + +#include +#include +#include + +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +class OptimizationBasedPlanner : public CruisePlannerInterface +{ +public: + OptimizationBasedPlanner( + rclcpp::Node & node, const CommonParam & common_param, + const CruisePlanningParam & cruise_planning_param); + + std::vector plan_cruise( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & obstacles, std::shared_ptr debug_data_ptr, + std::unique_ptr & + planning_factor_interface, + std::optional & velocity_limit) override; + + void update_parameters( + [[maybe_unused]] const std::vector & parameters) override + { + } + +private: + // Member Functions + std::vector createTimeVector(); + std::tuple calcInitialMotion( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & prev_traj_points); + + static bool checkHasReachedGoal( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points); + + std::optional getSBoundaries( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & obstacles, const std::vector & time_vec); + + std::optional getSBoundaries( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, const CruiseObstacle & object, + const std::vector & time_vec, const double traj_length); + + std::optional getSBoundariesForOnTrajectoryObject( + const std::vector & traj_points, + const std::shared_ptr planner_data, const std::vector & time_vec, + const double safety_distance, const CruiseObstacle & object, const double traj_length) const; + + std::optional getSBoundariesForOffTrajectoryObject( + const std::vector & traj_points, + const std::shared_ptr planner_data, const std::vector & time_vec, + const double safety_distance, const CruiseObstacle & object, const double traj_length); + + bool checkOnTrajectory( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const polygon_utils::PointWithStamp & point); + + static std::optional calcTrajectoryLengthFromCurrentPose( + const std::vector & traj_points, const geometry_msgs::msg::Pose & ego_pose, + const std::shared_ptr planner_data); + + geometry_msgs::msg::Pose transformBaseLink2Center( + const geometry_msgs::msg::Pose & pose_base_link); + + static std::optional processOptimizedResult( + const double v0, const VelocityOptimizer::OptimizationResult & opt_result, const double offset); + + void publishDebugTrajectory( + [[maybe_unused]] const std::shared_ptr planner_data, const double offset, + const std::vector & time_vec, const SBoundaries & s_boundaries, + const VelocityOptimizer::OptimizationResult & opt_result); + + std::vector prev_output_; + + // Velocity Optimizer + std::shared_ptr velocity_optimizer_ptr_; + + // Publisher + rclcpp::Publisher::SharedPtr boundary_pub_; + rclcpp::Publisher::SharedPtr optimized_sv_pub_; + rclcpp::Publisher::SharedPtr optimized_st_graph_pub_; + rclcpp::Publisher::SharedPtr debug_wall_marker_pub_; + + // Subscriber + rclcpp::Subscription::SharedPtr smoothed_traj_sub_; + + Trajectory::ConstSharedPtr smoothed_trajectory_ptr_{nullptr}; + + // Resampling Parameter + double dense_resampling_time_interval_; + double sparse_resampling_time_interval_; + double dense_time_horizon_; + double max_time_horizon_; + + double t_dangerous_; + double velocity_margin_; + + double replan_vel_deviation_; + double engage_velocity_; + double engage_acceleration_; + double engage_exit_ratio_; + double stop_dist_to_prohibit_engage_; +}; +} // namespace autoware::motion_velocity_planner +// clang-format off +#endif // OPTIMIZATION_BASED_PLANNER__OPTIMIZATION_BASED_PLANNER_HPP_ // NOLINT +// clang-format on diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/s_boundary.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/s_boundary.hpp new file mode 100644 index 0000000000000..66d1ddfdc2b4e --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/s_boundary.hpp @@ -0,0 +1,36 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef OPTIMIZATION_BASED_PLANNER__S_BOUNDARY_HPP_ +#define OPTIMIZATION_BASED_PLANNER__S_BOUNDARY_HPP_ + +#include +#include + +namespace autoware::motion_velocity_planner +{ +class SBoundary +{ +public: + SBoundary(const double _max_s, const double _min_s) : max_s(_max_s), min_s(_min_s) {} + SBoundary() : max_s(std::numeric_limits::max()), min_s(0.0) {} + + double max_s = std::numeric_limits::max(); + double min_s = 0.0; + bool is_object = false; +}; + +using SBoundaries = std::vector; +} // namespace autoware::motion_velocity_planner + +#endif // OPTIMIZATION_BASED_PLANNER__S_BOUNDARY_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/velocity_optimizer.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/velocity_optimizer.cpp new file mode 100644 index 0000000000000..d8e8c1aff5474 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/velocity_optimizer.cpp @@ -0,0 +1,287 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "velocity_optimizer.hpp" + +#include + +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +VelocityOptimizer::VelocityOptimizer( + const double max_s_weight, const double max_v_weight, const double over_s_safety_weight, + const double over_s_ideal_weight, const double over_v_weight, const double over_a_weight, + const double over_j_weight) +: max_s_weight_(max_s_weight), + max_v_weight_(max_v_weight), + over_s_safety_weight_(over_s_safety_weight), + over_s_ideal_weight_(over_s_ideal_weight), + over_v_weight_(over_v_weight), + over_a_weight_(over_a_weight), + over_j_weight_(over_j_weight) +{ + qp_solver_.updateMaxIter(200000); + qp_solver_.updateRhoInterval(0); // 0 means automatic + qp_solver_.updateEpsRel(1.0e-4); // def: 1.0e-4 + qp_solver_.updateEpsAbs(1.0e-8); // def: 1.0e-4 + qp_solver_.updateVerbose(false); +} + +VelocityOptimizer::OptimizationResult VelocityOptimizer::optimize(const OptimizationData & data) +{ + const std::vector time_vec = data.time_vec; + const size_t N = time_vec.size(); + const double s0 = data.s0; + const double v0 = data.v0; + const double a0 = data.a0; + const double v_max = std::max(data.v_max, 0.1); + const double a_max = data.a_max; + const double a_min = data.a_min; + const double limit_a_max = data.limit_a_max; + const double limit_a_min = data.limit_a_min; + const double limit_j_max = data.limit_j_max; + const double limit_j_min = data.limit_j_min; + const double j_max = data.j_max; + const double j_min = data.j_min; + const double a_range = std::max(a_max - a_min, 0.1); + const double j_range = std::max(j_max - j_min, 0.1); + const double t_dangerous = data.t_dangerous; + const double t_idling = data.idling_time; + const auto s_boundary = data.s_boundary; + + // Variables: s_i, v_i, a_i, j_i, over_s_safety_i, over_s_ideal_i, over_v_i, over_a_i, over_j_i + const int IDX_S0 = 0; + const int IDX_V0 = N; + const int IDX_A0 = 2 * N; + const int IDX_J0 = 3 * N; + const int IDX_OVER_S_SAFETY0 = 4 * N; + const int IDX_OVER_S_IDEAL0 = 5 * N; + const int IDX_OVER_V0 = 6 * N; + const int IDX_OVER_A0 = 7 * N; + const int IDX_OVER_J0 = 8 * N; + const int l_variables = 9 * N; + const int l_constraints = 7 * N + 3 * (N - 1) + 3; + + // the matrix size depends on constraint numbers. + Eigen::MatrixXd A = Eigen::MatrixXd::Zero(l_constraints, l_variables); + std::vector lower_bound(l_constraints, 0.0); + std::vector upper_bound(l_constraints, 0.0); + + // Object Variables + Eigen::MatrixXd P = Eigen::MatrixXd::Zero(l_variables, l_variables); + std::vector q(l_variables, 0.0); + + // Object Function + // min w_s*(s_i - s_ideal_i)^2 + w_v * v0 * ((v_i - v_max)^2 / v_max^2) + // + over_s_safety^2 + over_s_ideal^2 + over_v_ideal^2 + over_a_ideal^2 + // + over_j_ideal^2 + constexpr double MINIMUM_MAX_S_BOUND = 0.01; + for (size_t i = 0; i < N; ++i) { + const double dt = + i < N - 1 ? time_vec.at(i + 1) - time_vec.at(i) : time_vec.at(N - 1) - time_vec.at(N - 2); + const double max_s = std::max(s_boundary.at(i).max_s, MINIMUM_MAX_S_BOUND); + const double v_coeff = v0 / (2 * std::fabs(a_min)) + t_idling; + if (s_boundary.at(i).is_object) { + q.at(IDX_S0 + i) += -max_s_weight_ / max_s * dt; + q.at(IDX_V0 + i) += -max_s_weight_ / max_s * v_coeff * dt; + } else { + q.at(IDX_S0 + i) += -max_s_weight_ / max_s * dt; + } + + q.at(IDX_V0 + i) += -max_v_weight_ / v_max * dt; + } + + for (size_t i = 0; i < N; ++i) { + const double dt = + i < N - 1 ? time_vec.at(i + 1) - time_vec.at(i) : time_vec.at(N - 1) - time_vec.at(N - 2); + const double max_s = std::max(s_boundary.at(i).max_s, MINIMUM_MAX_S_BOUND); + P(IDX_OVER_S_SAFETY0 + i, IDX_OVER_S_SAFETY0 + i) += + over_s_safety_weight_ / (max_s * max_s) * dt; + P(IDX_OVER_S_IDEAL0 + i, IDX_OVER_S_IDEAL0 + i) += over_s_ideal_weight_ / (max_s * max_s) * dt; + P(IDX_OVER_V0 + i, IDX_OVER_V0 + i) += over_v_weight_ / (v_max * v_max) * dt; + P(IDX_OVER_A0 + i, IDX_OVER_A0 + i) += over_a_weight_ / a_range * dt; + P(IDX_OVER_J0 + i, IDX_OVER_J0 + i) += over_j_weight_ / j_range * dt; + + if (s_boundary.at(i).is_object) { + const double v_coeff = v0 / (2 * std::fabs(a_min)) + t_idling; + P(IDX_S0 + i, IDX_S0 + i) += max_s_weight_ / (max_s * max_s) * dt; + P(IDX_V0 + i, IDX_V0 + i) += max_s_weight_ / (max_s * max_s) * v_coeff * v_coeff * dt; + P(IDX_S0 + i, IDX_V0 + i) += max_s_weight_ / (max_s * max_s) * v_coeff * dt; + P(IDX_V0 + i, IDX_S0 + i) += max_s_weight_ / (max_s * max_s) * v_coeff * dt; + } else { + P(IDX_S0 + i, IDX_S0 + i) += max_s_weight_ / (max_s * max_s) * dt; + } + + P(IDX_V0 + i, IDX_V0 + i) += max_v_weight_ / (v_max * v_max) * dt; + } + + // Constraint + size_t constr_idx = 0; + + // Safety Position Constraint: s_boundary_min < s_i + v_i*t_dangerous + v0*v_i/(2*|a_min|) - + // over_s_safety_i < s_boundary_max + for (size_t i = 0; i < N; ++i, ++constr_idx) { + const double v_coeff = v0 / (2 * std::fabs(a_min)) + t_dangerous; + A(constr_idx, IDX_S0 + i) = 1.0; // s_i + if (s_boundary.at(i).is_object) { + A(constr_idx, IDX_V0 + i) = v_coeff; // v_i * (t_dangerous + v0/(2*|a_min|)) + } + A(constr_idx, IDX_OVER_S_SAFETY0 + i) = -1.0; // over_s_safety_i + upper_bound.at(constr_idx) = s_boundary.at(i).max_s; + lower_bound.at(constr_idx) = 0.0; + } + + // Ideal Position Constraint: s_boundary_min < s_i + v_i * t_idling + v0*v_i/(2*|a_min|) - + // over_s_ideal_i < s_boundary_max + for (size_t i = 0; i < N; ++i, ++constr_idx) { + const double v_coeff = v0 / (2 * std::fabs(a_min)) + t_idling; + A(constr_idx, IDX_S0 + i) = 1.0; // s_i + if (s_boundary.at(i).is_object) { + A(constr_idx, IDX_V0 + i) = v_coeff; // v_i * (t_idling + v0/(2*|a_min|)) + } + A(constr_idx, IDX_OVER_S_IDEAL0 + i) = -1.0; // over_s_ideal_i + upper_bound.at(constr_idx) = s_boundary.at(i).max_s; + lower_bound.at(constr_idx) = 0.0; + } + + // Soft Velocity Constraint: 0 < v_i - over_v_i < v_max + for (size_t i = 0; i < N; ++i, ++constr_idx) { + A(constr_idx, IDX_V0 + i) = 1.0; // v_i + A(constr_idx, IDX_OVER_V0 + i) = -1.0; // over_v_i + upper_bound.at(constr_idx) = i == N - 1 ? 0.0 : v_max; + lower_bound.at(constr_idx) = 0.0; + } + + // Soft Acceleration Constraint: a_min < a_i - over_a_i < a_max + for (size_t i = 0; i < N; ++i, ++constr_idx) { + A(constr_idx, IDX_A0 + i) = 1.0; // a_i + A(constr_idx, IDX_OVER_A0 + i) = -1.0; // over_a_i + upper_bound.at(constr_idx) = i == N - 1 ? 0.0 : a_max; + lower_bound.at(constr_idx) = i == N - 1 ? 0.0 : a_min; + } + + // Hard Acceleration Constraint: limit_a_min < a_i < a_max + for (size_t i = 0; i < N; ++i, ++constr_idx) { + A(constr_idx, IDX_A0 + i) = 1.0; // a_i + upper_bound.at(constr_idx) = limit_a_max; + lower_bound.at(constr_idx) = limit_a_min; + } + + // Soft Jerk Constraint: j_min < j_i - over_j_i < j_max + for (size_t i = 0; i < N; ++i, ++constr_idx) { + A(constr_idx, IDX_J0 + i) = 1.0; // j_i + A(constr_idx, IDX_OVER_J0 + i) = -1.0; // over_j_i + upper_bound.at(constr_idx) = i == N - 1 ? 0.0 : j_max; + lower_bound.at(constr_idx) = i == N - 1 ? 0.0 : j_min; + } + + // Hard Jerk Constraint: limit_j_min < j_i < limit_j_max + for (size_t i = 0; i < N; ++i, ++constr_idx) { + A(constr_idx, IDX_J0 + i) = 1.0; // j_i + upper_bound.at(constr_idx) = limit_j_max; + lower_bound.at(constr_idx) = limit_j_min; + } + + // Dynamic Constraint + // s_i+1 = s_i + v_i * dt + 0.5 * a_i * dt^2 + 1/6 * j_i * dt^3 + for (size_t i = 0; i < N - 1; ++i, ++constr_idx) { + const double dt = time_vec.at(i + 1) - time_vec.at(i); + A(constr_idx, IDX_S0 + i + 1) = 1.0; // s_i+1 + A(constr_idx, IDX_S0 + i) = -1.0; // -s_i + A(constr_idx, IDX_V0 + i) = -dt; // -v_i*dt + A(constr_idx, IDX_A0 + i) = -0.5 * dt * dt; // -0.5 * a_i * dt^2 + A(constr_idx, IDX_J0 + i) = -1.0 / 6.0 * dt * dt * dt; // -1.0/6.0 * j_i * dt^3 + upper_bound.at(constr_idx) = 0.0; + lower_bound.at(constr_idx) = 0.0; + } + + // v_i+1 = v_i + a_i * dt + 0.5 * j_i * dt^2 + for (size_t i = 0; i < N - 1; ++i, ++constr_idx) { + const double dt = time_vec.at(i + 1) - time_vec.at(i); + A(constr_idx, IDX_V0 + i + 1) = 1.0; // v_i+1 + A(constr_idx, IDX_V0 + i) = -1.0; // -v_i + A(constr_idx, IDX_A0 + i) = -dt; // -a_i * dt + A(constr_idx, IDX_J0 + i) = -0.5 * dt * dt; // -0.5 * j_i * dt^2 + upper_bound.at(constr_idx) = 0.0; + lower_bound.at(constr_idx) = 0.0; + } + + // a_i+1 = a_i + j_i * dt + for (size_t i = 0; i < N - 1; ++i, ++constr_idx) { + const double dt = time_vec.at(i + 1) - time_vec.at(i); + A(constr_idx, IDX_A0 + i + 1) = 1.0; // a_i+1 + A(constr_idx, IDX_A0 + i) = -1.0; // -a_i + A(constr_idx, IDX_J0 + i) = -dt; // -j_i * dt + upper_bound.at(constr_idx) = 0.0; + lower_bound.at(constr_idx) = 0.0; + } + + // initial condition + { + A(constr_idx, IDX_S0) = 1.0; // s0 + upper_bound[constr_idx] = s0; + lower_bound[constr_idx] = s0; + ++constr_idx; + + A(constr_idx, IDX_V0) = 1.0; // v0 + upper_bound[constr_idx] = v0; + lower_bound[constr_idx] = v0; + ++constr_idx; + + A(constr_idx, IDX_A0) = 1.0; // a0 + upper_bound[constr_idx] = a0; + lower_bound[constr_idx] = a0; + } + + // execute optimization + const auto result = qp_solver_.optimize(P, A, q, lower_bound, upper_bound); + const std::vector optval = std::get<0>(result); + + const int status_val = std::get<3>(result); + if (status_val != 1) + std::cerr << "optimization failed : " << qp_solver_.getStatusMessage().c_str() << std::endl; + + const auto has_nan = + std::any_of(optval.begin(), optval.end(), [](const auto v) { return std::isnan(v); }); + if (has_nan) std::cerr << "optimization failed : result contains NaN values\n"; + + OptimizationResult optimized_result; + const auto is_optimization_failed = status_val != 1 || has_nan; + if (!is_optimization_failed) { + std::vector opt_time = time_vec; + std::vector opt_pos(N); + std::vector opt_vel(N); + std::vector opt_acc(N); + std::vector opt_jerk(N); + for (size_t i = 0; i < N; ++i) { + opt_pos.at(i) = optval.at(IDX_S0 + i); + opt_vel.at(i) = std::max(optval.at(IDX_V0 + i), 0.0); + opt_acc.at(i) = optval.at(IDX_A0 + i); + opt_jerk.at(i) = optval.at(IDX_J0 + i); + } + opt_vel.back() = 0.0; + + optimized_result.t = opt_time; + optimized_result.s = opt_pos; + optimized_result.v = opt_vel; + optimized_result.a = opt_acc; + optimized_result.j = opt_jerk; + } + + return optimized_result; +} +} // namespace autoware::motion_velocity_planner diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/velocity_optimizer.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/velocity_optimizer.hpp new file mode 100644 index 0000000000000..36f6d9f75fb99 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/optimization_based_planner/velocity_optimizer.hpp @@ -0,0 +1,77 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef OPTIMIZATION_BASED_PLANNER__VELOCITY_OPTIMIZER_HPP_ +#define OPTIMIZATION_BASED_PLANNER__VELOCITY_OPTIMIZER_HPP_ + +#include "autoware/osqp_interface/osqp_interface.hpp" +#include "s_boundary.hpp" + +#include + +namespace autoware::motion_velocity_planner +{ +class VelocityOptimizer +{ +public: + struct OptimizationData + { + std::vector time_vec; + double s0; + double v0; + double a0; + double v_max; + double a_max; + double a_min; + double limit_a_max; + double limit_a_min; + double limit_j_max; + double limit_j_min; + double j_max; + double j_min; + double t_dangerous; + double idling_time; + SBoundaries s_boundary; + }; + + struct OptimizationResult + { + std::vector t; + std::vector s; + std::vector v; + std::vector a; + std::vector j; + }; + + VelocityOptimizer( + const double max_s_weight, const double max_v_weight, const double over_s_safety_weight, + const double over_s_ideal_weight, const double over_v_weight, const double over_a_weight, + const double over_j_weight); + + OptimizationResult optimize(const OptimizationData & data); + +private: + // Parameter + double max_s_weight_; + double max_v_weight_; + double over_s_safety_weight_; + double over_s_ideal_weight_; + double over_v_weight_; + double over_a_weight_; + double over_j_weight_; + + // QPSolver + autoware::osqp_interface::OSQPInterface qp_solver_; +}; +} // namespace autoware::motion_velocity_planner +#endif // OPTIMIZATION_BASED_PLANNER__VELOCITY_OPTIMIZER_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/parameters.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/parameters.hpp new file mode 100644 index 0000000000000..af50fb0d4325a --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/parameters.hpp @@ -0,0 +1,159 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef PARAMETERS_HPP_ +#define PARAMETERS_HPP_ + +#include "autoware/motion_utils/marker/marker_helper.hpp" +#include "autoware/motion_utils/resample/resample.hpp" +#include "autoware/motion_utils/trajectory/trajectory.hpp" +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" +#include "autoware/object_recognition_utils/predicted_path_utils.hpp" +#include "autoware/universe_utils/ros/parameter.hpp" +#include "autoware/universe_utils/ros/update_param.hpp" +#include "autoware/universe_utils/system/stop_watch.hpp" +#include "type_alias.hpp" +#include "types.hpp" + +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware::universe_utils::getOrDeclareParameter; + +struct CommonParam +{ + double max_accel{}; + double min_accel{}; + double max_jerk{}; + double min_jerk{}; + double limit_max_accel{}; + double limit_min_accel{}; + double limit_max_jerk{}; + double limit_min_jerk{}; + + CommonParam() = default; + explicit CommonParam(rclcpp::Node & node) + { + max_accel = getOrDeclareParameter(node, "normal.max_acc"); + min_accel = getOrDeclareParameter(node, "normal.min_acc"); + max_jerk = getOrDeclareParameter(node, "normal.max_jerk"); + min_jerk = getOrDeclareParameter(node, "normal.min_jerk"); + limit_max_accel = getOrDeclareParameter(node, "limit.max_acc"); + limit_min_accel = getOrDeclareParameter(node, "limit.min_acc"); + limit_max_jerk = getOrDeclareParameter(node, "limit.max_jerk"); + limit_min_jerk = getOrDeclareParameter(node, "limit.min_jerk"); + } +}; + +struct ObstacleFilteringParam +{ + std::vector inside_object_types{}; + std::vector outside_object_types{}; + // bool use_pointcloud{}; + + double max_lat_margin{}; + + double crossing_obstacle_velocity_threshold{}; + double crossing_obstacle_traj_angle_threshold{}; + + double outside_obstacle_velocity_threshold{}; + double ego_obstacle_overlap_time_threshold{}; + double max_prediction_time_for_collision_check{}; + double max_lateral_time_margin{}; + int num_of_predicted_paths_for_outside_cruise_obstacle{}; + + bool enable_yield{}; + double yield_lat_distance_threshold{}; + double max_lat_dist_between_obstacles{}; + double max_obstacles_collision_time{}; + double stopped_obstacle_velocity_threshold{}; + + double obstacle_velocity_threshold_from_cruise{}; + double obstacle_velocity_threshold_to_cruise{}; + + ObstacleFilteringParam() = default; + explicit ObstacleFilteringParam(rclcpp::Node & node) + { + inside_object_types = + utils::get_target_object_type(node, "obstacle_cruise.obstacle_filtering.object_type.inside."); + outside_object_types = utils::get_target_object_type( + node, "obstacle_cruise.obstacle_filtering.object_type.outside."); + // use_pointcloud = getOrDeclareParameter( + // node, "obstacle_cruise.obstacle_filtering.object_type.pointcloud"); + + max_lat_margin = + getOrDeclareParameter(node, "obstacle_cruise.obstacle_filtering.max_lat_margin"); + + crossing_obstacle_velocity_threshold = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.crossing_obstacle.obstacle_velocity_threshold"); + crossing_obstacle_traj_angle_threshold = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.crossing_obstacle.obstacle_traj_angle_threshold"); + + outside_obstacle_velocity_threshold = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.outside_obstacle.obstacle_velocity_threshold"); + ego_obstacle_overlap_time_threshold = getOrDeclareParameter( + node, + "obstacle_cruise.obstacle_filtering.outside_obstacle.ego_obstacle_overlap_time_threshold"); + max_prediction_time_for_collision_check = getOrDeclareParameter( + node, + "obstacle_cruise.obstacle_filtering.outside_obstacle.max_prediction_time_for_collision_" + "check"); + max_lateral_time_margin = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.outside_obstacle.max_lateral_time_margin"); + num_of_predicted_paths_for_outside_cruise_obstacle = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.outside_obstacle.num_of_predicted_paths"); + enable_yield = + getOrDeclareParameter(node, "obstacle_cruise.obstacle_filtering.yield.enable_yield"); + yield_lat_distance_threshold = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.yield.lat_distance_threshold"); + max_lat_dist_between_obstacles = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.yield.max_lat_dist_between_obstacles"); + max_obstacles_collision_time = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.yield.max_obstacles_collision_time"); + stopped_obstacle_velocity_threshold = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.yield.stopped_obstacle_velocity_threshold"); + obstacle_velocity_threshold_from_cruise = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.obstacle_velocity_threshold_from_cruise"); + obstacle_velocity_threshold_to_cruise = getOrDeclareParameter( + node, "obstacle_cruise.obstacle_filtering.obstacle_velocity_threshold_to_cruise"); + } +}; + +struct CruisePlanningParam +{ + double idling_time{}; + double min_ego_accel_for_rss{}; + double min_object_accel_for_rss{}; + double safe_distance_margin{}; + + CruisePlanningParam() = default; + explicit CruisePlanningParam(rclcpp::Node & node) + { + idling_time = + getOrDeclareParameter(node, "obstacle_cruise.cruise_planning.idling_time"); + min_ego_accel_for_rss = + getOrDeclareParameter(node, "obstacle_cruise.cruise_planning.min_ego_accel_for_rss"); + min_object_accel_for_rss = getOrDeclareParameter( + node, "obstacle_cruise.cruise_planning.min_object_accel_for_rss"); + safe_distance_margin = + getOrDeclareParameter(node, "obstacle_cruise.cruise_planning.safe_distance_margin"); + } +}; +} // namespace autoware::motion_velocity_planner + +#endif // PARAMETERS_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/cruise_planning_debug_info.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/cruise_planning_debug_info.hpp new file mode 100644 index 0000000000000..7d74b602d85dc --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/cruise_planning_debug_info.hpp @@ -0,0 +1,100 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef PID_BASED_PLANNER__CRUISE_PLANNING_DEBUG_INFO_HPP_ +#define PID_BASED_PLANNER__CRUISE_PLANNING_DEBUG_INFO_HPP_ + +#include + +#include "autoware_internal_debug_msgs/msg/float32_multi_array_stamped.hpp" + +#include + +namespace autoware::motion_velocity_planner +{ +using autoware_internal_debug_msgs::msg::Float32MultiArrayStamped; + +class CruisePlanningDebugInfo +{ +public: + enum class TYPE { + // ego + EGO_VELOCITY = 0, // index: 0 + EGO_ACCELERATION, + EGO_JERK, // no data + + // cruise planning + CRUISE_CURRENT_OBSTACLE_DISTANCE_RAW, // index: 3 + CRUISE_CURRENT_OBSTACLE_DISTANCE_FILTERED, + CRUISE_CURRENT_OBSTACLE_VELOCITY_RAW, + CRUISE_CURRENT_OBSTACLE_VELOCITY_FILTERED, + CRUISE_TARGET_OBSTACLE_DISTANCE, + CRUISE_ERROR_DISTANCE_RAW, + CRUISE_ERROR_DISTANCE_FILTERED, + + CRUISE_RELATIVE_EGO_VELOCITY, // index: 10 + CRUISE_TIME_TO_COLLISION, + + CRUISE_TARGET_VELOCITY, // index: 12 + CRUISE_TARGET_ACCELERATION, + CRUISE_TARGET_JERK_RATIO, + + SIZE + }; + + /** + * @brief get the index corresponding to the given value TYPE + * @param [in] type the TYPE enum for which to get the index + * @return index of the type + */ + static int getIndex(const TYPE type) { return static_cast(type); } + + /** + * @brief get all the debug values as an std::array + * @return array of all debug values + */ + std::array(TYPE::SIZE)> get() const { return info_; } + + /** + * @brief set the given type to the given value + * @param [in] type TYPE of the value + * @param [in] value value to set + */ + void set(const TYPE type, const double val) { info_.at(static_cast(type)) = val; } + + /** + * @brief set the given type to the given value + * @param [in] type index of the type + * @param [in] value value to set + */ + void set(const int type, const double val) { info_.at(type) = val; } + + void reset() { info_.fill(0.0); } + + Float32MultiArrayStamped convert_to_message(const rclcpp::Time & current_time) const + { + Float32MultiArrayStamped msg{}; + msg.stamp = current_time; + for (const auto & v : get()) { + msg.data.push_back(v); + } + return msg; + } + +private: + std::array(TYPE::SIZE)> info_; +}; +} // namespace autoware::motion_velocity_planner + +#endif // PID_BASED_PLANNER__CRUISE_PLANNING_DEBUG_INFO_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_based_planner.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_based_planner.cpp new file mode 100644 index 0000000000000..6bada506b977b --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_based_planner.cpp @@ -0,0 +1,774 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pid_based_planner.hpp" + +#include "autoware/interpolation/spline_interpolation.hpp" +#include "autoware/motion_utils/marker/marker_helper.hpp" +#include "autoware/motion_utils/trajectory/conversion.hpp" +#include "autoware/motion_utils/trajectory/interpolation.hpp" +#include "autoware/motion_utils/trajectory/trajectory.hpp" +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" +#include "autoware/universe_utils/geometry/geometry.hpp" +#include "autoware/universe_utils/ros/marker_helper.hpp" +#include "autoware/universe_utils/ros/update_param.hpp" + +#include "tier4_planning_msgs/msg/velocity_limit.hpp" + +#include +#include +#include +#include + +using autoware::signal_processing::LowpassFilter1d; +namespace autoware::motion_velocity_planner +{ + +namespace +{ +VelocityLimit create_velocity_limit_message( + const rclcpp::Time & current_time, const double vel, const double acc, const double max_jerk, + const double min_jerk) +{ + VelocityLimit msg; + msg.stamp = current_time; + msg.sender = "obstacle_cruise"; + msg.use_constraints = true; + + msg.max_velocity = vel; + if (acc < 0) { + msg.constraints.min_acceleration = acc; + } + msg.constraints.max_jerk = max_jerk; + msg.constraints.min_jerk = min_jerk; + + return msg; +} + +template +T getSign(const T val) +{ + if (0 < val) { + return static_cast(1); + } else if (val < 0) { + return static_cast(-1); + } + return static_cast(0); +} +} // namespace + +PIDBasedPlanner::PIDBasedPlanner( + rclcpp::Node & node, const CommonParam & common_param, + const CruisePlanningParam & cruise_planning_param) +: CruisePlannerInterface(node, common_param, cruise_planning_param) +{ + min_accel_during_cruise_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.min_accel_during_cruise"); + + use_velocity_limit_based_planner_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.use_velocity_limit_based_planner"); + + { // velocity limit based planner + const double kp = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.kp"); + const double ki = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.ki"); + const double kd = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.kd"); + velocity_limit_based_planner_param_.pid_vel_controller = + std::make_unique(kp, ki, kd); + + velocity_limit_based_planner_param_.output_ratio_during_accel = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.output_ratio_" + "during_accel"); + velocity_limit_based_planner_param_.vel_to_acc_weight = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.vel_to_acc_" + "weight"); + + velocity_limit_based_planner_param_.enable_jerk_limit_to_output_acc = + node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.enable_" + "jerk_limit_to_output_acc"); + + velocity_limit_based_planner_param_.disable_target_acceleration = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.disable_" + "target_acceleration"); + } + + { // velocity insertion based planner + // pid controller for acc + const double kp_acc = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.kp_acc"); + const double ki_acc = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.ki_acc"); + const double kd_acc = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.kd_acc"); + velocity_insertion_based_planner_param_.pid_acc_controller = + std::make_unique(kp_acc, ki_acc, kd_acc); + + // pid controller for jerk + const double kp_jerk = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.kp_jerk"); + const double ki_jerk = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.ki_jerk"); + const double kd_jerk = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.kd_jerk"); + velocity_insertion_based_planner_param_.pid_jerk_controller = + std::make_unique(kp_jerk, ki_jerk, kd_jerk); + + velocity_insertion_based_planner_param_.output_acc_ratio_during_accel = + node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.output_" + "acc_ratio_during_accel"); + velocity_insertion_based_planner_param_.output_jerk_ratio_during_accel = + node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.output_" + "jerk_ratio_during_accel"); + + velocity_insertion_based_planner_param_.enable_jerk_limit_to_output_acc = + node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.enable_" + "jerk_limit_to_output_acc"); + } + + min_cruise_target_vel_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.min_cruise_target_vel"); + time_to_evaluate_rss_ = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.time_to_evaluate_rss"); + const auto error_function_type = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.error_function_type"); + error_func_ = [&]() -> std::function { + if (error_function_type == "linear") { + return [](const double val) { return val; }; + } else if (error_function_type == "quadratic") { + return [](const double val) { return getSign(val) * std::pow(val, 2); }; + } + throw std::domain_error("error function type is not supported"); + }(); + + // low pass filter + const double lpf_normalized_error_cruise_dist_gain = node.declare_parameter( + "obstacle_cruise.cruise_planning.pid_based_planner.lpf_normalized_error_cruise_dist_gain"); + lpf_normalized_error_cruise_dist_ptr_ = + std::make_shared(lpf_normalized_error_cruise_dist_gain); + lpf_dist_to_obstacle_ptr_ = std::make_shared(0.5); + lpf_obstacle_vel_ptr_ = std::make_shared(0.5); + lpf_error_cruise_dist_ptr_ = std::make_shared(0.5); + lpf_output_vel_ptr_ = std::make_shared(0.5); + lpf_output_acc_ptr_ = std::make_shared(0.5); + lpf_output_jerk_ptr_ = std::make_shared(0.5); +} + +std::vector PIDBasedPlanner::plan_cruise( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & obstacles, std::shared_ptr debug_data_ptr, + std::unique_ptr & + planning_factor_interface, + std::optional & velocity_limit) +{ + cruise_planning_debug_info_.reset(); + + // calc obstacles to cruise + const auto cruise_obstacle_info = + calc_obstacle_to_cruise(stop_traj_points, planner_data, obstacles); + + // plan cruise + const auto cruise_traj_points = plan_cruise_trajectory( + planner_data, stop_traj_points, debug_data_ptr, planning_factor_interface, velocity_limit, + cruise_obstacle_info); + + prev_traj_points_ = cruise_traj_points; + return cruise_traj_points; +} + +std::optional PIDBasedPlanner::calc_obstacle_to_cruise( + const std::vector & stop_traj_points, + const std::shared_ptr planner_data, + const std::vector & obstacles) +{ + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::EGO_VELOCITY, + planner_data->current_odometry.twist.twist.linear.x); + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::EGO_ACCELERATION, + planner_data->current_acceleration.accel.accel.linear.x); + + auto modified_target_obstacles = obstacles; // TODO(murooka) what is this variable? + + // search highest probability obstacle for cruise + std::optional cruise_obstacle_info; + for (size_t o_idx = 0; o_idx < obstacles.size(); ++o_idx) { + const auto & obstacle = obstacles.at(o_idx); + + if (obstacle.collision_points.empty()) { + continue; + } + + // NOTE: from ego's front to obstacle's back + // TODO(murooka) this is not dist to obstacle + const double dist_to_obstacle = + calc_distance_to_collisionPoint( + stop_traj_points, planner_data, obstacle.collision_points.front().point) + + (obstacle.velocity - planner_data->current_odometry.twist.twist.linear.x) * + time_to_evaluate_rss_; + + // calculate distance between ego and obstacle based on RSS + const double target_dist_to_obstacle = calc_rss_distance( + planner_data->current_odometry.twist.twist.linear.x, obstacle.velocity, + cruise_planning_param_.safe_distance_margin); + + // calculate error distance and normalized one + const double error_cruise_dist = dist_to_obstacle - target_dist_to_obstacle; + if (cruise_obstacle_info) { + if (error_cruise_dist > cruise_obstacle_info->error_cruise_dist) { + continue; + } + } + cruise_obstacle_info = + CruiseObstacleInfo(obstacle, error_cruise_dist, dist_to_obstacle, target_dist_to_obstacle); + } + + if (!cruise_obstacle_info) { // if obstacle to cruise was not found + lpf_dist_to_obstacle_ptr_->reset(); + lpf_obstacle_vel_ptr_->reset(); + lpf_error_cruise_dist_ptr_->reset(); + return {}; + } + + // if obstacle to cruise was found + { // debug data + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_RELATIVE_EGO_VELOCITY, + planner_data->current_odometry.twist.twist.linear.x - + cruise_obstacle_info->obstacle.velocity); + const double non_zero_relative_vel = [&]() { + const double relative_vel = planner_data->current_odometry.twist.twist.linear.x - + cruise_obstacle_info->obstacle.velocity; + constexpr double epsilon = 0.001; + if (epsilon < std::abs(relative_vel)) { + return relative_vel; + } + return getSign(relative_vel) * epsilon; + }(); + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_TIME_TO_COLLISION, + cruise_obstacle_info->dist_to_obstacle / non_zero_relative_vel); + } + + { // dist to obstacle + const double raw_dist_to_obstacle = cruise_obstacle_info->dist_to_obstacle; + const double filtered_dist_to_obstacle = + lpf_dist_to_obstacle_ptr_->filter(cruise_obstacle_info->dist_to_obstacle); + + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_CURRENT_OBSTACLE_DISTANCE_RAW, raw_dist_to_obstacle); + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_CURRENT_OBSTACLE_DISTANCE_FILTERED, + filtered_dist_to_obstacle); + + cruise_obstacle_info->dist_to_obstacle = filtered_dist_to_obstacle; + } + + { // obstacle velocity + const double raw_obstacle_velocity = cruise_obstacle_info->obstacle.velocity; + const double filtered_obstacle_velocity = lpf_obstacle_vel_ptr_->filter(raw_obstacle_velocity); + + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_CURRENT_OBSTACLE_VELOCITY_RAW, raw_obstacle_velocity); + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_CURRENT_OBSTACLE_VELOCITY_FILTERED, + filtered_obstacle_velocity); + + cruise_obstacle_info->obstacle.velocity = filtered_obstacle_velocity; + } + + { // error distance for cruising + const double raw_error_cruise_dist = cruise_obstacle_info->error_cruise_dist; + const double filtered_error_cruise_dist = + lpf_error_cruise_dist_ptr_->filter(cruise_obstacle_info->error_cruise_dist); + + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_ERROR_DISTANCE_RAW, raw_error_cruise_dist); + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_ERROR_DISTANCE_FILTERED, filtered_error_cruise_dist); + + cruise_obstacle_info->error_cruise_dist = filtered_error_cruise_dist; + } + + { // target dist for cruising + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_TARGET_OBSTACLE_DISTANCE, + cruise_obstacle_info->target_dist_to_obstacle); + } + + return cruise_obstacle_info; +} + +std::vector PIDBasedPlanner::plan_cruise_trajectory( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, std::shared_ptr debug_data_ptr, + std::unique_ptr & + planning_factor_interface, + std::optional & velocity_limit, + const std::optional & cruise_obstacle_info) +{ + // do cruise + if (cruise_obstacle_info) { + RCLCPP_DEBUG(logger_, "cruise planning"); + + { // update debug marker + // virtual wall marker for cruise + const double error_cruise_dist = cruise_obstacle_info->error_cruise_dist; + const double dist_to_obstacle = cruise_obstacle_info->dist_to_obstacle; + const size_t ego_idx = + planner_data->find_index(stop_traj_points, planner_data->current_odometry.pose.pose); + const double abs_ego_offset = + planner_data->is_driving_forward + ? std::abs(planner_data->vehicle_info_.max_longitudinal_offset_m) + : std::abs(planner_data->vehicle_info_.min_longitudinal_offset_m); + const double dist_to_rss_wall = + std::min(error_cruise_dist + abs_ego_offset, dist_to_obstacle + abs_ego_offset); + const size_t wall_idx = + utils::get_index_with_longitudinal_offset(stop_traj_points, dist_to_rss_wall, ego_idx); + + const std::string wall_reason_string = cruise_obstacle_info->obstacle.is_yield_obstacle + ? "obstacle cruise (yield)" + : "obstacle cruise"; + auto markers = autoware::motion_utils::createSlowDownVirtualWallMarker( + stop_traj_points.at(wall_idx).pose, wall_reason_string, clock_->now(), 0); + // NOTE: use a different color from slow down one to visualize cruise and slow down + // separately. + markers.markers.front().color = + autoware::universe_utils::createMarkerColor(1.0, 0.6, 0.1, 0.5); + autoware::universe_utils::appendMarkerArray(markers, &debug_data_ptr->cruise_wall_marker); + + // cruise obstacle + debug_data_ptr->obstacles_to_cruise.push_back(cruise_obstacle_info->obstacle); + + planning_factor_interface->add( + stop_traj_points, planner_data->current_odometry.pose.pose, + stop_traj_points.at(wall_idx).pose, PlanningFactor::NONE, SafetyFactorArray{}); + } + + // do cruise planning + if (!use_velocity_limit_based_planner_) { + const auto cruise_traj = + plan_cruise_with_trajectory(planner_data, stop_traj_points, *cruise_obstacle_info); + return cruise_traj; + } + + velocity_limit = plan_cruise_with_velocity_limit(planner_data, *cruise_obstacle_info); + return stop_traj_points; + } + + // reset previous cruise data if adaptive cruise is not enabled + prev_target_acc_ = {}; + lpf_normalized_error_cruise_dist_ptr_->reset(); + lpf_output_acc_ptr_->reset(); + lpf_output_vel_ptr_->reset(); + lpf_output_jerk_ptr_->reset(); + + // delete marker + const auto markers = + autoware::motion_utils::createDeletedSlowDownVirtualWallMarker(clock_->now(), 0); + autoware::universe_utils::appendMarkerArray(markers, &debug_data_ptr->cruise_wall_marker); + + return stop_traj_points; +} + +VelocityLimit PIDBasedPlanner::plan_cruise_with_velocity_limit( + const std::shared_ptr planner_data, + const CruiseObstacleInfo & cruise_obstacle_info) +{ + const auto & p = velocity_limit_based_planner_param_; + + const double filtered_normalized_error_cruise_dist = [&]() { + const double normalized_error_cruise_dist = + cruise_obstacle_info.error_cruise_dist / cruise_obstacle_info.dist_to_obstacle; + return lpf_normalized_error_cruise_dist_ptr_->filter(normalized_error_cruise_dist); + }(); + + const double modified_error_cruise_dist = error_func_(filtered_normalized_error_cruise_dist); + + // calculate target velocity with acceleration limit by PID controller + const double pid_output_vel = p.pid_vel_controller->calc(modified_error_cruise_dist); + const double additional_vel = [&]() { + if (modified_error_cruise_dist > 0) { + return pid_output_vel * p.output_ratio_during_accel; + } + return pid_output_vel; + }(); + + const double positive_target_vel = lpf_output_vel_ptr_->filter(std::max( + min_cruise_target_vel_, planner_data->current_odometry.twist.twist.linear.x + additional_vel)); + + // calculate target acceleration + const double target_acc = [&]() { + if (p.disable_target_acceleration) { + return min_accel_during_cruise_; + } + + double target_acc = p.vel_to_acc_weight * additional_vel; + + // apply acc limit + target_acc = + std::clamp(target_acc, min_accel_during_cruise_, common_param_.max_accel); // apply acc limit + + if (!prev_target_acc_) { + return lpf_output_acc_ptr_->filter(target_acc); + } + + if (p.enable_jerk_limit_to_output_acc) { // apply jerk limit + const double jerk = (target_acc - *prev_target_acc_) / 0.1; // TODO(murooka) 0.1 + const double limited_jerk = std::clamp(jerk, common_param_.min_jerk, common_param_.max_jerk); + target_acc = *prev_target_acc_ + limited_jerk * 0.1; + } + + return lpf_output_acc_ptr_->filter(target_acc); + }(); + prev_target_acc_ = target_acc; + + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_TARGET_VELOCITY, positive_target_vel); + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_TARGET_ACCELERATION, target_acc); + + RCLCPP_DEBUG(logger_, "target_velocity %f", positive_target_vel); + + // set target longitudinal motion + const auto velocity_limit = create_velocity_limit_message( + clock_->now(), positive_target_vel, target_acc, common_param_.max_jerk, common_param_.min_jerk); + + return velocity_limit; +} + +std::vector PIDBasedPlanner::plan_cruise_with_trajectory( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const CruiseObstacleInfo & cruise_obstacle_info) +{ + const auto & p = velocity_insertion_based_planner_param_; + + const double filtered_normalized_error_cruise_dist = [&]() { + const double normalized_error_cruise_dist = + cruise_obstacle_info.error_cruise_dist / cruise_obstacle_info.dist_to_obstacle; + return lpf_normalized_error_cruise_dist_ptr_->filter(normalized_error_cruise_dist); + }(); + + const double modified_error_cruise_dist = error_func_(filtered_normalized_error_cruise_dist); + + // calculate target velocity with acceleration limit by PID controller + // calculate target acceleration + const double target_acc = [&]() { + double target_acc = p.pid_acc_controller->calc(modified_error_cruise_dist); + + if (0 < filtered_normalized_error_cruise_dist) { + target_acc *= p.output_acc_ratio_during_accel; + } + + target_acc = + std::clamp(target_acc, min_accel_during_cruise_, common_param_.max_accel); // apply acc limit + + if (!prev_target_acc_) { + return target_acc; + } + + if (p.enable_jerk_limit_to_output_acc) { + const double jerk = (target_acc - *prev_target_acc_) / 0.1; // TODO(murooka) 0.1 + const double limited_jerk = std::clamp(jerk, common_param_.min_jerk, common_param_.max_jerk); + target_acc = *prev_target_acc_ + limited_jerk * 0.1; + } + + return target_acc; + }(); + prev_target_acc_ = target_acc; + + const double target_jerk_ratio = [&]() { + double target_jerk_ratio = p.pid_jerk_controller->calc(modified_error_cruise_dist); + + if (0 < filtered_normalized_error_cruise_dist) { + target_jerk_ratio *= p.output_jerk_ratio_during_accel; + } + + target_jerk_ratio = std::clamp(std::abs(target_jerk_ratio), 0.0, 1.0); + return target_jerk_ratio; + }(); + + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_TARGET_ACCELERATION, target_acc); + cruise_planning_debug_info_.set( + CruisePlanningDebugInfo::TYPE::CRUISE_TARGET_JERK_RATIO, target_jerk_ratio); + + // set target longitudinal motion + const auto prev_traj_closest_point = [&]() -> TrajectoryPoint { + // if (smoothed_trajectory_ptr_) { + // return autoware::motion_utils::calcInterpolatedPoint( + // *smoothed_trajectory_ptr_, planner_data->current_odometry.pose.pose, + // nearest_dist_deviation_threshold_, nearest_yaw_deviation_threshold_); + // } + return autoware::motion_utils::calcInterpolatedPoint( + autoware::motion_utils::convertToTrajectory(prev_traj_points_), + planner_data->current_odometry.pose.pose, planner_data->ego_nearest_dist_threshold, + planner_data->ego_nearest_yaw_threshold); + }(); + const double v0 = prev_traj_closest_point.longitudinal_velocity_mps; + const double a0 = prev_traj_closest_point.acceleration_mps2; + + auto cruise_traj_points = get_acceleration_limited_trajectory( + stop_traj_points, planner_data->current_odometry.pose.pose, v0, a0, target_acc, + target_jerk_ratio, planner_data); + + const auto zero_vel_idx_opt = autoware::motion_utils::searchZeroVelocityIndex(cruise_traj_points); + if (!zero_vel_idx_opt) { + return cruise_traj_points; + } + + for (size_t i = zero_vel_idx_opt.value(); i < cruise_traj_points.size(); ++i) { + cruise_traj_points.at(i).longitudinal_velocity_mps = 0.0; + } + + return cruise_traj_points; +} + +std::vector PIDBasedPlanner::get_acceleration_limited_trajectory( + const std::vector & traj_points, const geometry_msgs::msg::Pose & start_pose, + const double v0, const double a0, const double target_acc, const double target_jerk_ratio, + const std::shared_ptr planner_data) const +{ + // calculate vt function + const auto vt = [&]( + const double v0, const double a0, const double jerk, const double t, + const double target_acc) { + const double t1 = (target_acc - a0) / jerk; + + const double v = [&]() { + if (t < t1) { + return v0 + a0 * t + jerk * t * t / 2.0; + } + + const double v1 = v0 + a0 * t1 + jerk * t1 * t1 / 2.0; + return v1 + target_acc * (t - t1); + }(); + + constexpr double max_vel = 100.0; + return std::clamp(v, 0.0, max_vel); + }; + + // calculate sv graph + const double s_traj = autoware::motion_utils::calcArcLength(traj_points); + // const double t_max = 10.0; + const double s_max = 50.0; + const double max_sampling_num = 100.0; + + const double t_delta_min = 0.1; + const double s_delta_min = 0.1; + + // NOTE: v0 of motion_velocity_planner_common may be smaller than v0 of motion_velocity_smoother + // Therefore, we calculate v1 (velocity at next step) and use it for initial velocity. + const double v1 = v0; // + 0.1; // a0 * 0.1; // + jerk * 0.1 * 0.1 / 2.0; + const double a1 = a0; // + jerk * 0.1; + const double jerk = target_acc > a1 ? common_param_.max_jerk * target_jerk_ratio + : common_param_.min_jerk * target_jerk_ratio; + + double t_current = 0.0; + std::vector s_vec{0.0}; + std::vector v_vec{v1}; + for (double tmp_idx = 0.0; tmp_idx < max_sampling_num; ++tmp_idx) { + if (v_vec.back() <= 0.0) { + s_vec.push_back(s_vec.back() + s_delta_min); + v_vec.push_back(0.0); + } else { + const double v_current = vt( + v1, a1, jerk, t_current + t_delta_min, + target_acc); // TODO(murooka) + t_delta_min is not required + + const double s_delta = std::max(s_delta_min, v_current * t_delta_min); + const double s_current = s_vec.back() + s_delta; + + s_vec.push_back(s_current); + v_vec.push_back(v_current); + + const double t_delta = [&]() { + if (v_current <= 0) { + return 0.0; + } + + constexpr double t_delta_max = 100.0; // NOTE: to avoid computation explosion + return std::min(t_delta_max, s_delta / v_current); + }(); + + t_current += t_delta; + } + + if (s_traj < s_vec.back() /*|| t_max < t_current*/ || s_max < s_vec.back()) { + break; + } + } + + std::vector unique_s_vec{s_vec.front()}; + std::vector unique_v_vec{v_vec.front()}; + for (size_t i = 0; i < s_vec.size(); ++i) { + if (s_vec.at(i) == unique_s_vec.back()) { + continue; + } + + unique_s_vec.push_back(s_vec.at(i)); + unique_v_vec.push_back(v_vec.at(i)); + } + + if (unique_s_vec.size() < 2) { + return traj_points; + } + + auto acc_limited_traj_points = traj_points; + const size_t ego_seg_idx = planner_data->find_index(acc_limited_traj_points, start_pose); + double sum_dist = 0.0; + for (size_t i = ego_seg_idx; i < acc_limited_traj_points.size(); ++i) { + if (i != ego_seg_idx) { + sum_dist += autoware::universe_utils::calcDistance2d( + acc_limited_traj_points.at(i - 1), acc_limited_traj_points.at(i)); + } + + const double vel = [&]() { + if (unique_s_vec.back() < sum_dist) { + return unique_v_vec.back(); + } + return autoware::interpolation::spline(unique_s_vec, unique_v_vec, {sum_dist}).front(); + }(); + + acc_limited_traj_points.at(i).longitudinal_velocity_mps = std::clamp( + vel, 0.0, + static_cast( + acc_limited_traj_points.at(i) + .longitudinal_velocity_mps)); // TODO(murooka) this assumes forward driving + } + + return acc_limited_traj_points; +} + +void PIDBasedPlanner::update_parameters(const std::vector & parameters) +{ + autoware::universe_utils::updateParam( + parameters, "obstacle_cruise.cruise_planning.pid_based_planner.min_accel_during_cruise", + min_accel_during_cruise_); + + { // velocity limit based planner + auto & p = velocity_limit_based_planner_param_; + + double kp = p.pid_vel_controller->getKp(); + double ki = p.pid_vel_controller->getKi(); + double kd = p.pid_vel_controller->getKd(); + + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.kp", kp); + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.ki", ki); + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.kd", kd); + p.pid_vel_controller->updateParam(kp, ki, kd); + + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.output_ratio_" + "during_accel", + p.output_ratio_during_accel); + autoware::universe_utils::updateParam( + parameters, "obstacle_cruise.cruise_planning.pid_based_planner.vel_to_acc_weight", + p.vel_to_acc_weight); + + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.enable_jerk_" + "limit_to_output_acc", + p.enable_jerk_limit_to_output_acc); + + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_limit_based_planner.disable_" + "target_acceleration", + p.disable_target_acceleration); + } + + { // velocity insertion based planner + auto & p = velocity_insertion_based_planner_param_; + + // pid controller for acc + double kp_acc = p.pid_acc_controller->getKp(); + double ki_acc = p.pid_acc_controller->getKi(); + double kd_acc = p.pid_acc_controller->getKd(); + + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.kp_acc", + kp_acc); + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.ki_acc", + ki_acc); + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.kd_acc", + kd_acc); + p.pid_acc_controller->updateParam(kp_acc, ki_acc, kd_acc); + + // pid controller for jerk + double kp_jerk = p.pid_jerk_controller->getKp(); + double ki_jerk = p.pid_jerk_controller->getKi(); + double kd_jerk = p.pid_jerk_controller->getKd(); + + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.kp_jerk", + kp_jerk); + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.ki_jerk", + ki_jerk); + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.kd_jerk", + kd_jerk); + p.pid_jerk_controller->updateParam(kp_jerk, ki_jerk, kd_jerk); + + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.output_" + "acc_ratio_during_accel", + p.output_acc_ratio_during_accel); + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.output_" + "jerk_ratio_during_accel", + p.output_jerk_ratio_during_accel); + + autoware::universe_utils::updateParam( + parameters, + "obstacle_cruise.cruise_planning.pid_based_planner.velocity_insertion_based_planner.enable_" + "jerk_limit_to_output_acc", + p.enable_jerk_limit_to_output_acc); + } + + // min_cruise_target_vel + autoware::universe_utils::updateParam( + parameters, "obstacle_cruise.cruise_planning.pid_based_planner.min_cruise_target_vel", + min_cruise_target_vel_); + autoware::universe_utils::updateParam( + parameters, "obstacle_cruise.cruise_planning.pid_based_planner.time_to_evaluate_rss", + time_to_evaluate_rss_); +} +} // namespace autoware::motion_velocity_planner diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_based_planner.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_based_planner.hpp new file mode 100644 index 0000000000000..54836bde8d96f --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_based_planner.hpp @@ -0,0 +1,158 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef PID_BASED_PLANNER__PID_BASED_PLANNER_HPP_ +#define PID_BASED_PLANNER__PID_BASED_PLANNER_HPP_ + +#include "../cruise_planner_interface.hpp" +#include "../type_alias.hpp" +#include "../types.hpp" +#include "autoware/signal_processing/lowpass_filter_1d.hpp" +#include "cruise_planning_debug_info.hpp" +#include "pid_controller.hpp" + +#include "visualization_msgs/msg/marker_array.hpp" + +#include +#include +#include + +using autoware::signal_processing::LowpassFilter1d; + +namespace autoware::motion_velocity_planner +{ + +class PIDBasedPlanner : public CruisePlannerInterface +{ +public: + struct CruiseObstacleInfo + { + CruiseObstacleInfo( + const CruiseObstacle & obstacle_arg, const double error_cruise_dist_arg, + const double dist_to_obstacle_arg, const double target_dist_to_obstacle_arg) + : obstacle(obstacle_arg), + error_cruise_dist(error_cruise_dist_arg), + dist_to_obstacle(dist_to_obstacle_arg), + target_dist_to_obstacle(target_dist_to_obstacle_arg) + { + } + + CruiseObstacle obstacle; + double error_cruise_dist; + double dist_to_obstacle; + double target_dist_to_obstacle; + }; + + PIDBasedPlanner( + rclcpp::Node & node, const CommonParam & common_param, + const CruisePlanningParam & cruise_planning_param); + + std::vector plan_cruise( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const std::vector & obstacles, std::shared_ptr debug_data_ptr, + std::unique_ptr & + planning_factor_interface, + std::optional & velocity_limit) override; + + void update_parameters(const std::vector & parameters) override; + +private: + Float32MultiArrayStamped get_cruise_planning_debug_message( + const rclcpp::Time & current_time) const override + { + return cruise_planning_debug_info_.convert_to_message(current_time); + } + + std::optional calc_obstacle_to_cruise( + const std::vector & stop_traj_points, + const std::shared_ptr planner_data, + const std::vector & obstacles); + + std::vector plan_cruise_trajectory( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + std::shared_ptr debug_data_ptr, + std::unique_ptr & + planning_factor_interface, + std::optional & velocity_limit, + const std::optional & cruise_obstacle_info); + + // velocity limit based planner + VelocityLimit plan_cruise_with_velocity_limit( + const std::shared_ptr planner_data, + const CruiseObstacleInfo & cruise_obstacle_info); + + // velocity insertion based planner + std::vector plan_cruise_with_trajectory( + const std::shared_ptr planner_data, + const std::vector & stop_traj_points, + const CruiseObstacleInfo & cruise_obstacle_info); + std::vector get_acceleration_limited_trajectory( + const std::vector & traj_points, const geometry_msgs::msg::Pose & start_pose, + const double v0, const double a0, const double target_acc, const double target_jerk_ratio, + const std::shared_ptr planner_data) const; + + // ROS parameters + double min_accel_during_cruise_; + double min_cruise_target_vel_; + + CruisePlanningDebugInfo cruise_planning_debug_info_; + + struct VelocityLimitBasedPlannerParam + { + std::unique_ptr pid_vel_controller; + double output_ratio_during_accel; + double vel_to_acc_weight; + bool enable_jerk_limit_to_output_acc{false}; + bool disable_target_acceleration{false}; + }; + VelocityLimitBasedPlannerParam velocity_limit_based_planner_param_; + + struct VelocityInsertionBasedPlannerParam + { + std::unique_ptr pid_acc_controller; + std::unique_ptr pid_jerk_controller; + double output_acc_ratio_during_accel; + double output_jerk_ratio_during_accel; + bool enable_jerk_limit_to_output_acc{false}; + }; + VelocityInsertionBasedPlannerParam velocity_insertion_based_planner_param_; + + std::optional prev_target_acc_; + + // lpf for nodes's input + std::shared_ptr lpf_dist_to_obstacle_ptr_; + std::shared_ptr lpf_error_cruise_dist_ptr_; + std::shared_ptr lpf_obstacle_vel_ptr_; + + // lpf for planner's input + std::shared_ptr lpf_normalized_error_cruise_dist_ptr_; + + // lpf for output + std::shared_ptr lpf_output_vel_ptr_; + std::shared_ptr lpf_output_acc_ptr_; + std::shared_ptr lpf_output_jerk_ptr_; + + std::vector prev_traj_points_; + + bool use_velocity_limit_based_planner_{true}; + + double time_to_evaluate_rss_; + + std::function error_func_; +}; +} // namespace autoware::motion_velocity_planner + +#endif // PID_BASED_PLANNER__PID_BASED_PLANNER_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_controller.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_controller.hpp new file mode 100644 index 0000000000000..adcae7784103d --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/pid_based_planner/pid_controller.hpp @@ -0,0 +1,65 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef PID_BASED_PLANNER__PID_CONTROLLER_HPP_ +#define PID_BASED_PLANNER__PID_CONTROLLER_HPP_ + +#include + +namespace autoware::motion_velocity_planner +{ +class PIDController +{ +public: + PIDController(const double kp, const double ki, const double kd) + : kp_(kp), ki_(ki), kd_(kd), error_sum_(0.0) + { + } + + double calc(const double error) + { + error_sum_ += error; + + // TODO(murooka) use time for d gain calculation + const double output = + kp_ * error + ki_ * error_sum_ + (prev_error_ ? kd_ * (error - *prev_error_) : 0.0); + prev_error_ = error; + return output; + } + + double getKp() const { return kp_; } + double getKi() const { return ki_; } + double getKd() const { return kd_; } + + void updateParam(const double kp, const double ki, const double kd) + { + kp_ = kp; + ki_ = ki; + kd_ = kd; + + error_sum_ = 0.0; + prev_error_ = {}; + } + +private: + double kp_; + double ki_; + double kd_; + + double error_sum_; + std::optional prev_error_; +}; +} // namespace autoware::motion_velocity_planner + +#endif // PID_BASED_PLANNER__PID_CONTROLLER_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/type_alias.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/type_alias.hpp new file mode 100644 index 0000000000000..673574c24a914 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/type_alias.hpp @@ -0,0 +1,70 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TYPE_ALIAS_HPP_ +#define TYPE_ALIAS_HPP_ + +#include "autoware_vehicle_info_utils/vehicle_info_utils.hpp" + +#include "autoware_internal_debug_msgs/msg/float32_multi_array_stamped.hpp" +#include "autoware_internal_debug_msgs/msg/float32_stamped.hpp" +#include "autoware_internal_debug_msgs/msg/float64_stamped.hpp" +#include "autoware_perception_msgs/msg/predicted_object.hpp" +#include "autoware_perception_msgs/msg/predicted_objects.hpp" +#include "autoware_planning_msgs/msg/trajectory.hpp" +#include "geometry_msgs/msg/twist.hpp" +#include "nav_msgs/msg/odometry.hpp" +#include "sensor_msgs/msg/point_cloud2.hpp" +#include "tier4_planning_msgs/msg/velocity_limit.hpp" +#include "tier4_planning_msgs/msg/velocity_limit_clear_command.hpp" +#include "visualization_msgs/msg/marker_array.hpp" +#include +#include +#include +#include + +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware::vehicle_info_utils::VehicleInfo; +using autoware_internal_debug_msgs::msg::Float32MultiArrayStamped; +using autoware_internal_debug_msgs::msg::Float32Stamped; +using autoware_internal_debug_msgs::msg::Float64Stamped; +using autoware_perception_msgs::msg::ObjectClassification; +using autoware_perception_msgs::msg::PredictedObject; +using autoware_perception_msgs::msg::PredictedObjects; +using autoware_perception_msgs::msg::PredictedPath; +using autoware_perception_msgs::msg::Shape; +using autoware_planning_msgs::msg::Trajectory; +using autoware_planning_msgs::msg::TrajectoryPoint; +using geometry_msgs::msg::Twist; +using nav_msgs::msg::Odometry; +using sensor_msgs::msg::PointCloud2; +using tier4_planning_msgs::msg::VelocityLimit; +using tier4_planning_msgs::msg::VelocityLimitClearCommand; +using visualization_msgs::msg::Marker; +using visualization_msgs::msg::MarkerArray; +namespace bg = boost::geometry; +using autoware::universe_utils::Point2d; +using autoware::universe_utils::Polygon2d; +using Metric = tier4_metric_msgs::msg::Metric; +using MetricArray = tier4_metric_msgs::msg::MetricArray; +using PointCloud = pcl::PointCloud; +using tier4_planning_msgs::msg::PlanningFactor; +using tier4_planning_msgs::msg::SafetyFactorArray; +} // namespace autoware::motion_velocity_planner + +#endif // TYPE_ALIAS_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/types.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/types.hpp new file mode 100644 index 0000000000000..7f4fcfc7e3bb1 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_cruise_module/src/types.hpp @@ -0,0 +1,67 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TYPES_HPP_ +#define TYPES_HPP_ + +#include "autoware/motion_velocity_planner_common_universe/planner_data.hpp" +#include "autoware/motion_velocity_planner_common_universe/polygon_utils.hpp" +#include "type_alias.hpp" + +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +struct CruiseObstacle +{ + CruiseObstacle( + const std::string & arg_uuid, const rclcpp::Time & arg_stamp, + const geometry_msgs::msg::Pose & arg_pose, const double arg_lon_velocity, + const double arg_lat_velocity, + const std::vector & arg_collision_points, + bool arg_is_yield_obstacle = false) + : uuid(arg_uuid), + stamp(arg_stamp), + pose(arg_pose), + velocity(arg_lon_velocity), + lat_velocity(arg_lat_velocity), + collision_points(arg_collision_points), + is_yield_obstacle(arg_is_yield_obstacle) + { + } + std::string uuid{}; + rclcpp::Time stamp{}; + geometry_msgs::msg::Pose pose{}; // interpolated with the current stamp + double velocity{}; // longitudinal velocity against ego's trajectory + double lat_velocity{}; // lateral velocity against ego's trajectory + + std::vector collision_points{}; // time-series collision points + bool is_yield_obstacle{}; +}; + +struct DebugData +{ + DebugData() = default; + std::vector> intentionally_ignored_obstacles{}; + std::vector obstacles_to_cruise{}; + std::vector decimated_traj_polys{}; + MarkerArray cruise_wall_marker{}; +}; + +} // namespace autoware::motion_velocity_planner + +#endif // TYPES_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/CMakeLists.txt b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/CMakeLists.txt new file mode 100644 index 0000000000000..d74b292785fa6 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.14) +project(autoware_motion_velocity_obstacle_slow_down_module) + +find_package(autoware_cmake REQUIRED) +autoware_package() +pluginlib_export_plugin_description_file(autoware_motion_velocity_planner_node_universe plugins.xml) + +ament_auto_add_library(${PROJECT_NAME} SHARED + DIRECTORY src +) + +ament_auto_package(INSTALL_TO_SHARE config) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/README.md b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/README.md new file mode 100644 index 0000000000000..25c15b59075c1 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/README.md @@ -0,0 +1,52 @@ +# Obstacle Slow Down + +## Role + +The `obstacle_slow_down` module does the slow down planning when there is a static/dynamic obstacle near the trajectory. + +## Activation + +This module is activated if the launch parameter `launch_obstacle_slow_down_module` is set to true. + +## Inner-workings / Algorithms + +### Obstacle Filtering + +Among obstacles which are not for cruising and stopping, the obstacles meeting the following condition are determined as obstacles for slowing down. + +- The object type is for slowing down according to `obstacle_filtering.object_type.*`. +- The lateral distance from the object to the ego's trajectory is smaller than `obstacle_filtering.max_lat_margin`. + +### Slow Down Planning + +The role of the slow down planning is inserting slow down velocity in the trajectory where the trajectory points are close to the obstacles. The parameters can be customized depending on the obstacle type, making it possible to adjust the slow down behavior depending if the obstacle is a pedestrian, bicycle, car, etc. Each obstacle type has a `static` and a `moving` parameter set, so it is possible to customize the slow down response of the ego vehicle according to the obstacle type and if it is moving or not. If an obstacle is determined to be moving, the corresponding `moving` set of parameters will be used to compute the vehicle slow down, otherwise, the `static` parameters will be used. The `static` and `moving` separation is useful for customizing the ego vehicle slow down behavior to, for example, slow down more significantly when passing stopped vehicles that might cause occlusion or that might suddenly open its doors. + +An obstacle is classified as `static` if its total speed is less than the `moving_object_speed_threshold` parameter. Furthermore, a hysteresis based approach is used to avoid chattering, it uses the `moving_object_hysteresis_range` parameter range and the obstacle's previous state (`moving` or `static`) to determine if the obstacle is moving or not. In other words, if an obstacle was previously classified as `static`, it will not change its classification to `moving` unless its total speed is greater than `moving_object_speed_threshold` + `moving_object_hysteresis_range`. Likewise, an obstacle previously classified as `moving`, will only change to `static` if its speed is lower than `moving_object_speed_threshold` - `moving_object_hysteresis_range`. + +The closest point on the obstacle to the ego's trajectory is calculated. +Then, the slow down velocity is calculated by linear interpolation with the distance between the point and trajectory as follows. + +![slow_down_velocity_calculation](./docs/slow_down_velocity_calculation.svg) + +| Variable | Description | +| ---------- | ----------------------------------- | +| `v_{out}` | calculated velocity for slow down | +| `v_{min}` | `min_lat_velocity` | +| `v_{max}` | `max_lat_velocity` | +| `l_{min}` | `min_lat_margin` | +| `l_{max}` | `max_lat_margin` | +| `l'_{max}` | `obstacle_filtering.max_lat_margin` | + +The calculated velocity is inserted in the trajectory where the obstacle is inside the area with `obstacle_filtering.max_lat_margin`. + +![slow_down_planning](./docs/slow_down_planning.drawio.svg) + +## Debugging + +### Obstacle for slow down + +Yellow sphere which is an obstacle for slow_down is visualized by `obstacles_to_slow_down` in the `~/debug/marker` topic. + +Yellow wall which means a safe distance to slow_down if the ego's front meets the wall is visualized in the `~/debug/slow_down/virtual_wall` topic. + +![slow_down_visualization](./docs/slow_down_visualization.png) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/config/obstacle_slow_down.param.yaml b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/config/obstacle_slow_down.param.yaml new file mode 100644 index 0000000000000..f826e4ccd6618 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/config/obstacle_slow_down.param.yaml @@ -0,0 +1,50 @@ +/**: + ros__parameters: + obstacle_slow_down: + slow_down_planning: + slow_down_min_acc: -1.0 # slow down min deceleration [m/ss] + slow_down_min_jerk: -1.0 # slow down min jerk [m/sss] + + lpf_gain_slow_down_vel: 0.99 # low-pass filter gain for slow down velocity + lpf_gain_lat_dist: 0.999 # low-pass filter gain for lateral distance from obstacle to ego's path + lpf_gain_dist_to_slow_down: 0.7 # low-pass filter gain for distance to slow down start + + time_margin_on_target_velocity: 1.5 # [s] + + # parameters to calculate slow down velocity by linear interpolation + object_type_specified_params: + types: + - "default" + default: + moving: + min_lat_margin: 0.2 + max_lat_margin: 1.0 + min_ego_velocity: 2.0 + max_ego_velocity: 8.0 + static: + min_lat_margin: 0.2 + max_lat_margin: 1.0 + min_ego_velocity: 4.0 + max_ego_velocity: 8.0 + + moving_object_speed_threshold: 0.5 # [m/s] how fast the object needs to move to be considered as "moving" + moving_object_hysteresis_range: 0.1 # [m/s] hysteresis range used to prevent chattering when obstacle moves close to moving_object_speed_threshold + + obstacle_filtering: + object_type: + unknown: false + car: true + truck: true + bus: true + trailer: true + motorcycle: true + bicycle: true + pedestrian: true + pointcloud: false + + min_lat_margin: 0.0 # lateral margin between obstacle and trajectory band with ego's width to avoid the conflict with the obstacle_stop + max_lat_margin: 1.1 # lateral margin between obstacle and trajectory band with ego's width + lat_hysteresis_margin: 0.2 + + successive_num_to_entry_slow_down_condition: 5 + successive_num_to_exit_slow_down_condition: 5 diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_planning.drawio.svg b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_planning.drawio.svg new file mode 100644 index 0000000000000..603e6b37a653f --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_planning.drawio.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + +
    +
    +
    + ego +
    +
    +
    +
    + ego +
    +
    + + + + +
    +
    +
    + obstacle +
    +
    +
    +
    + obstacle +
    +
    + + + + + +
    +
    +
    + obstacle +
    +
    +
    +
    + obstacle +
    +
    + + + + + + + + + +
    +
    +
    + trajectory velocity +
    +
    +
    +
    + trajecto... +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + max_slow_down_lat_margin +
    +
    +
    +
    + max_slow_d... +
    +
    +
    + + + + Text is not SVG - cannot display + + +
    diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_velocity_calculation.svg b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_velocity_calculation.svg new file mode 100644 index 0000000000000..ee53e6e60a0c0 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_velocity_calculation.svg @@ -0,0 +1,534 @@ + + + + + + + + + + + +
    +
    +
    + obstacle +
    +
    +
    +
    + obstacle +
    +
    + + + + + + + + + + + + + + + + + + + +
    +
    +
    + slow down +
    + velocity +
    +
    +
    +
    + slow down... +
    +
    + + + + +
    +
    +
    + lateral distance +
    +
    +
    +
    + lateral distance +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + `v_{max}` +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + `v_{min}` +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + `l_{min}` +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + `l_{max}` +
    +
    + + + + +
    +
    +
    + ego +
    +
    +
    +
    + ego +
    +
    + + + + +
    +
    +
    + linear interpolation of slow down velocity +
    +
    +
    +
    + linear interpolation of slow down velocity +
    +
    + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + `v_{out}` +
    +
    + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + `l_{max}... +
    +
    +
    + + + + Text is not SVG - cannot display + + +
    diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_visualization.png b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/docs/slow_down_visualization.png new file mode 100644 index 0000000000000000000000000000000000000000..472b3bb6c982aa71888c24ecde2fa73dd1896384 GIT binary patch literal 88932 zcmYhi1yq#L_C8Dw2t#+LhzQc13IYm>bV^8f44ooUQXZCc(kMA$zQ;riX(=aD{_|8%+!X{>6P! z(H{7X0P^s$0WmN_iS6QmzccwhGV#^-bnp$Z@v+Bo^zd}I7lPRO*xP$RoIHK^@H>@& z9};&qF!5FOvA6Mc_VnO1aCX0$2?s|^L`;0W<*SIqMqZq#%tmGjr}KmEr)F%;HUU@g~5wJ zGemgLX}qUF9-rfIb90YdWn^T$lEI;+3d#@^78aM6pTGGqPC<+?0{HI(6U&IpV@r+) zYQT6l@Z$%`#KgplJ#%w&TOXf;4?4Ve9&{A~Kh8Se;5r=~MnILSAAlNR+t}C$4g=rp zuoS5Se3|@or-S=IP_Gge7k9++-%Ry#N0+CKeV3t*|%+$iMk6yRqAj%JW;| zz`isKzxnUv%!NH#%dTr{TiD_OP9_=aellrrdE)Xot;fYA65l} zxmJ1>l3Wc&9P8jTi-bhZlA_=;5f;UgmZ)|E9Iptr!` zSpca^pmfv@;xdmg8QFrIA3`xApee#xn1N&&~~PrM!dSd zqDZ+6y*adO&fy*I(f8}?_70AYlE5sW5gYR`8_)W^^Yin&g-;5;r*>IMr?7wujuzm3 zdsn)LQydMjpuKCH>vkCe?Teqv^1HEoz>TMrPwrxqJVT47HGp}6QK^8>zjYPs%9RJXR@OV2Kr0+e4 z-~+lrUM3p>DD^J~VD_mhC=`A0Q~30p(MQ{n8?&`h(-PTvY~I;BzIVB(FWg(%CZ~-gV-fBgT3WdJm6kJJ65f2ZAuKL6H!NBbCl~?~YsjSk{QotT%OFKxf z+IkD$V~np8`&g{LH#;H1E&*LyTKFd)F()%Rz|Ny~NAl%|hKI{nfIEHWTEEw2WaWOi zqZ7t(ah9OmYjtrqKH_o|C+>bYI0S8r-q8wak~bB;m6s$!DTe~>Mn~pPMw$WA=Dw@| z)B><|u|FA^nJqr+Phcrrz$uD>U68vFM&iUruvy77g2r!y6@LEj6E|<~+G!2S8#Uk`CD3AakkktC(Nx;P%2#x`lL?!#PAREvZsA*(=6V}}W*^?3X z>c%Pt{<;XAjREGwWcTyu&vvEPaRd6I;^L4$Vfy;|F2_4Ocjzx3MetOA5H|-kuDC7< z?G;;I8Ib*0fVbb~&SBxdIXEyV0=#lP?+}JxqSRh1OK+SY*b_W8Mim)BIqo!_i;fb~ zz{b~p-RxR{)C_XUA@U5mi-HB8rNa zD#wVqIcDL`3!ju{w^NE7#jm~@fjT&h@lIR~t+iZ@tQ{F;oFMpgH>c74id0oAAOwzL z(c)7w-494s_BXJM?VSUGX4Hxc+{lm^ zHMZdvMKI%xC$#(D#pVO9_{%?EUQ97OG^8-L+1k-D^82?z$}`@S)%d8+GNyC3GbM^Q zku}o-;2f5~jBb@1g%6Typbw3U1J|{*wA_S|weM^Vv&QE?(}*G{Ot-yr%%I)-NOhZl zK^u>tK#n6vKjg;|G6P0_Zn2pgHwDUWJOhqoI$gicUe=o=yM2ds_k9$i7AMQRlnv(u z!YD%w!KX0i{@el>`z360r4q17U|ibU+eaH)g*9x2xw^V)KYLc!(GmWm?0r9atqXBW z=tSn}ZXM6Jg(~t;P!BxZm2PT5g(~%`p}BeHUx+XSgf}!YQgIFhuaV-8Jam9t%2@J6 zjmQ`_JJysXPlWQ{Z5DKtl-vdaq#qD|J&(@+qX?sUk)FqdUPUQqZOI}cE-{fGx;mMJ z$^W8$sEh%tPz9aSGccH%nEbi%0Dwj?8W|e{q2O<@m1{lBEDYO2Ll|*Vr&tbAki63o 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 + + + autoware_motion_velocity_obstacle_slow_down_module + 0.40.0 + obstacle slow down feature in motion_velocity_planner + + Takayuki Murooka + Yuki Takagi + Maxime Clement + + Apache License 2.0 + + ament_cmake_auto + autoware_cmake + autoware_motion_utils + autoware_motion_velocity_planner_common_universe + autoware_perception_msgs + autoware_planning_msgs + autoware_route_handler + autoware_signal_processing + autoware_universe_utils + autoware_vehicle_info_utils + geometry_msgs + libboost-dev + pluginlib + rclcpp + tf2 + tier4_metric_msgs + tier4_planning_msgs + visualization_msgs + + ament_cmake_ros + ament_lint_auto + autoware_lint_common + + + ament_cmake + + diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/plugins.xml b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/plugins.xml new file mode 100644 index 0000000000000..0cfaadbfc9796 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/plugins.xml @@ -0,0 +1,3 @@ + + + diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/metrics_manager.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/metrics_manager.hpp new file mode 100644 index 0000000000000..11554121a0882 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/metrics_manager.hpp @@ -0,0 +1,60 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef METRICS_MANAGER_HPP_ +#define METRICS_MANAGER_HPP_ + +#include "type_alias.hpp" +#include "types.hpp" + +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +class MetricsManager +{ +public: + void init() { metrics_.clear(); } + + void calculate_metrics(const std::string & module_name, const std::string & reason) + { + // Create status + { + // Decision + Metric decision_metric; + decision_metric.name = module_name + "/decision"; + decision_metric.unit = "string"; + decision_metric.value = reason; + metrics_.push_back(decision_metric); + } + } + + MetricArray create_metric_array(const rclcpp::Time & current_time) + { + MetricArray metrics_msg; + metrics_msg.stamp = current_time; + metrics_msg.metric_array.insert( + metrics_msg.metric_array.end(), metrics_.begin(), metrics_.end()); + return metrics_msg; + } + +private: + std::vector metrics_; +}; + +} // namespace autoware::motion_velocity_planner + +#endif // METRICS_MANAGER_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/obstacle_slow_down_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/obstacle_slow_down_module.cpp new file mode 100644 index 0000000000000..286c10c0c20d1 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/obstacle_slow_down_module.cpp @@ -0,0 +1,907 @@ +// Copyright 2025 TIER IV, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "obstacle_slow_down_module.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware::universe_utils::getOrDeclareParameter; + +namespace +{ +bool is_lower_considering_hysteresis( + const double current_val, const bool was_low, const double high_val, const double low_val) +{ + if (was_low) { + if (high_val < current_val) { + return false; + } + return true; + } + if (current_val < low_val) { + return true; + } + return false; +} + +geometry_msgs::msg::Point to_geom_point(const autoware::universe_utils::Point2d & point) +{ + geometry_msgs::msg::Point geom_point; + geom_point.x = point.x(); + geom_point.y = point.y(); + return geom_point; +} + +template +std::optional get_object_from_uuid( + const std::vector & objects, const std::string & target_uuid) +{ + const auto itr = std::find_if(objects.begin(), objects.end(), [&](const auto & object) { + return object.uuid == target_uuid; + }); + + if (itr == objects.end()) { + return std::nullopt; + } + return *itr; +} + +// TODO(murooka) following two functions are copied from behavior_velocity_planner. +// These should be refactored. +double find_reach_time( + const double jerk, const double accel, const double velocity, const double distance, + const double t_min, const double t_max) +{ + const double j = jerk; + const double a = accel; + const double v = velocity; + const double d = distance; + const double min = t_min; + const double max = t_max; + auto f = [](const double t, const double j, const double a, const double v, const double d) { + return j * t * t * t / 6.0 + a * t * t / 2.0 + v * t - d; + }; + if (f(min, j, a, v, d) > 0 || f(max, j, a, v, d) < 0) { + throw std::logic_error( + "[motion_velocity_planner_common](find_reach_time): search range is invalid"); + } + const double eps = 1e-5; + const int warn_iter = 100; + double lower = min; + double upper = max; + double t; + int iter = 0; + for (int i = 0;; i++) { + t = 0.5 * (lower + upper); + const double fx = f(t, j, a, v, d); + // std::cout<<"fx: "< 0.0) { + upper = t; + } else { + lower = t; + } + iter++; + if (iter > warn_iter) + std::cerr << "[motion_velocity_planner_common](find_reach_time): current iter is over warning" + << std::endl; + } + return t; +} + +double calc_deceleration_velocity_from_distance_to_target( + const double max_slowdown_jerk, const double max_slowdown_accel, const double current_accel, + const double current_velocity, const double distance_to_target) +{ + if (max_slowdown_jerk > 0 || max_slowdown_accel > 0) { + throw std::logic_error("max_slowdown_jerk and max_slowdown_accel should be negative"); + } + // case0: distance to target is behind ego + if (distance_to_target <= 0) return current_velocity; + auto ft = [](const double t, const double j, const double a, const double v, const double d) { + return j * t * t * t / 6.0 + a * t * t / 2.0 + v * t - d; + }; + auto vt = [](const double t, const double j, const double a, const double v) { + return j * t * t / 2.0 + a * t + v; + }; + const double j_max = max_slowdown_jerk; + const double a0 = current_accel; + const double a_max = max_slowdown_accel; + const double v0 = current_velocity; + const double l = distance_to_target; + const double t_const_jerk = (a_max - a0) / j_max; + const double d_const_jerk_stop = ft(t_const_jerk, j_max, a0, v0, 0.0); + const double d_const_acc_stop = l - d_const_jerk_stop; + + if (d_const_acc_stop < 0) { + // case0: distance to target is within constant jerk deceleration + // use binary search instead of solving cubic equation + const double t_jerk = find_reach_time(j_max, a0, v0, l, 0, t_const_jerk); + const double velocity = vt(t_jerk, j_max, a0, v0); + return velocity; + } else { + const double v1 = vt(t_const_jerk, j_max, a0, v0); + const double discriminant_of_stop = 2.0 * a_max * d_const_acc_stop + v1 * v1; + // case3: distance to target is farther than distance to stop + if (discriminant_of_stop <= 0) { + return 0.0; + } + // case2: distance to target is within constant accel deceleration + // solve d = 0.5*a^2+v*t by t + const double t_acc = (-v1 + std::sqrt(discriminant_of_stop)) / a_max; + return vt(t_acc, 0.0, a_max, v1); + } + return current_velocity; +} + +VelocityLimitClearCommand create_velocity_limit_clear_command( + const rclcpp::Time & current_time, [[maybe_unused]] const std::string & module_name) +{ + VelocityLimitClearCommand msg; + msg.stamp = current_time; + msg.sender = "obstacle_slow_down"; + msg.command = true; + return msg; +} + +Float64Stamped create_float64_stamped(const rclcpp::Time & now, const float & data) +{ + Float64Stamped msg; + msg.stamp = now; + msg.data = data; + return msg; +} +} // namespace + +void ObstacleSlowDownModule::init(rclcpp::Node & node, const std::string & module_name) +{ + module_name_ = module_name; + clock_ = node.get_clock(); + logger_ = node.get_logger(); + + // ros parameters + common_param_ = CommonParam(node); + slow_down_planning_param_ = SlowDownPlanningParam(node); + obstacle_filtering_param_ = ObstacleFilteringParam(node); + + objects_of_interest_marker_interface_ = std::make_unique< + autoware::objects_of_interest_marker_interface::ObjectsOfInterestMarkerInterface>( + &node, "motion_velocity_planner_common"); + + // common publisher + processing_time_publisher_ = + node.create_publisher("~/debug/obstacle_slow_down/processing_time_ms", 1); + virtual_wall_publisher_ = + node.create_publisher("~/obstacle_slow_down/virtual_walls", 1); + debug_publisher_ = node.create_publisher("~/obstacle_slow_down/debug_markers", 1); + + // module publisher + metrics_pub_ = node.create_publisher("~/slow_down/metrics", 10); + debug_slow_down_planning_info_pub_ = + node.create_publisher("~/debug/slow_down_planning_info", 1); + processing_time_detail_pub_ = node.create_publisher( + "~/debug/processing_time_detail_ms/obstacle_slow_down", 1); + + // interface publisher + objects_of_interest_marker_interface_ = std::make_unique< + autoware::objects_of_interest_marker_interface::ObjectsOfInterestMarkerInterface>( + &node, "obstacle_slow_down"); + planning_factor_interface_ = + std::make_unique( + &node, "obstacle_slow_down"); + + // time keeper + time_keeper_ = std::make_shared(processing_time_detail_pub_); +} + +void ObstacleSlowDownModule::update_parameters( + [[maybe_unused]] const std::vector & parameters) +{ +} + +VelocityPlanningResult ObstacleSlowDownModule::plan( + const std::vector & raw_trajectory_points, + [[maybe_unused]] const std::vector & + smoothed_trajectory_points, + const std::shared_ptr planner_data) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + stop_watch_.tic(); + debug_data_ptr_ = std::make_shared(); + metrics_manager_.init(); + decimated_traj_polys_ = std::nullopt; + + const auto decimated_traj_points = utils::decimate_trajectory_points_from_ego( + raw_trajectory_points, planner_data->current_odometry.pose.pose, + planner_data->ego_nearest_dist_threshold, planner_data->ego_nearest_yaw_threshold, + planner_data->trajectory_polygon_collision_check.decimate_trajectory_step_length, 0.0); + + const auto slow_down_obstacles = filter_slow_down_obstacle_for_predicted_object( + planner_data->current_odometry, planner_data->ego_nearest_dist_threshold, + planner_data->ego_nearest_yaw_threshold, raw_trajectory_points, decimated_traj_points, + planner_data->objects, rclcpp::Time(planner_data->predicted_objects_header.stamp), + planner_data->vehicle_info_, planner_data->trajectory_polygon_collision_check); + + VelocityPlanningResult result; + result.slowdown_intervals = plan_slow_down( + planner_data, raw_trajectory_points, slow_down_obstacles, result.velocity_limit, + planner_data->vehicle_info_); + metrics_manager_.calculate_metrics("PlannerInterface", "cruise"); + + // clear velocity limit if necessary + if (result.velocity_limit) { + need_to_clear_velocity_limit_ = true; + } else { + if (need_to_clear_velocity_limit_) { + // clear velocity limit + result.velocity_limit_clear_command = + create_velocity_limit_clear_command(clock_->now(), module_name_); + need_to_clear_velocity_limit_ = false; + } + } + + publish_debug_info(); + + return result; +} + +std::string ObstacleSlowDownModule::get_module_name() const +{ + return module_name_; +} + +std::vector +ObstacleSlowDownModule::filter_slow_down_obstacle_for_predicted_object( + const Odometry & odometry, const double ego_nearest_dist_threshold, + const double ego_nearest_yaw_threshold, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector> & objects, + const rclcpp::Time & predicted_objects_stamp, const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + const auto & current_pose = odometry.pose.pose; + + // calculate collision points with trajectory with lateral stop margin + // NOTE: For additional margin, hysteresis is not divided by two. + const auto & p = obstacle_filtering_param_; + const auto & tp = trajectory_polygon_collision_check; + const auto decimated_traj_polys_with_lat_margin = polygon_utils::create_one_step_polygons( + decimated_traj_points, vehicle_info, odometry.pose.pose, + p.max_lat_margin + p.lat_hysteresis_margin, tp.enable_to_consider_current_pose, + tp.time_to_convergence, tp.decimate_trajectory_step_length); + debug_data_ptr_->decimated_traj_polys = decimated_traj_polys_with_lat_margin; + + // slow down + slow_down_condition_counter_.reset_current_uuids(); + std::vector slow_down_obstacles; + for (const auto & object : objects) { + // 1. rough filtering + // 1.1. Check if the obstacle is in front of the ego. + const double lon_dist_from_ego_to_obj = + object->get_dist_from_ego_longitudinal(traj_points, current_pose.position); + if (lon_dist_from_ego_to_obj < 0.0) { + continue; + } + + // 1.2. Check if the rough lateral distance is smaller than the threshold. + const double min_lat_dist_to_traj_poly = + utils::calc_possible_min_dist_from_obj_to_traj_poly(object, traj_points, vehicle_info); + if (obstacle_filtering_param_.max_lat_margin < min_lat_dist_to_traj_poly) { + continue; + } + + // 2. precise filtering + const auto & decimated_traj_polys = get_decimated_traj_polys( + traj_points, current_pose, vehicle_info, ego_nearest_dist_threshold, + ego_nearest_yaw_threshold, trajectory_polygon_collision_check); + const double dist_from_obj_poly_to_traj_poly = + object->get_dist_to_traj_poly(decimated_traj_polys); + const auto slow_down_obstacle = create_slow_down_obstacle_for_predicted_object( + traj_points, decimated_traj_polys_with_lat_margin, object, predicted_objects_stamp, + dist_from_obj_poly_to_traj_poly); + if (slow_down_obstacle) { + slow_down_obstacles.push_back(*slow_down_obstacle); + continue; + } + } + slow_down_condition_counter_.remove_counter_unless_updated(); + prev_slow_down_object_obstacles_ = slow_down_obstacles; + + RCLCPP_DEBUG( + logger_, "The number of output obstacles of filter_slow_down_obstacles is %ld", + slow_down_obstacles.size()); + return slow_down_obstacles; +} + +std::optional +ObstacleSlowDownModule::create_slow_down_obstacle_for_predicted_object( + const std::vector & traj_points, + const std::vector & decimated_traj_polys_with_lat_margin, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const double dist_from_obj_poly_to_traj_poly) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + const auto & p = obstacle_filtering_param_; + + const auto & obj_uuid = object->predicted_object.object_id; + const auto & obj_uuid_str = autoware::universe_utils::toHexString(obj_uuid); + const auto & obj_label = object->predicted_object.classification.at(0).label; + slow_down_condition_counter_.add_current_uuid(obj_uuid_str); + + const bool is_prev_obstacle_slow_down = + utils::get_obstacle_from_uuid(prev_slow_down_object_obstacles_, obj_uuid_str).has_value(); + + if (!is_slow_down_obstacle(obj_label)) { + return std::nullopt; + } + + if (dist_from_obj_poly_to_traj_poly <= p.min_lat_margin) { + return std::nullopt; + } + + // check lateral distance considering hysteresis + const bool is_lat_dist_low = is_lower_considering_hysteresis( + dist_from_obj_poly_to_traj_poly, is_prev_obstacle_slow_down, + p.max_lat_margin + p.lat_hysteresis_margin / 2.0, + p.max_lat_margin - p.lat_hysteresis_margin / 2.0); + + const bool is_slow_down_required = [&]() { + if (is_prev_obstacle_slow_down) { + // check if exiting slow down + if (!is_lat_dist_low) { + const int count = slow_down_condition_counter_.decrease_counter(obj_uuid_str); + if (count <= -p.successive_num_to_exit_slow_down_condition) { + slow_down_condition_counter_.reset(obj_uuid_str); + return false; + } + } + return true; + } + // check if entering slow down + if (is_lat_dist_low) { + const int count = slow_down_condition_counter_.increase_counter(obj_uuid_str); + if (p.successive_num_to_entry_slow_down_condition <= count) { + slow_down_condition_counter_.reset(obj_uuid_str); + return true; + } + } + return false; + }(); + if (!is_slow_down_required) { + RCLCPP_DEBUG( + logger_, "[SlowDown] Ignore obstacle (%s) since it's far from trajectory. (%f [m])", + obj_uuid_str.substr(0, 4).c_str(), dist_from_obj_poly_to_traj_poly); + return std::nullopt; + } + + const auto obstacle_poly = autoware::universe_utils::toPolygon2d( + object->predicted_object.kinematics.initial_pose_with_covariance.pose, + object->predicted_object.shape); + + std::vector front_collision_polygons; + size_t front_seg_idx = 0; + std::vector back_collision_polygons; + size_t back_seg_idx = 0; + for (size_t i = 0; i < decimated_traj_polys_with_lat_margin.size(); ++i) { + std::vector collision_polygons; + bg::intersection(decimated_traj_polys_with_lat_margin.at(i), obstacle_poly, collision_polygons); + + if (!collision_polygons.empty()) { + if (front_collision_polygons.empty()) { + front_collision_polygons = collision_polygons; + front_seg_idx = i == 0 ? i : i - 1; + } + back_collision_polygons = collision_polygons; + back_seg_idx = i == 0 ? i : i - 1; + } else { + if (!back_collision_polygons.empty()) { + break; // for efficient calculation + } + } + } + + if (front_collision_polygons.empty() || back_collision_polygons.empty()) { + RCLCPP_DEBUG( + logger_, "[SlowDown] Ignore obstacle (%s) since there is no collision point", + obj_uuid_str.substr(0, 4).c_str()); + return std::nullopt; + } + + // calculate front collision point + double front_min_dist = std::numeric_limits::max(); + geometry_msgs::msg::Point front_collision_point; + for (const auto & collision_poly : front_collision_polygons) { + for (const auto & collision_point : collision_poly.outer()) { + const auto collision_geom_point = to_geom_point(collision_point); + const double dist = autoware::motion_utils::calcLongitudinalOffsetToSegment( + traj_points, front_seg_idx, collision_geom_point); + if (dist < front_min_dist) { + front_min_dist = dist; + front_collision_point = collision_geom_point; + } + } + } + + // calculate back collision point + double back_max_dist = -std::numeric_limits::max(); + geometry_msgs::msg::Point back_collision_point = front_collision_point; + for (const auto & collision_poly : back_collision_polygons) { + for (const auto & collision_point : collision_poly.outer()) { + const auto collision_geom_point = to_geom_point(collision_point); + const double dist = autoware::motion_utils::calcLongitudinalOffsetToSegment( + traj_points, back_seg_idx, collision_geom_point); + if (back_max_dist < dist) { + back_max_dist = dist; + back_collision_point = collision_geom_point; + } + } + } + + return SlowDownObstacle{ + obj_uuid_str, + predicted_objects_stamp, + object->predicted_object.classification.at(0), + object->get_predicted_pose(clock_->now(), predicted_objects_stamp), + object->get_lon_vel_relative_to_traj(traj_points), + object->get_lat_vel_relative_to_traj(traj_points), + dist_from_obj_poly_to_traj_poly, + front_collision_point, + back_collision_point}; +} + +std::vector ObstacleSlowDownModule::plan_slow_down( + const std::shared_ptr planner_data, + const std::vector & traj_points, const std::vector & obstacles, + [[maybe_unused]] std::optional & velocity_limit, const VehicleInfo & vehicle_info) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + auto slow_down_traj_points = traj_points; + slow_down_debug_multi_array_ = Float32MultiArrayStamped(); + + const double dist_to_ego = [&]() { + const size_t ego_seg_idx = planner_data->find_segment_index( + slow_down_traj_points, planner_data->current_odometry.pose.pose); + return autoware::motion_utils::calcSignedArcLength( + slow_down_traj_points, 0, planner_data->current_odometry.pose.pose.position, ego_seg_idx); + }(); + const double abs_ego_offset = planner_data->is_driving_forward + ? std::abs(vehicle_info.max_longitudinal_offset_m) + : std::abs(vehicle_info.min_longitudinal_offset_m); + + // define function to insert slow down velocity to trajectory + const auto insert_point_in_trajectory = [&](const double lon_dist) -> std::optional { + const auto inserted_idx = + autoware::motion_utils::insertTargetPoint(0, lon_dist, slow_down_traj_points); + if (inserted_idx) { + if (inserted_idx.value() + 1 <= slow_down_traj_points.size() - 1) { + // zero-order hold for velocity interpolation + slow_down_traj_points.at(inserted_idx.value()).longitudinal_velocity_mps = + slow_down_traj_points.at(inserted_idx.value() + 1).longitudinal_velocity_mps; + } + return inserted_idx.value(); + } + return std::nullopt; + }; + + std::vector slowdown_intervals; + std::vector new_prev_slow_down_output; + for (size_t i = 0; i < obstacles.size(); ++i) { + const auto & obstacle = obstacles.at(i); + const auto prev_output = get_object_from_uuid(prev_slow_down_output_, obstacle.uuid); + + const bool is_obstacle_moving = [&]() -> bool { + const auto & p = slow_down_planning_param_; + const auto object_vel_norm = std::hypot(obstacle.velocity, obstacle.lat_velocity); + if (!prev_output) { + return object_vel_norm > p.moving_object_speed_threshold; + } + if (prev_output->is_obstacle_moving) { + return object_vel_norm > p.moving_object_speed_threshold - p.moving_object_hysteresis_range; + } + return object_vel_norm > p.moving_object_speed_threshold + p.moving_object_hysteresis_range; + }(); + + // calculate slow down start distance, and insert slow down velocity + const auto dist_vec_to_slow_down = calculate_distance_to_slow_down_with_constraints( + planner_data, slow_down_traj_points, obstacle, prev_output, dist_to_ego, vehicle_info, + is_obstacle_moving); + if (!dist_vec_to_slow_down) { + RCLCPP_DEBUG( + logger_, "[SlowDown] Ignore obstacle (%s) since distance to slow down is not valid", + obstacle.uuid.c_str()); + continue; + } + const auto dist_to_slow_down_start = std::get<0>(*dist_vec_to_slow_down); + const auto dist_to_slow_down_end = std::get<1>(*dist_vec_to_slow_down); + const auto feasible_slow_down_vel = std::get<2>(*dist_vec_to_slow_down); + + // calculate slow down end distance, and insert slow down velocity + // NOTE: slow_down_start_idx will not be wrong since inserted back point is after inserted + // front point. + const auto slow_down_start_idx = insert_point_in_trajectory(dist_to_slow_down_start); + const auto slow_down_end_idx = dist_to_slow_down_start < dist_to_slow_down_end + ? insert_point_in_trajectory(dist_to_slow_down_end) + : std::nullopt; + if (!slow_down_end_idx) { + continue; + } + + // calculate slow down velocity + const double stable_slow_down_vel = [&]() { + if (prev_output) { + return autoware::signal_processing::lowpassFilter( + feasible_slow_down_vel, prev_output->target_vel, + slow_down_planning_param_.lpf_gain_slow_down_vel); + } + return feasible_slow_down_vel; + }(); + + // insert slow down velocity between slow start and end + slowdown_intervals.push_back(SlowdownInterval{ + slow_down_traj_points.at(slow_down_start_idx ? *slow_down_start_idx : 0).pose.position, + slow_down_traj_points.at(*slow_down_end_idx).pose.position, stable_slow_down_vel}); + + // add debug data + slow_down_debug_multi_array_.data.push_back(obstacle.dist_to_traj_poly); + slow_down_debug_multi_array_.data.push_back(dist_to_slow_down_start); + slow_down_debug_multi_array_.data.push_back(dist_to_slow_down_end); + slow_down_debug_multi_array_.data.push_back(feasible_slow_down_vel); + slow_down_debug_multi_array_.data.push_back(stable_slow_down_vel); + slow_down_debug_multi_array_.data.push_back(slow_down_start_idx ? *slow_down_start_idx : -1.0); + slow_down_debug_multi_array_.data.push_back(*slow_down_end_idx); + + // add virtual wall + if (slow_down_start_idx && slow_down_end_idx) { + const size_t ego_idx = + planner_data->find_index(slow_down_traj_points, planner_data->current_odometry.pose.pose); + const size_t slow_down_wall_idx = [&]() { + if (ego_idx < *slow_down_start_idx) return *slow_down_start_idx; + if (ego_idx < *slow_down_end_idx) return ego_idx; + return *slow_down_end_idx; + }(); + + const auto markers = autoware::motion_utils::createSlowDownVirtualWallMarker( + slow_down_traj_points.at(slow_down_wall_idx).pose, "obstacle slow down", clock_->now(), i, + abs_ego_offset, "", planner_data->is_driving_forward); + autoware::universe_utils::appendMarkerArray(markers, &debug_data_ptr_->slow_down_wall_marker); + + // update planning factor + planning_factor_interface_->add( + slow_down_traj_points, planner_data->current_odometry.pose.pose, + slow_down_traj_points.at(*slow_down_start_idx).pose, + slow_down_traj_points.at(*slow_down_end_idx).pose, PlanningFactor::SLOW_DOWN, + SafetyFactorArray{}, planner_data->is_driving_forward, stable_slow_down_vel); + } + + // add debug virtual wall + if (slow_down_start_idx) { + const auto markers = autoware::motion_utils::createSlowDownVirtualWallMarker( + slow_down_traj_points.at(*slow_down_start_idx).pose, "obstacle slow down start", + clock_->now(), i * 2, abs_ego_offset, "", planner_data->is_driving_forward); + autoware::universe_utils::appendMarkerArray( + markers, &debug_data_ptr_->slow_down_debug_wall_marker); + } + if (slow_down_end_idx) { + const auto markers = autoware::motion_utils::createSlowDownVirtualWallMarker( + slow_down_traj_points.at(*slow_down_end_idx).pose, "obstacle slow down end", clock_->now(), + i * 2 + 1, abs_ego_offset, "", planner_data->is_driving_forward); + autoware::universe_utils::appendMarkerArray( + markers, &debug_data_ptr_->slow_down_debug_wall_marker); + } + + // Add debug data + debug_data_ptr_->obstacles_to_slow_down.push_back(obstacle); + + // update prev_slow_down_output_ + new_prev_slow_down_output.push_back(SlowDownOutput{ + obstacle.uuid, slow_down_traj_points, slow_down_start_idx, slow_down_end_idx, + stable_slow_down_vel, feasible_slow_down_vel, obstacle.dist_to_traj_poly, + is_obstacle_moving}); + } + + // update prev_slow_down_output_ + prev_slow_down_output_ = new_prev_slow_down_output; + + return slowdown_intervals; +} + +Float32MultiArrayStamped ObstacleSlowDownModule::get_slow_down_planning_debug_message( + const rclcpp::Time & current_time) +{ + slow_down_debug_multi_array_.stamp = current_time; + return slow_down_debug_multi_array_; +} + +void ObstacleSlowDownModule::publish_debug_info() +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + // 1. debug marker + MarkerArray debug_marker; + + // 1.1. obstacles + for (size_t i = 0; i < debug_data_ptr_->obstacles_to_slow_down.size(); ++i) { + // obstacle + const auto obstacle_marker = utils::get_object_marker( + debug_data_ptr_->obstacles_to_slow_down.at(i).pose, i, "obstacles", 0.7, 0.7, 0.0); + debug_marker.markers.push_back(obstacle_marker); + + // collision points + auto front_collision_point_marker = autoware::universe_utils::createDefaultMarker( + "map", clock_->now(), "collision_points", i * 2 + 0, Marker::SPHERE, + autoware::universe_utils::createMarkerScale(0.25, 0.25, 0.25), + autoware::universe_utils::createMarkerColor(1.0, 0.0, 0.0, 0.999)); + front_collision_point_marker.pose.position = + debug_data_ptr_->obstacles_to_slow_down.at(i).front_collision_point; + auto back_collision_point_marker = autoware::universe_utils::createDefaultMarker( + "map", clock_->now(), "collision_points", i * 2 + 1, Marker::SPHERE, + autoware::universe_utils::createMarkerScale(0.25, 0.25, 0.25), + autoware::universe_utils::createMarkerColor(1.0, 0.0, 0.0, 0.999)); + back_collision_point_marker.pose.position = + debug_data_ptr_->obstacles_to_slow_down.at(i).back_collision_point; + + debug_marker.markers.push_back(front_collision_point_marker); + debug_marker.markers.push_back(back_collision_point_marker); + } + + // 1.2. slow down debug wall marker + autoware::universe_utils::appendMarkerArray( + debug_data_ptr_->slow_down_debug_wall_marker, &debug_marker); + + // 1.3. detection area + auto decimated_traj_polys_marker = autoware::universe_utils::createDefaultMarker( + "map", clock_->now(), "detection_area", 0, Marker::LINE_LIST, + autoware::universe_utils::createMarkerScale(0.01, 0.0, 0.0), + autoware::universe_utils::createMarkerColor(0.0, 1.0, 0.0, 0.999)); + for (const auto & decimated_traj_poly : debug_data_ptr_->decimated_traj_polys) { + for (size_t dp_idx = 0; dp_idx < decimated_traj_poly.outer().size(); ++dp_idx) { + const auto & current_point = decimated_traj_poly.outer().at(dp_idx); + const auto & next_point = + decimated_traj_poly.outer().at((dp_idx + 1) % decimated_traj_poly.outer().size()); + + decimated_traj_polys_marker.points.push_back( + autoware::universe_utils::createPoint(current_point.x(), current_point.y(), 0.0)); + decimated_traj_polys_marker.points.push_back( + autoware::universe_utils::createPoint(next_point.x(), next_point.y(), 0.0)); + } + } + debug_marker.markers.push_back(decimated_traj_polys_marker); + + debug_publisher_->publish(debug_marker); + + // 2. virtual wall + virtual_wall_publisher_->publish(debug_data_ptr_->slow_down_wall_marker); + + // 3. slow down planning info + const auto slow_down_debug_msg = get_slow_down_planning_debug_message(clock_->now()); + debug_slow_down_planning_info_pub_->publish(slow_down_debug_msg); + + // 4. objects of interest + objects_of_interest_marker_interface_->publishMarkerArray(); + + // 5. metrics + const auto metrics_msg = metrics_manager_.create_metric_array(clock_->now()); + metrics_pub_->publish(metrics_msg); + + // 6. processing time + processing_time_publisher_->publish(create_float64_stamped(clock_->now(), stop_watch_.toc())); + + // 7. planning factor + planning_factor_interface_->publish(); +} + +bool ObstacleSlowDownModule::is_slow_down_obstacle(const uint8_t label) const +{ + const auto & types = obstacle_filtering_param_.object_types; + return std::find(types.begin(), types.end(), label) != types.end(); +} + +std::optional> +ObstacleSlowDownModule::calculate_distance_to_slow_down_with_constraints( + const std::shared_ptr planner_data, + const std::vector & traj_points, const SlowDownObstacle & obstacle, + const std::optional & prev_output, const double dist_to_ego, + const VehicleInfo & vehicle_info, const bool is_obstacle_moving) const +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + const double abs_ego_offset = planner_data->is_driving_forward + ? std::abs(vehicle_info.max_longitudinal_offset_m) + : std::abs(vehicle_info.min_longitudinal_offset_m); + const double obstacle_vel = obstacle.velocity; + // calculate slow down velocity + const double slow_down_vel = + calculate_slow_down_velocity(obstacle, prev_output, is_obstacle_moving); + + // calculate distance to collision points + const double dist_to_front_collision = + autoware::motion_utils::calcSignedArcLength(traj_points, 0, obstacle.front_collision_point); + const double dist_to_back_collision = + autoware::motion_utils::calcSignedArcLength(traj_points, 0, obstacle.back_collision_point); + + // calculate offset distance to first collision considering relative velocity + const double relative_vel = + planner_data->current_odometry.twist.twist.linear.x - obstacle.velocity; + const double offset_dist_to_collision = [&]() { + if (dist_to_front_collision < dist_to_ego + abs_ego_offset) { + return 0.0; + } + + // NOTE: This min_relative_vel forces the relative velocity positive if the ego velocity is + // lower than the obstacle velocity. Without this, the slow down feature will flicker where + // the ego velocity is very close to the obstacle velocity. + constexpr double min_relative_vel = 1.0; + const double time_to_collision = (dist_to_front_collision - dist_to_ego - abs_ego_offset) / + std::max(min_relative_vel, relative_vel); + + constexpr double time_to_collision_margin = 1.0; + const double cropped_time_to_collision = + std::max(0.0, time_to_collision - time_to_collision_margin); + return obstacle_vel * cropped_time_to_collision; + }(); + + // calculate distance during deceleration, slow down preparation, and slow down + const double min_slow_down_prepare_dist = 3.0; + const double slow_down_prepare_dist = std::max( + min_slow_down_prepare_dist, + slow_down_vel * slow_down_planning_param_.time_margin_on_target_velocity); + const double deceleration_dist = offset_dist_to_collision + dist_to_front_collision - + abs_ego_offset - dist_to_ego - slow_down_prepare_dist; + const double slow_down_dist = + dist_to_back_collision - dist_to_front_collision + slow_down_prepare_dist; + + // calculate distance to start/end slow down + const double dist_to_slow_down_start = dist_to_ego + deceleration_dist; + const double dist_to_slow_down_end = dist_to_ego + deceleration_dist + slow_down_dist; + if (100.0 < dist_to_slow_down_start) { + // NOTE: distance to slow down is too far. + return std::nullopt; + } + + // apply low-pass filter to distance to start/end slow down + const auto apply_lowpass_filter = [&](const double dist_to_slow_down, const auto prev_point) { + if (prev_output && prev_point) { + const size_t seg_idx = + autoware::motion_utils::findNearestSegmentIndex(traj_points, prev_point->position); + const double prev_dist_to_slow_down = + autoware::motion_utils::calcSignedArcLength(traj_points, 0, prev_point->position, seg_idx); + return autoware::signal_processing::lowpassFilter( + dist_to_slow_down, prev_dist_to_slow_down, + slow_down_planning_param_.lpf_gain_dist_to_slow_down); + } + return dist_to_slow_down; + }; + const double filtered_dist_to_slow_down_start = + apply_lowpass_filter(dist_to_slow_down_start, prev_output->start_point); + const double filtered_dist_to_slow_down_end = + apply_lowpass_filter(dist_to_slow_down_end, prev_output->end_point); + + // calculate velocity considering constraints + const double feasible_slow_down_vel = [&]() { + if (deceleration_dist < 0) { + if (prev_output) { + return prev_output->target_vel; + } + return std::max(planner_data->current_odometry.twist.twist.linear.x, slow_down_vel); + } + if (planner_data->current_odometry.twist.twist.linear.x < slow_down_vel) { + return slow_down_vel; + } + + const double one_shot_feasible_slow_down_vel = [&]() { + if (planner_data->current_acceleration.accel.accel.linear.x < common_param_.min_accel) { + const double squared_vel = + std::pow(planner_data->current_odometry.twist.twist.linear.x, 2) + + 2 * deceleration_dist * common_param_.min_accel; + if (squared_vel < 0) { + return slow_down_vel; + } + return std::max(std::sqrt(squared_vel), slow_down_vel); + } + // TODO(murooka) Calculate more precisely. Final acceleration should be zero. + const double min_feasible_slow_down_vel = calc_deceleration_velocity_from_distance_to_target( + slow_down_planning_param_.slow_down_min_jerk, slow_down_planning_param_.slow_down_min_acc, + planner_data->current_acceleration.accel.accel.linear.x, + planner_data->current_odometry.twist.twist.linear.x, deceleration_dist); + return min_feasible_slow_down_vel; + }(); + if (prev_output) { + // NOTE: If longitudinal controllability is not good, one_shot_slow_down_vel may be getting + // larger since we use actual ego's velocity and acceleration for its calculation. + // Suppress one_shot_slow_down_vel getting larger here. + const double feasible_slow_down_vel = + std::min(one_shot_feasible_slow_down_vel, prev_output->feasible_target_vel); + return std::max(slow_down_vel, feasible_slow_down_vel); + } + return std::max(slow_down_vel, one_shot_feasible_slow_down_vel); + }(); + + return std::make_tuple( + filtered_dist_to_slow_down_start, filtered_dist_to_slow_down_end, feasible_slow_down_vel); +} + +double ObstacleSlowDownModule::calculate_slow_down_velocity( + const SlowDownObstacle & obstacle, const std::optional & prev_output, + const bool is_obstacle_moving) const +{ + const auto & p = slow_down_planning_param_.get_object_param_by_label( + obstacle.classification, is_obstacle_moving); + const double stable_dist_from_obj_poly_to_traj_poly = [&]() { + if (prev_output) { + return autoware::signal_processing::lowpassFilter( + obstacle.dist_to_traj_poly, prev_output->dist_from_obj_poly_to_traj_poly, + slow_down_planning_param_.lpf_gain_lat_dist); + } + return obstacle.dist_to_traj_poly; + }(); + + const double ratio = std::clamp( + (std::abs(stable_dist_from_obj_poly_to_traj_poly) - p.min_lat_margin) / + (p.max_lat_margin - p.min_lat_margin), + 0.0, 1.0); + const double slow_down_vel = + p.min_ego_velocity + ratio * (p.max_ego_velocity - p.min_ego_velocity); + + return slow_down_vel; +} + +std::vector ObstacleSlowDownModule::get_decimated_traj_polys( + const std::vector & traj_points, const geometry_msgs::msg::Pose & current_pose, + const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, + const double ego_nearest_dist_threshold, const double ego_nearest_yaw_threshold, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const +{ + if (!decimated_traj_polys_) { + const auto & p = trajectory_polygon_collision_check; + const auto decimated_traj_points = utils::decimate_trajectory_points_from_ego( + traj_points, current_pose, ego_nearest_dist_threshold, ego_nearest_yaw_threshold, + p.decimate_trajectory_step_length, p.goal_extended_trajectory_length); + decimated_traj_polys_ = polygon_utils::create_one_step_polygons( + decimated_traj_points, vehicle_info, current_pose, 0.0, p.enable_to_consider_current_pose, + p.time_to_convergence, p.decimate_trajectory_step_length); + } + return *decimated_traj_polys_; +} + +} // namespace autoware::motion_velocity_planner + +#include +PLUGINLIB_EXPORT_CLASS( + autoware::motion_velocity_planner::ObstacleSlowDownModule, + autoware::motion_velocity_planner::PluginModuleInterface) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/obstacle_slow_down_module.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/obstacle_slow_down_module.hpp new file mode 100644 index 0000000000000..1d367adfb6f4e --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/obstacle_slow_down_module.hpp @@ -0,0 +1,123 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef OBSTACLE_SLOW_DOWN_MODULE_HPP_ +#define OBSTACLE_SLOW_DOWN_MODULE_HPP_ + +#include "autoware/motion_velocity_planner_common_universe/polygon_utils.hpp" +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" +#include "autoware/universe_utils/system/stop_watch.hpp" +#include "autoware/universe_utils/system/time_keeper.hpp" +#include "metrics_manager.hpp" +#include "parameters.hpp" +#include "type_alias.hpp" +#include "types.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +class ObstacleSlowDownModule : public PluginModuleInterface +{ +public: + void init(rclcpp::Node & node, const std::string & module_name) override; + void update_parameters(const std::vector & parameters) override; + VelocityPlanningResult plan( + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, + const std::shared_ptr planner_data) override; + std::string get_module_name() const override; + +private: + std::string module_name_; + rclcpp::Clock::SharedPtr clock_{}; + + // ros parameters + CommonParam common_param_; + SlowDownPlanningParam slow_down_planning_param_; + ObstacleFilteringParam obstacle_filtering_param_; + + // module publisher + rclcpp::Publisher::SharedPtr metrics_pub_; + rclcpp::Publisher::SharedPtr debug_slow_down_planning_info_pub_; + rclcpp::Publisher::SharedPtr + processing_time_detail_pub_; + + // interface publisher + std::unique_ptr + objects_of_interest_marker_interface_; + + // internal variables + std::vector prev_slow_down_object_obstacles_; + std::vector prev_slow_down_output_; + SlowDownConditionCounter slow_down_condition_counter_; + Float32MultiArrayStamped slow_down_debug_multi_array_; + autoware::universe_utils::StopWatch stop_watch_; + mutable std::shared_ptr debug_data_ptr_; + MetricsManager metrics_manager_; + bool need_to_clear_velocity_limit_{false}; + mutable std::shared_ptr time_keeper_; + mutable std::optional> decimated_traj_polys_{std::nullopt}; + + std::vector filter_slow_down_obstacle_for_predicted_object( + const Odometry & odometry, const double ego_nearest_dist_threshold, + const double ego_nearest_yaw_threshold, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector> & objects, + const rclcpp::Time & predicted_objects_stamp, const VehicleInfo & vehicle_info, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check); + std::optional create_slow_down_obstacle_for_predicted_object( + const std::vector & traj_points, + const std::vector & decimated_traj_polys_with_lat_margin, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const double dist_from_obj_poly_to_traj_poly); + std::vector plan_slow_down( + const std::shared_ptr planner_data, + const std::vector & traj_points, + const std::vector & obstacles, + [[maybe_unused]] std::optional & velocity_limit, + const VehicleInfo & vehicle_info); + Float32MultiArrayStamped get_slow_down_planning_debug_message(const rclcpp::Time & current_time); + void publish_debug_info(); + bool is_slow_down_obstacle(const uint8_t label) const; + std::optional> + calculate_distance_to_slow_down_with_constraints( + const std::shared_ptr planner_data, + const std::vector & traj_points, const SlowDownObstacle & obstacle, + const std::optional & prev_output, const double dist_to_ego, + const VehicleInfo & vehicle_info, const bool is_obstacle_moving) const; + double calculate_slow_down_velocity( + const SlowDownObstacle & obstacle, const std::optional & prev_output, + const bool is_obstacle_moving) const; + std::vector get_decimated_traj_polys( + const std::vector & traj_points, const geometry_msgs::msg::Pose & current_pose, + const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, + const double ego_nearest_dist_threshold, const double ego_nearest_yaw_threshold, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const; +}; +} // namespace autoware::motion_velocity_planner + +#endif // OBSTACLE_SLOW_DOWN_MODULE_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/parameters.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/parameters.hpp new file mode 100644 index 0000000000000..b2159def25224 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/parameters.hpp @@ -0,0 +1,176 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef PARAMETERS_HPP_ +#define PARAMETERS_HPP_ + +#include "type_alias.hpp" +#include "types.hpp" + +#include + +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware::universe_utils::getOrDeclareParameter; + +struct CommonParam +{ + double max_accel{}; + double min_accel{}; + double max_jerk{}; + double min_jerk{}; + double limit_max_accel{}; + double limit_min_accel{}; + double limit_max_jerk{}; + double limit_min_jerk{}; + + CommonParam() = default; + explicit CommonParam(rclcpp::Node & node) + { + max_accel = getOrDeclareParameter(node, "normal.max_acc"); + min_accel = getOrDeclareParameter(node, "normal.min_acc"); + max_jerk = getOrDeclareParameter(node, "normal.max_jerk"); + min_jerk = getOrDeclareParameter(node, "normal.min_jerk"); + limit_max_accel = getOrDeclareParameter(node, "limit.max_acc"); + limit_min_accel = getOrDeclareParameter(node, "limit.min_acc"); + limit_max_jerk = getOrDeclareParameter(node, "limit.max_jerk"); + limit_min_jerk = getOrDeclareParameter(node, "limit.min_jerk"); + } +}; + +struct ObstacleFilteringParam +{ + std::vector object_types{}; + + double min_lat_margin{}; + double max_lat_margin{}; + double lat_hysteresis_margin{}; + + int successive_num_to_entry_slow_down_condition{}; + int successive_num_to_exit_slow_down_condition{}; + + ObstacleFilteringParam() = default; + explicit ObstacleFilteringParam(rclcpp::Node & node) + { + object_types = + utils::get_target_object_type(node, "obstacle_slow_down.obstacle_filtering.object_type."); + min_lat_margin = + getOrDeclareParameter(node, "obstacle_slow_down.obstacle_filtering.min_lat_margin"); + max_lat_margin = + getOrDeclareParameter(node, "obstacle_slow_down.obstacle_filtering.max_lat_margin"); + lat_hysteresis_margin = getOrDeclareParameter( + node, "obstacle_slow_down.obstacle_filtering.lat_hysteresis_margin"); + successive_num_to_entry_slow_down_condition = getOrDeclareParameter( + node, "obstacle_slow_down.obstacle_filtering.successive_num_to_entry_slow_down_condition"); + successive_num_to_exit_slow_down_condition = getOrDeclareParameter( + node, "obstacle_slow_down.obstacle_filtering.successive_num_to_exit_slow_down_condition"); + } +}; + +struct SlowDownPlanningParam +{ + double slow_down_min_acc{}; + double slow_down_min_jerk{}; + + double lpf_gain_slow_down_vel{}; + double lpf_gain_lat_dist{}; + double lpf_gain_dist_to_slow_down{}; + + double time_margin_on_target_velocity{}; + + double moving_object_speed_threshold{}; + double moving_object_hysteresis_range{}; + + std::vector obstacle_labels{"default"}; + std::vector obstacle_moving_classification{"static", "moving"}; + struct ObjectTypeSpecificParams + { + double min_lat_margin; + double max_lat_margin; + double min_ego_velocity; + double max_ego_velocity; + }; + std::unordered_map object_types_maps = { + {ObjectClassification::UNKNOWN, "unknown"}, {ObjectClassification::CAR, "car"}, + {ObjectClassification::TRUCK, "truck"}, {ObjectClassification::BUS, "bus"}, + {ObjectClassification::TRAILER, "trailer"}, {ObjectClassification::MOTORCYCLE, "motorcycle"}, + {ObjectClassification::BICYCLE, "bicycle"}, {ObjectClassification::PEDESTRIAN, "pedestrian"}}; + std::unordered_map object_type_specific_param_map; + + SlowDownPlanningParam() = default; + explicit SlowDownPlanningParam(rclcpp::Node & node) + { + slow_down_min_acc = getOrDeclareParameter( + node, "obstacle_slow_down.slow_down_planning.slow_down_min_acc"); + slow_down_min_jerk = getOrDeclareParameter( + node, "obstacle_slow_down.slow_down_planning.slow_down_min_jerk"); + + lpf_gain_slow_down_vel = getOrDeclareParameter( + node, "obstacle_slow_down.slow_down_planning.lpf_gain_slow_down_vel"); + lpf_gain_lat_dist = getOrDeclareParameter( + node, "obstacle_slow_down.slow_down_planning.lpf_gain_lat_dist"); + lpf_gain_dist_to_slow_down = getOrDeclareParameter( + node, "obstacle_slow_down.slow_down_planning.lpf_gain_dist_to_slow_down"); + time_margin_on_target_velocity = getOrDeclareParameter( + node, "obstacle_slow_down.slow_down_planning.time_margin_on_target_velocity"); + + moving_object_speed_threshold = getOrDeclareParameter( + node, "obstacle_slow_down.slow_down_planning.moving_object_speed_threshold"); + moving_object_hysteresis_range = getOrDeclareParameter( + node, "obstacle_slow_down.slow_down_planning.moving_object_hysteresis_range"); + + const std::string param_prefix = + "obstacle_slow_down.slow_down_planning.object_type_specified_params."; + const auto object_types = + getOrDeclareParameter>(node, param_prefix + "types"); + + for (const auto & type_str : object_types) { + for (const auto & movement_type : std::vector{"moving", "static"}) { + ObjectTypeSpecificParams param{ + getOrDeclareParameter( + node, param_prefix + type_str + "." + movement_type + ".min_lat_margin"), + getOrDeclareParameter( + node, param_prefix + type_str + "." + movement_type + ".max_lat_margin"), + getOrDeclareParameter( + node, param_prefix + type_str + "." + movement_type + ".min_ego_velocity"), + getOrDeclareParameter( + node, param_prefix + type_str + "." + movement_type + ".max_ego_velocity")}; + + object_type_specific_param_map.emplace(type_str + "." + movement_type, param); + } + } + } + + std::string get_param_type(const ObjectClassification label) const + { + const auto type_str = object_types_maps.at(label.label); + if (object_type_specific_param_map.count(type_str) == 0) { + return "default"; + } + return type_str; + } + ObjectTypeSpecificParams get_object_param_by_label( + const ObjectClassification label, const bool is_obstacle_moving) const + { + const std::string movement_type = is_obstacle_moving ? "moving" : "static"; + return object_type_specific_param_map.at(get_param_type(label) + "." + movement_type); + } +}; +} // namespace autoware::motion_velocity_planner + +#endif // PARAMETERS_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/type_alias.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/type_alias.hpp new file mode 100644 index 0000000000000..673574c24a914 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/type_alias.hpp @@ -0,0 +1,70 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TYPE_ALIAS_HPP_ +#define TYPE_ALIAS_HPP_ + +#include "autoware_vehicle_info_utils/vehicle_info_utils.hpp" + +#include "autoware_internal_debug_msgs/msg/float32_multi_array_stamped.hpp" +#include "autoware_internal_debug_msgs/msg/float32_stamped.hpp" +#include "autoware_internal_debug_msgs/msg/float64_stamped.hpp" +#include "autoware_perception_msgs/msg/predicted_object.hpp" +#include "autoware_perception_msgs/msg/predicted_objects.hpp" +#include "autoware_planning_msgs/msg/trajectory.hpp" +#include "geometry_msgs/msg/twist.hpp" +#include "nav_msgs/msg/odometry.hpp" +#include "sensor_msgs/msg/point_cloud2.hpp" +#include "tier4_planning_msgs/msg/velocity_limit.hpp" +#include "tier4_planning_msgs/msg/velocity_limit_clear_command.hpp" +#include "visualization_msgs/msg/marker_array.hpp" +#include +#include +#include +#include + +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware::vehicle_info_utils::VehicleInfo; +using autoware_internal_debug_msgs::msg::Float32MultiArrayStamped; +using autoware_internal_debug_msgs::msg::Float32Stamped; +using autoware_internal_debug_msgs::msg::Float64Stamped; +using autoware_perception_msgs::msg::ObjectClassification; +using autoware_perception_msgs::msg::PredictedObject; +using autoware_perception_msgs::msg::PredictedObjects; +using autoware_perception_msgs::msg::PredictedPath; +using autoware_perception_msgs::msg::Shape; +using autoware_planning_msgs::msg::Trajectory; +using autoware_planning_msgs::msg::TrajectoryPoint; +using geometry_msgs::msg::Twist; +using nav_msgs::msg::Odometry; +using sensor_msgs::msg::PointCloud2; +using tier4_planning_msgs::msg::VelocityLimit; +using tier4_planning_msgs::msg::VelocityLimitClearCommand; +using visualization_msgs::msg::Marker; +using visualization_msgs::msg::MarkerArray; +namespace bg = boost::geometry; +using autoware::universe_utils::Point2d; +using autoware::universe_utils::Polygon2d; +using Metric = tier4_metric_msgs::msg::Metric; +using MetricArray = tier4_metric_msgs::msg::MetricArray; +using PointCloud = pcl::PointCloud; +using tier4_planning_msgs::msg::PlanningFactor; +using tier4_planning_msgs::msg::SafetyFactorArray; +} // namespace autoware::motion_velocity_planner + +#endif // TYPE_ALIAS_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/types.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/types.hpp new file mode 100644 index 0000000000000..c21c6fd9103a2 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_slow_down_module/src/types.hpp @@ -0,0 +1,144 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TYPES_HPP_ +#define TYPES_HPP_ + +#include "type_alias.hpp" + +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +struct SlowDownObstacle +{ + SlowDownObstacle( + const std::string & arg_uuid, const rclcpp::Time & arg_stamp, + const ObjectClassification & object_classification, const geometry_msgs::msg::Pose & arg_pose, + const double arg_lon_velocity, const double arg_lat_velocity, + const double arg_dist_to_traj_poly, const geometry_msgs::msg::Point & arg_front_collision_point, + const geometry_msgs::msg::Point & arg_back_collision_point) + : uuid(arg_uuid), + stamp(arg_stamp), + pose(arg_pose), + velocity(arg_lon_velocity), + lat_velocity(arg_lat_velocity), + dist_to_traj_poly(arg_dist_to_traj_poly), + front_collision_point(arg_front_collision_point), + back_collision_point(arg_back_collision_point), + classification(object_classification) + { + } + std::string uuid{}; + rclcpp::Time stamp{}; + geometry_msgs::msg::Pose pose{}; // interpolated with the current stamp + double velocity{}; // longitudinal velocity against ego's trajectory + double lat_velocity{}; // lateral velocity against ego's trajectory + + double dist_to_traj_poly{}; // for efficient calculation + geometry_msgs::msg::Point front_collision_point{}; + geometry_msgs::msg::Point back_collision_point{}; + ObjectClassification classification{}; +}; + +struct SlowDownOutput +{ + SlowDownOutput() = default; + SlowDownOutput( + const std::string & arg_uuid, const std::vector & traj_points, + const std::optional & start_idx, const std::optional & end_idx, + const double arg_target_vel, const double arg_feasible_target_vel, + const double arg_dist_from_obj_poly_to_traj_poly, const bool is_obstacle_moving) + : uuid(arg_uuid), + target_vel(arg_target_vel), + feasible_target_vel(arg_feasible_target_vel), + dist_from_obj_poly_to_traj_poly(arg_dist_from_obj_poly_to_traj_poly), + is_obstacle_moving(is_obstacle_moving) + { + if (start_idx) { + start_point = traj_points.at(*start_idx).pose; + } + if (end_idx) { + end_point = traj_points.at(*end_idx).pose; + } + } + + std::string uuid{}; + double target_vel{}; + double feasible_target_vel{}; + double dist_from_obj_poly_to_traj_poly{}; + std::optional start_point{std::nullopt}; + std::optional end_point{std::nullopt}; + bool is_obstacle_moving{}; +}; + +struct SlowDownConditionCounter +{ + void reset_current_uuids() { current_uuids_.clear(); } + void add_current_uuid(const std::string & uuid) { current_uuids_.push_back(uuid); } + void remove_counter_unless_updated() + { + std::vector obsolete_uuids; + for (const auto & key_and_value : counter_) { + if ( + std::find(current_uuids_.begin(), current_uuids_.end(), key_and_value.first) == + current_uuids_.end()) { + obsolete_uuids.push_back(key_and_value.first); + } + } + + for (const auto & obsolete_uuid : obsolete_uuids) { + counter_.erase(obsolete_uuid); + } + } + + int increase_counter(const std::string & uuid) + { + if (counter_.count(uuid) != 0) { + counter_.at(uuid) = std::max(1, counter_.at(uuid) + 1); + } else { + counter_.emplace(uuid, 1); + } + return counter_.at(uuid); + } + int decrease_counter(const std::string & uuid) + { + if (counter_.count(uuid) != 0) { + counter_.at(uuid) = std::min(-1, counter_.at(uuid) - 1); + } else { + counter_.emplace(uuid, -1); + } + return counter_.at(uuid); + } + void reset(const std::string & uuid) { counter_.emplace(uuid, 0); } + + // NOTE: positive is for meeting entering condition, and negative is for exiting. + std::unordered_map counter_{}; + std::vector current_uuids_{}; +}; + +struct DebugData +{ + DebugData() = default; + std::vector obstacles_to_slow_down{}; + std::vector decimated_traj_polys{}; + MarkerArray slow_down_debug_wall_marker{}; + MarkerArray slow_down_wall_marker{}; +}; +} // namespace autoware::motion_velocity_planner + +#endif // TYPES_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/CMakeLists.txt b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/CMakeLists.txt new file mode 100644 index 0000000000000..4bcd50db64cb8 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.14) +project(autoware_motion_velocity_obstacle_stop_module) + +find_package(autoware_cmake REQUIRED) +autoware_package() +pluginlib_export_plugin_description_file(autoware_motion_velocity_planner_node_universe plugins.xml) + +ament_auto_add_library(${PROJECT_NAME} SHARED + DIRECTORY src +) + +ament_auto_package(INSTALL_TO_SHARE config) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/README.md b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/README.md new file mode 100644 index 0000000000000..412a4e28f0580 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/README.md @@ -0,0 +1,82 @@ +# Obstacle Stop + +## Role + +The `obstacle_stop` module does the stop planning when there is a static obstacle near the trajectory. + +## Activation + +This module is activated if the launch parameter `launch_obstacle_stop_module` is set to true. + +## Inner-workings / Algorithms + +### Obstacle Filtering + +The obstacles meeting the following condition are determined as obstacles for stopping. + +- The object type is for stopping according to `obstacle_filtering.object_type.*`. +- The lateral distance from the object to the ego's trajectory is smaller than `obstacle_filtering.max_lat_margin`. +- The object velocity along the ego's trajectory is smaller than `obstacle_filtering.obstacle_velocity_threshold_from_stop`. +- The object + - does not cross the ego's trajectory (\*1) + - and its collision time margin is large enough (\*2). + +#### NOTE + +##### \*1: Crossing obstacles + +Crossing obstacle is the object whose orientation's yaw angle against the ego's trajectory is smaller than `obstacle_filtering.crossing_obstacle.obstacle_traj_angle_threshold`. + +##### \*2: Enough collision time margin + +We predict the collision area and its time by the ego with a constant velocity motion and the obstacle with its predicted path. +Then, we calculate a collision time margin which is the difference of the time when the ego will be inside the collision area and the obstacle will be inside the collision area. +When this time margin is smaller than `obstacle_filtering.crossing_obstacle.collision_time_margin`, the margin is not enough. + +### Stop Planning + +The role of the stop planning is keeping a safe distance with static vehicle objects or dynamic/static non vehicle objects. + +The stop planning just inserts the stop point in the trajectory to keep a distance with obstacles. +The safe distance is parameterized as `stop_planning.stop_margin`. +When it stops at the end of the trajectory, and obstacle is on the same point, the safe distance becomes `stop_planning.terminal_stop_margin`. + +When inserting the stop point, the required acceleration for the ego to stop in front of the stop point is calculated. +If the acceleration is less than `common.min_strong_accel`, the stop planning will be cancelled since this package does not assume a strong sudden brake for emergency. + +### Minor functions + +#### Prioritization of behavior module's stop point + +When stopping for a pedestrian walking on the crosswalk, the behavior module inserts the zero velocity in the trajectory in front of the crosswalk. +Also `autoware_obstacle_cruise_planner`'s stop planning also works, and the ego may not reach the behavior module's stop point since the safe distance defined in `autoware_obstacle_cruise_planner` may be longer than the behavior module's safe distance. +To resolve this non-alignment of the stop point between the behavior module and this module, `stop_planning.min_behavior_stop_margin` is defined. +In the case of the crosswalk described above, this module inserts the stop point with a distance `stop_planning.min_behavior_stop_margin` at minimum between the ego and obstacle. + +#### A function to keep the closest stop obstacle in target obstacles + +In order to keep the closest stop obstacle in the target obstacles, we check whether it is disappeared or not from the target obstacles in the `check_consistency` function. +If the previous closest stop obstacle is remove from the lists, we keep it in the lists for `obstacle_filtering.stop_obstacle_hold_time_threshold` seconds. +Note that if a new stop obstacle appears and the previous closest obstacle removes from the lists, we do not add it to the target obstacles again. + +## Debugging + +### Detection area + +Green polygons which is a detection area is visualized by `detection_polygons` in the `~/debug/marker` topic. + +![detection_area](./docs/detection_area.png) + +### Collision points + +Red points which are collision points with obstacle are visualized by `*_collision_points` for each behavior in the `~/debug/marker` topic. + +![collision_point](./docs/collision_point.png) + +### Obstacle for stop + +Red sphere which is an obstacle for stop is visualized by `obstacles_to_stop` in the `~/debug/marker` topic. + +Red wall which means a safe distance to stop if the ego's front meets the wall is visualized in the `~/virtual_wall` topic. + +![stop_visualization](./docs/stop_visualization.png) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/config/obstacle_stop.param.yaml b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/config/obstacle_stop.param.yaml new file mode 100644 index 0000000000000..21dbf5f5bc611 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/config/obstacle_stop.param.yaml @@ -0,0 +1,74 @@ +/**: + ros__parameters: + obstacle_stop: + option: + ignore_crossing_obstacle: true + suppress_sudden_stop: true + + stop_planning: + stop_margin : 5.0 # longitudinal margin to obstacle [m] + terminal_stop_margin : 3.0 # Stop margin at the goal. This value cannot exceed stop margin. [m] + min_behavior_stop_margin: 3.0 # [m] + + hold_stop_velocity_threshold: 0.01 # The maximum ego velocity to hold stopping [m/s] + hold_stop_distance_threshold: 0.3 # The ego keeps stopping if the distance to stop changes within the threshold [m] + + stop_on_curve: + enable_approaching: false + additional_stop_margin: 3.0 # [m] + min_stop_margin: 3.0 # [m] + + object_type_specified_params: + types: # For the listed types, the node try to read the following type specified values + - "default" + - "unknown" + # default: For the default type, which denotes the other types listed above, the following param is defined implicitly, and the other type-specified parameters are not defined. + # limit_min_acc: common_param.yaml/limit.min_acc + unknown: + limit_min_acc: -1.2 # overwrite the deceleration limit, in usually, common_param.yaml/limit.min_acc is referred. + sudden_object_acc_threshold: -1.1 # If a stop can be achieved by a deceleration smaller than this value, it is not considered as "sudden stop". + sudden_object_dist_threshold: 1000.0 # If a stop distance is longer than this value, it is not considered as "sudden stop". + abandon_to_stop: false # If true, the planner gives up to stop when it cannot avoid to run over while maintaining the deceleration limit. + + obstacle_filtering: + object_type: + pointcloud: false + + inside: + unknown: true + car: true + truck: true + bus: true + trailer: true + motorcycle: true + bicycle: true + pedestrian: true + + outside: + unknown: false + car: false + truck: false + bus: false + trailer: false + motorcycle: false + bicycle: false + pedestrian: false + + # hysteresis for velocity + obstacle_velocity_threshold_to_stop : 3.0 # stop planning is executed to the obstacle whose velocity is less than this value [m/s] + obstacle_velocity_threshold_from_stop : 3.5 # stop planning is executed to the obstacle whose velocity is less than this value [m/s] + + max_lat_margin: 0.3 # lateral margin between the obstacles except for unknown and ego's footprint + max_lat_margin_against_unknown: 0.3 # lateral margin between the unknown obstacles and ego's footprint + + min_velocity_to_reach_collision_point: 2.0 # minimum velocity margin to calculate time to reach collision [m/s] + stop_obstacle_hold_time_threshold : 1.0 # maximum time for holding closest stop obstacle + + outside_obstacle: + max_lateral_time_margin: 4.5 # time threshold of lateral margin between the obstacles and ego's footprint [s] + num_of_predicted_paths: 1 # number of the highest confidence predicted path to check collision between obstacle and ego + pedestrian_deceleration_rate: 0.5 # planner perceives pedestrians will stop with this rate to avoid unnecessary stops [m/ss] + bicycle_deceleration_rate: 0.5 # planner perceives bicycles will stop with this rate to avoid unnecessary stops [m/ss] + + crossing_obstacle: + collision_time_margin : 1.0 # time threshold of collision between obstacle adn ego for cruise or stop [s] diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/docs/collision_point.png b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/docs/collision_point.png new file mode 100644 index 0000000000000000000000000000000000000000..29a4f913891b3f47f60430a5137ed8c54647d93c GIT binary patch literal 263981 zcmY&f|S8l26Ghiokh2%fD=6V*HVJ1OBlQ+-p z6*+Y^3kt1Vx<{a6lB3x#8NAhWU%&ohIVd!oEmrxla-_IwjaSp+&X zeWn{}P}4W=UgM05BqC_RDO?Hrk;X{#?9p5;f4VjVhq}$$&ayn?%CfC}wr%8SZ~ruX znc!WnI(I@3hwqMDlTg?yD`54nH49JK0bbpK7`kYmX3YcvX`{;ru1Cq1q~~cC0=G zm?zMwChRCjv52{Dtoa0Ws`AAc@DssE%Vfm^zKb!=DpL5|*b3*#O;YBhl5_ZHq;5PY zMlLQc9c#KMd2MgTzhgP&o>DY1B~@&6W620aUQFoU58L=rt01T7lN0YDVefet_TxJj z-z;$Dqa}dl1;?r-EdOtKGU2#%^2?UVP0s$F+rj3aiQv`2>k(cNV3o~Y<&ed%e#@suf#8ytO<*)hqEZ+6MuN6~Fh9Px5 z@5Lcyj|o@_Q=Qt$2||Ac#-A^lEv(n#gWw-YUxQbF7Yl7sJ~1GCb4;(`$?XM*y5cAH zuwyLu`7$yXmrwk}@%?>wXF*|jVPVsb#I^yPyd-HXdBUdiop9Y+&c##yer&~Y%vS?n zD*N0x-)zna8_~z8q<)l+b;;4=i^s?|2*vghUo7VqWtILz%jDqK)wbQON*BL!Fm=Na zv%V>o<82a+QoME>Nhu0AXe=Bp1DbIBDx)zA>*t~khK ztGq%wY&_K@S=*#!DlYE5-4EK19N??|c#l>61ant5{)_-=ya|TyP zR5;K7|5n$hKD)n5Q5B1Q?Im_){{7u!DRSv;f_4Y?=%>B~YG=w6q14I0=PO5HVPjl6nb+~`~Dhf0U=G);jC7FYy zX*1;GU)r7QR-Z3j`&6r^ssX}GS6-b8h?nzGhcaZLCA5mD!Lc9BzW@)d?{IHF3+p;5 ziFV`nyG*)rX7T;ZGyJqz9!f>178S60T(wpzZ|<$5LU_cBz{(8CLu6 zIokRKWQEYU7d13QzVpOnmmMeuk=!Fl-Q75!!q?tKgGTR03Ib5pa6DQ{>s<-4>*W`l z7jf*6w}vo_XlMR7?rd<@IEFPVvdC5EU*{QjRNATSKPbt;LJ4O zR4-@jsoF}v$lB{sSC2EbC|U2UFwaj10_4@tj$U)ihYJ2IxqcCIoz_zcT`??9xJ?7j zxbFX@9850swTh}L@Ycb1?cLqoxjh`mK0WP1vZ4*XR7ALY=Ld`>)b)x3e|D4F3ex)b z8FavCtqH!QS<5SPj!9>rfCfjrFz9LVgq@5;Qz+B z7yqoMXiBeAbIfPwO+HG@^VSW5r#L&NQyOL}AUsUYyn_#;g7fbVG&e3}nQQWl;4vDz+I1P&Q>|w^*Y3Z#oOEWP z79--YJN%7MT`_B9N*8yYEkdhRhlQoQkK%cImON=MqSC>%0@|~+CFr_2?LL3EFc4{% zG)8Yq+DU5@`(`-aEB~iJryA8&u!*329D5ZeF8Y(OlK<(AIvswUHI5=jNTbp4Z-(Pf zT+?Lv^t-xeS0YY7w;cb<^er(u48*ZyGg~@SZ)LdAf>Jx1443o11YJagzV)o<7+M4z zo4KbtC$WdhuEZ@HT}Qo|_pM@4h@TnPs%^p2)^cB! zrO!OSOKv)Ad(&S``|n4)s(&D|Bup@vw?|-7fIey*Ib{lL$QKpbs7^CW`SiDDy1``W zb65Jr$IvcDUoP1chI884mq)viV?EOawlZ6MOlxr&7{MdFpo?btkw@=ve}+c!1AS-h zlT}>!i(_5CM?n&CMj6!SyIZq)C*tau9+2U6dGAy}J^vRH*MX3r?k*#>=Ih)w#^v+! z^xP)zE>8tYkDCyTn?xhUB$8E-SnA{NN%mq+${-r{ zXDMulF~om<>!&Ctu&{OhG^t(j6^J}RY%L%vxk-RZ1HAKd0ndN-)bIl>K66VhVv6JV z^it&J0|<~I;N?K5eqs+UEF92tdjB3Mtj~FZa6V!aH@&&_5;)`;>IT#cNL zr%KE+?y{N&5CXU;$AM%`-ik*0AyvL<8`oHv}zKx*`mV=!(d$sMHGgYYPXP!zCc^`Ol zQ7{wkY9IBcFN>%tsxOJVr|e2msp_x02%G;{Jhjf#k^U^8(5a-fmrg z*^0qr#;<`Oxj)NO+uE-9?3c&5VdpL_4u*D^v`kFUy?vW!Gxi`n`;9Pt96Pb#a|z^N z72lYi#W0<2LY6}EVi!Uxc9f= zaa*k4^-6S$wWN;r8JNBCd|hvEsHmz~P9;p({CX#BBAv3>__kJWuxeuyK`{FjIFh(~ zf9ym~XMiZiH@o{Y82Dz#FZ88JPS?A}G&VL$AIk%{`aJ9F3(5}(FVD^SDa0@v>^WSd zslWqu_G2GnYd&D&lCGQf&geTk6O1W(RN>2xEsnK!JDV2Wh3RiWnh;Pwdmu}i`mm3P^&@SYRVC*& z)fGnbgzdRa$#uwEFZ{~w7!_5WSJcg?dv-r}QZLdXk&S4|gMz2($akUsSYtoEtkhQD zrE}ac(R(w3|Gf`pW8>c;`&2ADf|Fs|-lTt{#E_V{ng2Uj){yEq>?LO$aa?!cgmb5v z5bWoT3c;Gbc}X%qQTh}e$Io#vp0P=vwbyd-LF}q8DxPtXnBJ7&uF%LQnYL8Qe^U6N zx6Yz*R!!_?_ed;^XOdRn8ib`RSmkzF&L$&L%3V2|dW=>hC6+Vcq?@!z*znm*l@#+G z>&Xh4m+8yxw5~3^c4e34WQGC>9GKO+NGOO{u8zpg9AG_b^~+{$j$|nLAwI9Id3rQ_ z%yll%pZru+{S%SDg>st8#emZEE3Z;AtOYOKe9|3)BncYwZtQlG`h&%OB$GMtJ2|;h z#%o%sSEg4Y{+jp2aJ;&BHm}mQRF|h}-O3AtHT;z%V zw!@{;@FVah`@C6cX5syN1J`0k>C<4D<1WE@ilv4nx@l<+@88SYzT}isv0##m)fkWb za01eD>78)wHYt5msUI)~tm`+3Un=cAbZ>GM6glm5tdqq6;l6yt0AZACZ6;npS_%01 znku;GnnZrnvK9p$oP5jX9-o?uGom~1ZQ7%5%dRvxGZmiwJ##h000Om47Ru-smzGYz zdOj#6UK~uSceQmwkMUWQ(v-4$uVaL0-wNUaO{PSI$1hhw)@WvgfZJE={sAD{2t z4;o6A>MtDw-fEc=4B-12n|HAZ4>#0i%Vp?uFf#1?j!o{zNpa;@x$^QN6*#~qJmCRw zCqm5Xaf(vfsC<@hk-EznDE_pUJfN9!z-WbG=Hx_3PW^jxbBy4he|x${-a9vd8Q?I; z#3Ra!^Xag7!ro?QN(#(3P5DbN>^JNYY?#Mf_al443nQ|!wBLQ_DG$J6>=1zh&XuPc zv}NkSX*$k@f?+M(AY+nm)dT+4Qm?|tpL?P3_^2(7yH?6A0)KiPYu9C9BJDkL^qomF z?iAMQodfQwi&vW9@6vKAc;d2``sQ!zCd8ps4~~2IEtBtHu8irG3A44o_=cWw?nnC$ zu_kzH65KddYQJ=(;SiQih`{$p&8s#QWydp}FJ)VF&@6#v*txnWY^oKVq|CKs-faRDuHASTll7igmj)wHI;y8&QDAmbgI}+3&8qUqwX7E#?#vIlfQJr-(%^v z<0CZhngCOVz1*Cs?KwS_UfiN3KuJccsshp0?IxS>_G?wiV|B&7QTBp+JU6=yTMyp+ zekXK~Bj{TE%ki!|2nqc~`^p^nn!()6t>H(4@+NK*fi7nbxm4iTr-TRz<=D*1$vwXP zE0ed?xJOk3V&vJrRld^gaIF0r?msRL(;F05C=|v>yZH?zFUC=7p+)4>-$WWq(U+=+ z!=NFVCwuDXrv3J_qG*ALq-L@F5|MR<<1Xft+NQxC{-E<3_ID!Wh@RI>K3rhgbkuq; zE~)=55Ww<_TWZE8p-*MYQZ`kFsZ#V}rJm)Id=5|{b^o-Nh~kmc`uOS7$AQ}D_oI$g zhI8H_XbJtPg*rG{gE5VlT?Z{OYi1=gtmVn95m7p|Fa$DH70DHs#msRlBW9y*Yu=~I zxK@j#m}=H@vMTqcf29+ zi8;xo_wy-TOxx^G5&$HXX|(G*OH>?=-*V$^7UKP9Hs=|H+ReJnE`>d^)AZIp&K)y@ zd;Iuu=1(WB6cJ5LbukeDd2P8p*G*s-Wo>_g7j8|J84|OHvVO+%t@0^* zr;mU3STcEQ5Is#JT7V@=o;w!+m$|OWvGMo7+!YI(r_!v~v{G&Y^dAvznh9lu662(} ztlLQ=+nV)FclOCp39bBsd(&YnU_vD$U&pozXq!ptisU?`%+vT@j}T`)jljhu;msS; zN$lXIt6u-)jKM?ErTC!!B+8A-aw(Xjs)M8 z_rf07Cf(BZCSa0fck8z(@6?l24*TH52P95fHr)h`C2`&KoJx6Xi271}mu+&eghyRp zTvk#%hijX3Pu-uTr9jvQ$klHI)=uQ|vU&g1?j(w{@7{cl&tR_J{oN7~2MS``<)fYI z#Sq@rlZzq%sW_(`6WZE9L&A;!ABi_;&f{z(76Di?rJxWg&sN5JMdVdfI}ifAJ+x6u zzbwP}_{>OzxFZ6jdb^=2>3_bma#&KBP+N}Ogp3YUMZ=vc`UZu2o#KXA3G3kKHh>$I z*uTO5It0fAlvI;Ubnp*`P}YINXxbyWFjhhUaisw?U3@k-cMk;t=2=!~o9R`IWm?;0 zMTtY$ZEMQA$k77ltPF{MHFn)!#cd#y$W*>N6%bG?`$>4`A9L@e5}hl9&s+PSSY@dp z@Bc2rFDJH4A7dqL@lzpludRE5g1x>T3A2Q6zq<%XUp0hFAo+{oSDeikA=)10y4Yq{ z?2I%@dwUMi$Ywn=a58Qgy%uc~3z5U+FU#(+G39-gQ~b2NWd2O_*MJ<0SIUS0LvK=^ zQ>T@3^{Rc5^pfpV@SaC6tPr4ZHGFaJZ*!zxM`~&s#}O9e3nQctHuDP5FxJkU?oIN` zJ~alBCnZVm4HQt4`Y0Vf{OYzaMBR!Z@4gxdqRP21t1w)O|7V$x5Lb`mHwgG;h!Y9Y z#ktKiOT=@SZbrb;XPq$&;uk9DpbYu5n6o@;CGBHM^NEduJjt3FuCWIB!(D* zqX*O=#-`wY8M`U0WWN*f-|7C7T0hu&9i&B!6Q4i|)xF>{%2 z*NY#{M6PSeQ&2eP4py4PDt}piDc?bKFJDm|pIr6+o0zp|%1wv?rgiac8^n~T?sOf|922vrR}Brj*`m#lr3haWvu{3{?*x zjIH+6)DVMtZ-oT&5tkrA;^9?*1C|3JIX2Ti7!Uq2lY%kbe??&mz|upn7yu`i>hoF7 zp!sIC&{=C{Q~>LEcLKPZ;4dFdy7z^EKKMg!B!{`4#&|$vq*Qll%RbYD3uH!E z*ab8!n%KI^S1fW~`P?uCQ$RBcdAS(eZI5(udv(@?J6VQ)U`SBxqz$<{-CSWR8R#b% zTnKmbIF6sHwlj^J@1ef($!A+%Zsj5G=yRSSVUB($8!KW~HH63{EkMFxcp?~4c_6Z* z0C-XNPO4P@Rtu$AN}`HTGsS~}X2BD3&)mBKr;VIRPY=d(n2S=VeGoSRV!h@%*}v12 zNp^}ZFMl*7oXbs8SXj5l_76S$VLBiC+B)i-fk^7Nn6C8>!Q(J5qe(;!CTMqgS?M5;@#B|<#<>o)Tm#5Cph0zBd(Fd^h>+>wF+n**B! z#_gcOX+t032h%3-+C z2O#rb0uzwHLiqPFlb1@Gnk(&@rtHB_O-OUH-`M$PEL(M0G{VplvFusA3YkY&v-)Zg z6n;f|SxxH?-o9t?EL8IhcOy5Z!1vg`PzrU59<_?X9MK3>H6jO^pMGK|?o29@NdL<* zbX+i5dP=$p|KnNF@RXMb zc`XVpPf5R(WmE%>k$9VxYwxv>%+J_dLpPoSH@^+TLEk`Vi4Vv9nIc zyGb8D06j!5_YI&(-?(Hhya&4%{KHGaw6a+>(jU-5G{U9&zbJD`xo>|hfmj+DU1r+6 zCXgwEzT%mX2~_JHBG)TN8Mddf9Hyi@hpA<}0DS)+r*cuaw&EO2TQMI_u58XW_IP3% zmC7=H+`tO%^IO5}ztoLNc$G4XLzOqT= zhzleE#tsh9N{-m+xSx(RvbqFl?S?$3nTMJE zL-D|3#A^tv8W|lh4HKCXk%5d{%G6ejQhewvj*=5?n^^VG2LI?y|75Wz-zt^!Ufzl5 z*fd2*99NCSTJY$8aX5>^OC2w<;$%ER^5%JZCMeFDx>R`G6FH?@J*!;Y)8+W$SmMHo_!J{i*^Yn&XYy@h#_hI3BK zf#bp3aP)XEqCa@HEoYti#++Vh0apRHMJ^lCTbl++5rWC2zAO@nJZM`9*=!(?X9r^$!z2vofc z6I`(qUc-gIxxyW~IPMzITyy7Sl8BX*T9D@S;Y}l^ViABK;O#Md?{vP;q1GIMr=B2F zQm|vOul`@)c^Tln^sE7LDi>p1vgcY391z!8&yWz`BfkYB8fV|NgEPC6Cpqt*>r&@O zapHy9@b}ryMA?KdrLh0T{b6Ke{D=})FD0hQj`!^qQj9}MU#tp#*J&3TWm|=uP`-?O2R}2)^rJ@rq zo*3r0HBc-nZE3)FUb~38llI#NzBx+pov8pg;96(S?X8ticJR23=r@G*WL3vxyzA!d zVu}LtdqJW0>{)U1n40|b*}7ncTrNAos#YORZI1Ok(-byKp;Ls{S=SaXs3M< zmHYF?tyEA(TABVsqg4d`bzbVD2UjcWb{(jxSZ~;0v1&G5Kl5pL6KHhaf-H1S_}G=7 zKxHpd0xP_J<6+lZgBYwN`oY76XFq&C3dtmI+2TId`#OYdFUEE_`x|+#izPJrjNZIfZB+lh@Xff+$vxb&x%a zl-mI4AWEaYE)F1|!UGB?2V9udgyFe`R-$MCT3qoS4IjH!ECL?lw^{e`U{?8K93xVJt*4e@! z;`u|ytH(wjbw(1=voZ^B4@0~T_Ck1ls~5V@_Tn9Ng@jBs(oAwV%IPFlC5urz;&@Ly zP(pCV@39r|<)z(tKvy3Y4m2KI920#!YjYn!MJ@(epC|b$rymyXN~phj@R zE4yr}#JsA}O|tfJS63Vcmk45sHA+9;w99&bX5yMcezfWoY%db{G~N7U2*NTDMsLv( z61JUBl-2yuPn|wjSW^>VF@Xj+S7g+q*YPlk{K(!{ih2040_i1dsEjx>8)R5*>1vMS z^Di_ug(NIS2E^5RJildVk3E^?Go_i*bAn{gv?yoE)B=uX_Q;xPA~-xf834T>dv${g zYd)X*pLW%5HifL2FHq7S%f);KzB_xX-N8(lX$w{D+fv+dyBw)v*<>?Mxb32Hnm0{t>sQeTUq6%w$#1pYixLUo$M;JUrF6cH3TYD(kB}7#P zsJQ$6)^gSClGmEJVNL(3QNN0J(R=_j|Mc6b>DF;)A=&S0riEG01~Nj-)>OYKQA-Mp zRq&c=_8|7P2V5})Av9EmVFS$_^`BkAj^M2-Y9ymtwjAX~{V9T;qNFKp$~alM9Vv5wqpWXC;h5OC(pZ9_;YgVd|T> z8sL_b7Gh7HOt(ZZfFHW)ZiH!AF*r1@XxUuB(y}=aHP&Ype#NkmoruKCT1PqA>b$Tl z72QaDeg9@h+Eu?JtA_KYE8hLY+rL=HN`$$FwzC7DI8AzgG*1X6l+ zpkvOU&{M@+exLWFb!0ylg|kIT;HxU#P5WPS>%Z>`QMlgR1hi<_>SoZza)hFPiFW~V zM9YWkOYT1ZQ*f_)?#$!ZhfesTv4%gSOMjo8q{=|g;>k8bXzf;#qv5OH!geh`?oa^Jk%=D?X+k;)?ZS31S&0!2&m4Azpy`Uk6!%!YQSak6fo?)S^`X{@ zOB5K}lv8+LtB3==mt0slfkftUlK_a=lHP^?vl5RT^*Rl{VXCp`lXPo^huG@3&#XN!%Y->9y`QGM6*pHGV2%;& z1juZlU?Qkf3fJsBSr1f{g$NhX25;X-&VAszboe%!P8;klfbGm?wn_q zCMzFKs-OixI}{g})usQ*e8QGQxac45(uA9g| zr)~J@+4?BrWC`JRa=|dx%7ouAGt1!0g!5#cI{5B+g1I*zcz9QY3nEkCEqI`%ICvNh zv&=_(RAV(B1R>vBy3RcO0iAkJ)6jOvzHjb;!$fd!qAndM=@T_AZZaMDNe~8*)ekgg zypTDQx;Hf-NdcPH%m6SZKnGnZjQ~NyE>UE&Ty~auRWE!KGW;fz6-*J!zS@Sal4E$Z z`@vHW1JK7({rIP|d&AuTL;E_Goyt-XttXlizG!?2Rg~FBM@xjw=+s-0@XZ%w_n zex#Ldv&WyQzXKvU-)%24MWA!*0DKJp`mnBhF3!7}kb3Tjvm8%cZ@_PXRAeMg8}%0( zxd1EGVFl*Su7974nQmY4YXvi1l21)_Iq;+KSlFeSSE^-cYSO?@Mz|LJ3XQa_XA8Qn zv+@>8>vGr(QN9}wewI3>eP^ZK=-pxLh$lii+i=(T-fc|1G_T8MuCXVnzksr37dhA_ zpb}8CHkl>m?ctz;)7pGAAP8(Vu?3z=M`UOG5$*g4qw84?fZ4uV3(o!tjtwjjETvbIMeaNR7Cr+)?RIO^#bKx!oPBp-Ky@|b`gO1EEw1(EYK50oBk);+s^)4{ zD?WNT8e?I4LAn@!pDh)H3m|e=Svt%dE<7z3>7)gehneqR9q~wL5O}I;L^BG_2uEXQ zstnl;iTX{OE4C$NA|j}{rsO`OhLMS$KlpDh?d*S4l<LfWg!P%~qQz)jH(u_HG7>o@}NRG)=Q?M zVGa_x^CH0pi|bZvyZzl#(U3~V+VwL#91z~4n$^^^<0UZF%&^+(9<~oSXHeq%nUPnT z-p2Pl7$h>TBNNHIPg#Q&7V3JSnTIx4e=ReV*PlVV_N#1jcW692s=Wt4y)d$)c%RiY z0WstPJ4$bO&#xPx0FM0vmga1Q-s=ycAv{WsYv%+dx}7DB=~av!z{#pB$Clh@amCg^ z;}$RXOp^DKree;kGb!3){OO)!`;4TkYus*0zy+1KWgAG~wR7xZ!pwTTvd%|@8#-l3 zQpLaTlW5-UCC##Cd66gJC2;h6PvgHiqo#ZI#Q`+ZSUO{8uwQy%F-8XP%Y8q}qek}z z1LB~wgt>n7izuK>DqDR~e#@QvzLNfeN37b&&DVX<3!A_mY?*$m1itVucZ%+{0BIte zK?9z%9~}h=n!RRc{CcoR+KHf<^#sFoWRGia+irx2q(1tgaJmt%_M8L> z4zp{#@v~ZN^6DRld?$zK&XGv&!M1>38z=XlKDerfIbxtb*(fTMweAJLZsGmk0&*EB z@iD!~Az^5Q#!1&u)@3<{Hcv97d86UZ!PX+?P;9=wAgJ}*&CR$wBv;Rt4>KS4vCTjG zas1&KUr9gv5KG|`o}O4h$^XCf8_3Y}APpsc9e@3ptoh(-NcAmXhf-5h$z|WviJ5Qr z1%}ama^-399O4Dhfrf<-$nWlJGNxgyW&I5N#$A|-_QLDnA$~Pv0g{*yxrCc=C?1TK z=KIrNup~!`?Eg9|$zRvk1AU-$Y+xKw8BNKnnFN1iI8K&u5e@4~&d^xFi z=Ax`+cdj6Y#fZJp`i%MVBJGuy>kVWyh4QVNS=GbiH1(a8WA(|g!b-05yP`{Dh0R_J zfegbqp9i_YlwHk7tZH|zDi#y=H0 zJZ=VJsp;vL-xP10{pmP8@ygG+Fviso17b5RNSz93e*ZZx?NK|Et#-vC<*SiovuA#) z(uaZPPDsh+^>xw}>*o~aF9gZ&^|{mlQpwe>fu5P2tc-(Of(!N0lQ&sihu2}>K<8YH zre>l<{$efG6%%jX zxP@c=$lhk;PYx)SrBy~U#UpUC>Ds1#3A$D+Inba8&_%hS(manB-)5+fjz*-9u(0>t zI|U&TDHW*x3JJ}ms21P#EP}myG__AgdiwUE%-JKBll8Y$a{jV{DgEzfkQ$yBKC_g& zfK{jT@tL9e#pwxUSgG_9OS!O%7#&Y!I5<1ETU9RDl+wyt%Eba!vyacC^yEd+;k{)o zE=+Q|v8ahUWB;O#H1rTa}VR)}nUCV!^$C6IqEWI7(A!BLk863Q=XWiG=r(-wPP9%Enegli& z6H8dDFlj6(NV#Q=_uHE&_yb4do2II=p!i#nP=c}by<8^^Oh*3xYA4)Fwc1tq?>=W3_k~dNBs!bgFYjYfl7&z zo>0`X-AzCc1)Qp0qFs|a;kOZcnmmx< z)R5dZ_M=VrMr=3Fkp#t~T?I@lcD^4vyng5PeZc2-CzndJls#-U@0W{=x3t&b(=`6I z=YzOF%$@fh6@s*;_Hd4)Tc*F^Abrc;!D2R*{ysMkFJ(9ykFjsSJi@YV{?S3FZxFr+7vdmYqF>kQE+vY4ZKUf{3!+WQlR&Y`+fup=TURUcQC-Fo1SYf%!jR6I3aRKO*h1lqf z3zHAg+Y}fKZY`=Qhn)(ueyD6M!w_irjU+5ldJN|!sLEg-3x6YQp_4t_5&dxE z$b(D)xj0kt7%^14snP5@Ga?L8Lew@TzfS9aah7$6gx>X%f)E7Ehb!9C#EHxwT(R|vk# zeHet)vj)^9NV&0My>C-^_77T6Hbr~@%ra{u@AoKnI*43NZxM923fep}1ULhXoC~5@ zd+sUb)(3s@b}MnsI_G)}CW^)#!;Yb*1_WB_#FM$vVR9 zXv(ucM*%6s9D~Pt0@j!iIIfHr7^j8K`2GJhiEev_x(CJat$OFuLsvfU;R4QRbB#Yz zFkTL9{PGo%lmQ>OC)VrLCT9|eXv95gpT5w?VL{Ywvq(_OnkCt`%@W1fv{T=`J2PFQfr{W8-7h_|#7rqvPfVr6nNPq= z8Z1+0Xx*Fh9ADcB5#nfM?TYa+lYDyI2X>9 zsFgvszlGib3T;-MxMlh`M>!ZkoqFFk+j*PMyMCfs$86x9OapD|BH$gq83z7Y&X{vo z^`)b=c+uE_n;`=*gi@U`H1)xYA@;|p&@3a~RSAWcVj~cUB(Kf-hxLd{xQ|ybg{6x@ zzIHtE^p~*_ERE#JxErD;4=ZN*zA@U8c}Imp*5SYIL0zkkZ_! zR@1_n4;YDtsFumE8CcP4xgvV2O2c!CMOk)|o3g7=0zmo;_bHpvQ;IAtk+~Gh&dToy zaQ&9mo*GrGu4l(-2qzmFAy@%Ws${XC@x~{4Gf()Z?$Z=gyQ^bc@GRH~j89jN9m~l; zv&t0z^`jdQ-XCYvIcK^#V~DfsCD4uTawWcM=ypg*NCR%x6Trx+xY55Z??(|G0f32l zex5ZiFYlG6%l{0|;)3$Pbs<0?ITv4xXAJg#wPJ*ozVuoU04P^e(?*m*emRsE@+F=v za!@#ptrt)J{x#y0InOnqq}hm4kLZ&$i2?HV@PNzA;n!~q9n@TjLz^@<-x|pMjOuhF z1LwA+*8?z35%}$m>UsNg)Dqwr-xFa2;;@(lvay*urFMAyiJv#`l~wigG9yDv;A9~u z>f<&aNAqs%_&(YZ=Ts&HN4?Ur&}wY-psB<_e6gnlGmUFbb@hcBir{$eTePN*u1=58 zLA8Uqo^VYO5cmY=_Z^;BYQZiV!ORJ-^e$o0kMcO&q zx_H92S{cTtn;td4NA4_1ld)s}O_4`Ab}o&LV7BY-EM7pX-`M~mgCxY@i|%``q_Y!~ zk&yw);h&{lcEk3Xjcp~ewSwT1C#QDI-d~MRCZUY^+9afb*Dtwb&rzbfSqUern9fLn zTV8^tF($x)c5{0XJAK%sd!8CYB?Y}M4|%GpQ!VCQ{aZ^87;m0!B%=;%&dBHbs)#If zJH15NRzGM03i@zng^6fdSyKNNt9_keN8e&Lt?yV;;Plcfs9d?t<0mpqo~4r3fb~`w z;^e|(L3@gF4H!lE)|V)T#f@xTV{OM)L!qP-_<|iVpIa}Kh4w`;o16Cb_CNYIZz&dx z%gt7miq-pK=Mm)X*17o8P3MLTpa`2uWbrBu@v;dL>vdUu`kFzgop^Z@y>FRl4%SU@ zHc%KA*0Ej`eD~<|DktRS(C)(N=dn`NXd<-PCQfLjm-h^Pz#BEnx~ zW~Dm%?gsy+$Tm*3WUOL`g;ji-6@Femm5lL#4fJEy>-vh*Qd774S$u(2_-H=y z8TqL5dwso<0m5$NzZc9?Ohb=>x22lbwq=pHDx*hTMcZZGBne&SOlcd9tyNAu){z z8|zpImE1GkJFnu1HGyWJ z3{VT(%RN2|r-i&d2Wv$ofE@adi{YR0Kql=brNtwcVBu#{KJy0p?G|uFVrDg7S2sHq zbQ_;p&RbviL%l#+3ISxg)Gal_zC@Ib=#ruO$Z zp~FKH;RTgz{2B+Rp2Trht(%*h2al_@{Lh9K&(^lckcPNy73!le!E$%k z2}A9=RSN;s+Mj5O8d%2Jq@w^`H*jWVM%DA<1)K2q;}|^Cz2ur;Ze|%SJ6L;*Man&4 zt2d|XcTYIri|G@!rbnqICLHtR5?vBa;e$>AF6L6=f}W&Tlw&ABYR)bE)%3?~e8Wwh zBYXCXyf*`mj5Mi-C*oJl6g59D>2_MwGqs&;yq`h@ z5mt-=x>thvS8zDk#6A^9XUXDB7Qv?uGI0MP8MAi^1tDDl>s~sFO0LhMd>#;xC%o=d zr(gSt_lT>5cR7)kvNIRwb5c+3T|)xGI$9@cK|htGI)NPm9*!sH1vombiefG>edA8!@V!c8K*kr!a!J8^~&2t zFOp%vjgEGXIFY1DHEL@A$Hw03XIXwauG{-^{tml<(}^sL>>VFuxD&hqXGoMY+`LUD zy&E?b&f7megKyuodt z@qU3u=2jiFqfxxZVn8q4>3Dz24q%TOcD`CFs#7H%<&V<(x%SQLOL1|_Av&(Yz_INF z4P)&jLSt$9M^E}k@9&ar@i8@db_M*7 z`8^r^w%_OcYH-a#d#f4_Fs;RPFa5fs_n&2H52=r9@4c=X%dQL?u4&h>ENpn1%hR&* zSihL6kW68!szY3CEZsRR*V0M?MFe>&0vL4!J0owa8g~OzLwr5`RHt zN$1mcYD#C@V{o2_?-y}LPoMM%y?1q;n3*t^NXx2d6<0-w*b$DB2!t7HXqM7QLI77B zJGg6eoAoDSt1aqs-(eAM?}&UCzl}|q-WP$FZ~@vz+6+^w(^oK5@SE(vUI1AHBF>E^ z57ATh6<+OZ(4173K`W*gmmCNySd@!^v;A;0Zq-vV5OZjK0=$A0RrmO0=Ir#thwE-E zZu?V@Qk$0-l*o>_AmcXXb=zATWjNXYPkIWSs*l4?c>?z%zadI<>dO=4t*fSPnkQ#}<|M@SnKl4Y zB_LP%!aJ%QSm)FfD4d@zt8LO$)Mfi<4cA7ucWkaBu3}bGyKr&8OpCj72PA`MA}>{F zIM6NGh?>5A8)C@=KJhSv1)G z{aZ4K98OrkDY&SePQ%;Z4_syH^?<~hvs)_aCU|owQ|4{g<}1^|W{Le_WJ6JcI;a(i zkTEEd4h}3bJGj$|A$LLe;Ol*HFRULRmsCw{^!9@YG#|8nC2RH_#zxaS>?vkx1f6Ne z%v!nm?1a=mXtOSzu>~0Jc=NEK`&HeUNxc>T{oAnT{a?F(O(WT@=0!87Z?pv|68lf9 z`6fN9rs!X5QRy=8Og1e_^f<<{w}=DIkFdsBZCJ$>Gk@Oh0hz`3qyb#aexgD0Bn95rP-}|3=i~b;w5pK5A;@j zbhB7{9+e4mLE;>SJOP-*z=96%dA48Qihez2LRQit@C4~%K)M!1C)rpz#(PJy25wpo zT=Vnk17N0QLQc4j!mtYn;ksh<=;3{%ik8V+xx!xrGpShHyTZNaN~O)+pr!^`;2jTpKne=G(62d*iNZV@MvD_G9 zkxxYDnSI6C-~QG$h=mg@jt6iu!YsRY0CN~q6(F;H|527v#!NA#grjTd!clX%8>&$` zh%cKo0XLKC`V4gg+y}ooI(*Z!E^A_wgityg*`41NbqJr?YaGWEi@8VipcbnR*VP0U z^g}elv$f+4FV`><4gyYcdR)eh+34ldMY4z zC`|2VV@B^=j>W>dA8!;_!Ymiq#YvbMrRGKlZv#!;*1a~q{Nb9BAsKAxB7Rl!K7@V% zX&rFwtlhLpY+!bc71O@8MSOO=#RZU`oe{S|d*F*Q7oBn81O1nZ@T!p{ZUzxm6q`3r zWPWZ9@q_Y>x#(b4j?z)&!JFua441`rob{#0TPzaoSL493k$bll3m(s}Pv>5ZZL4st zDbo=O^cxHQO*+AddF8!(Mv>@h6$Osfafr?Rdg8o;wV(B@ zBd2jZ>gnP2<=@p}5neix-|H6m#LWLNU+fO|EmXT+kBw*!nz3g&7G7Qf`LK#s9r8Ie z_ey*C@IH4gmN0(kTLJ)PXL@^PRdV~;x`UPF9~ zD1%O8bZ%#BVWdA4s;^)~PD|3U?Ud_9)BQ>Lz?CtamcA-H>#1*qyNVeP3Foq zFD7tpSQE))ASRNAt08X=#)_y=7`;l>Up;DKWG164(_%MQv~@b}ET6DhcvU*|l+^q> zVB%d?6VXa-&yCmA1QCIw62Nu6BkjA@{)5KwM1p@>iEdz}YK+X)ODnvhIVOui%1w2{O3xa&#I-JlXJlf*RdS2n z_%W*3D7MS2JJ4*|N*RMB7PvXk(8#%L3S4#Avyz+Y1iP7%g4n#%QC>T}Vp5*_kw(5J zd&7*G7fSZukN-#2cYss9$Nwi~Wfj>YT^S{#>{*2Doskg|l9inmi82dOW(e8WI%Jla zWOIaUI!2sh9vtWRzjg2L|GU5E>A6q$KHVqZbH1PV=ly=IckngzQgm&jwY!y*Go>bs z*~*weP6-jd;L3^G%)MCteI}bC!`JBi`$IooK5{PRV}7V6xb+3A!74Y-1k|v2s$SA* zBO{T_zOl(k(3_Ymh{@~PmesT{fjmgFFtY2uq8`0_K`t_|Z^y}Csx|AQ1od*H)6a!( z&cjaA!K= z=Ml|?VRZxbCCUj8eA5Ae(YjtGV&Wts-6W{27m#=j!DHsn2ZY%jDJ z{oH`m!{9Y&6G5c}wHW6R9=^w%Bc6> zLA2!9+5nAB!z`!1fN>Mjgm%V?^+twVcV}-WC#; zFECT>&vTK3+e5Q)9P)L6Kb$@*?Cyb%?M=ktq=b>s`IUDU1Ln#7Gu`Gd^&^t z2U&(kp3pp3WPaX7<;YN^0fO5f{DFFJ&bem34HNAKC8Iz${G{-^sQ8P=J!01HezctC z6JEz+3I52m?5|yeqR2FdA#{I$Dh4kj&)vax**c)va8sOp%ynpdPx{hJ>v9v_q|>WA zEcPT_xyngo%%fvGNZlE6+07^$j#MC`?U1T#vLqU)M-*uQck;z zmj5y($9RrHy-eESZuttpB)x;hWkY`_nyNDfm|rfSw?JX!!#^P^ZG*S%3a7~m%zyi8 zzmyxKm5HyE&GFbk4T{=bEBII#^@^3=G({w{2XyQk_Bf0$SySiBUjjJ-8j%&;-CImg zQhgs5SGyM;?x>;tshj4NLzC)C%aO5BeCW_s!ILYKlkC5?{2JT_5PQ8L`U}e1DLV;M zWkwB52_WH6=P!;S@=5C8$8ia2lxCnja);@I2m1y=NsYBDV2%F z&`llFjr+=45s_V9%ij{<)jF_rH7w@jRGjV}TR|@r zbLwkc8&0L9+b(~&kR7^Ex*~jX!yQ1)4yFfN%rf<7q$dW%sZ>@sWNF^;w64l*BS>wU zac-mx>QVPy}s96KY0I1=OA8 z<1SJbC73`5b&T!XaW8fw)7SP=W;8b+J}#h8%97Q+;+d_+(rJY`TP)}sm|43%%?TLBW zC!rQEgAQ4*i|z3yzF}mQ$0Ow=ViVX4xB@s@mz&3_(vr`urI5f>LeCBxtZC=RVWUnTF6;H-2KI|$o zE}L8Z-foERcT`A)``zom6QT2@>7JZhZ&o!2Z{0-cd_cY31j3i8Ro_V_C6A}?`nQS; zeU(kdW;s2J{3uBx4sYTWUA@G1CU`mB#k4)>E_CZNM1c%2Hp@NjVq9~y_)*y?#e@U8(8S<`&9GLP23VuzQ{}3w;thl~c{5HYjf%%57vsnm^(l+lnkkRr|Q6p2ldRtRX{WK?z+N|CP4*;4NvdI-#5Qgh*Qp+5ACIOn;McDH7=+sr|#^$*UWdO zu&|}x1Xo^ZvW=gUSa^x9aV=vFy0Wc-MUspry+tV*pTK&M)HLmM^3nCU}$gdm^L|@RNkZh~+ zX|x=Xt{L46M!9fl)@g;BUMVvt$AeBih{`yjp=Q~|#qMPIou@Q=eLXl_Cy&yQwir3X@};KhvNzInn+#DK@;)MKYiT(yEGyuL z=?Rd}7wF#Dx9YQCQycbT2Rhfa2HZS6L*!GqJ!#*#fxNPaPh`yzU4+?_ox;_>8#}!j zCan5r^!vd_II$*HAM|0%+I4jj^qqj%b zUWFcYG)o9H>y)la%E{T)Pg*YHwTBV`*PsSust?7Pd!Tas^3ORROCto6GY|gp0Eg99 z-xp5>8=K2d54?D*VP!SD=?WZ2Q8hqy>q@%@!!8S9EFzW}ImZz(=~E#=n=;YoS(IK) zjwh9t-F93FM|SYr=-LMR7#RhQbSYm*<908wOM$M|+b(`rFazyHWnGSSAG1%gtjM{tG1;05|iO2>MWbYJzST;%aaAsfP6yqZ2%hz2)r{$lJoLfE& z`}BASakw|s2T5k|UGX+YM9H)!ANRd&`HxdA{tcK5pnyTKbam?E@1e@E-`e>aR%K27 zJiDH*2zVi4#F(dS4=_G&w@D6OuK5Z;C-7xnDNT_hFQI0FO5DVgBR?-9?- zK5b*#Je+$QaRU$&42ap)9RrT!oUS@Mb$+&DeYT#z7D&cq3n+pn4_(^o?QP(Gap7+==-8h5#b#kC44bOf=n` z!R4Fg1MFpdUU^a;pL?%6zz;&r1a+sYjtpoat?Pr_jXVAWN0S41SMl(%(f657!>?QL z?Xy0IB^+Byo)(>eQBBk}ZQ`>Oe+}fQ2H-`_BbOaERXz2*S?#SZ%>2uI^aZ z3z*H=BZ)^7Nmc6oZSD?}I!w=O^tBG&`>R<1yF7_il{ua@&gn)9pW%L)MRrN6S=6n5 zGCPJ#Yj6Yc;P(;IR=E=$KJDXuxpYd8EM(_NOm$L10v*^p3&AMUV<9)g8n?e&YuUJi z<2nVGs21I(tbK5B<_s|kg`&)))}^QrVCCHq8qGAc`}`J=C&vkr+-CGSQy`ukP?t?4))m>^g8hTf050(9dbq=&c`Nf{a2O4G{8Mu`j32J(Jf8YK zn5x)(e`D#44(8Qu%%AZWKGk7ox;ZjxwKenQnSWqIs(e=M;kDg@K8U_5Y^eG%_$;)I zJGoG&g(=7#Q+PDgYY!r8GT*MmK^j)T$mq$Jw0 z#LnKHcej)^<_-&5&M{>ZGw|1TcXD}=oYoxvC){q*`VM98M^k6-P!O7(4!^5d6NYAv z+UI>_e;tXrGyhWEURipviOLVyXlJZhmHkg8P;4-Y|G-~gUk^H{X~$|sG9r}R`wr!V zsZMfh)K8{bp}yp_jP#1JM+aRl9+&n=fPQ#6%jCjaK2-mW53BJL+3skI>X=wKK z`ri@=X`C8^+}1um5j_tAQH?EA{#AF}TV%T3dadtvd)K$~DW`m>D$Q|BDYrZx*z_wc zOZ3!jqdA;7!<$@6<{y6#$QU@Sx?~elDMF(7zKjmlapm&#*{3vda+=qg$5?~#e^-|} zSvEdVPRav>z}PCV9a?M%>_9lXdN*(`OioTG=L0Re3)!C5^^>tgB>-z^jJZTy$~M;w z^07F4%--vlwu5 zujpEy-6c+YR;Xa<>r!G@Ujpf=<)yr8ow>;Xf-NRnZGy%pHa7MH_U`{4fETR&tqVRG zD4!q{*Qu&l_Mdj9yZEWA_V)I&!5g9WeZjWXmRVI7g&r%CEhyhK(sH<~Vd1(gt&z0& z!O^>%&46Fi=JqCiLL1IXfB|%QQ#RWfgOx(6hFW-!8^&B6Ka%w0Mf zJ=zEcj~Q533JZTsPuq*924c#aCVE=Uo$e}PY)@Dkowpdxx|jBCRQ>FMybtF|isvh< znl{Zo8unL_-c>OmK8JKWe;n@jF7_RFm*jxLJI&+hGtk4x3IzpAEw7sOE9?d?O#3N% zH)f7P;N`8^CJ*7}*_U<17NZbk%HqF@n{s_Bsx>w-VGH#SXQFxKKcz3zH0^L|jH@ro z-|uO!SKxV-D6G5t9BuUFT(>D82%-H!I6AJdOd$A9PLZ0UbSZ%P5B>5fmi8oK?PK4= zsv#!l6T*2p&c|_czt<-6AIrck%cNvv zR+BZRgtr^3eRP6-EM$}Y){p&L|Kx2}QgWXBLRul4<9zoKtJ3<6+$kMHVQT6{b=zgcG; zC7M{vV!lrBj?vx?0|^L+NXcU=A^$?BxO7FAvV(iWUPh<>p&kd26--L;ANFQUOCdyQ z>t@2V1>>s8T>0rLBzJ3DB@$oa!l6$(ck=5HBnuUtHv=ywKMe;P23nwszWd9w!i|#% zD$}I)C-DNT`7=c4=<*R0h(<%NbFCnb8Y3br@X`4lD?!yHLGAcJFLTtb^o&HFC-v8j31)s`F3uDw#4FoRBRggZUAz$vBfivwLUx3p>s zkD-y&t|loOM{!;&K2L4w(SX!TDu$zfX9LRzsWsU}C@JG_Fn? z&=X>D*j~_T-!e6l4LUrnej0)~z=(4!rWC>+?g=Wy-2g}2Zyq2&ym18dj8fVUIcTN%0>6F5&pA#7aXM`MByFoP}D!Ekj=fd~?v@M(2iN$baDAIeh%A z6$IG<8M^q`FMl?r8XzjQ%HJ2wX+ru*bDPl79E#{Hiodk<0~qq-WSnqat6>*~{{iy1;o)>uS+8#j zw1Stl1noa@J*{R(K~{E3{37#IJ>jHEgEa(QfU4+c$Eya2p*UDG7;u%_G^QBgJ2VD? zmtGlxiEapNI9ppD$5C&cws+K_F@nPftyu7HlK*o}PQP8Dp2b=iUy($YBciqj0{7N% zYA(+eot|MiP}1;X3{4!%OM9+C3LY-%Atj1kB~@NvM{*6LX72KlPASFC&`2zN-D0#+ z;=4~Tq$M~{%r&a6GX3CDJ6B{J{b|T!4%g|?TW&7652gBti#Q+HdSOai_uF6Gd48g| z{e(Gx`~7P#yZI{FP;3^Xfb`YN)Pu#g+(ZDT0mB5zjgsnF=ltGJkhc+2jR;Z2CzHp{LMw`<;sOc|sO1J*Q90!S+HTqmX5rhx@W| zN}jF#fraIZebmdh%jG8GO#FE8_JSrKnSDF9MjA?MZgd(Il8?aR3IbasfarN)rL+epL7u?Y^O zT1l~P;e(wsBrAi)ON=j(RnE_<%LUta&{13`bP~cqtP~(`udj7G`jaV@4+Y_j&JU`M zEvnH&>m9|c-tz<@4*5;77sjfphnuTqt|h($W^s(+|9cgL(KZX|@tq7=7Tyn}p_!BJ z>`oRsCh7I>h&oUBuy*FY?3D_Q%R==NIhR~Ir7Nu+?SsswzwgI^vJSkUreEi!Dp#=F zR6*Z&`CMu=5u!S2Yir9r6z8SxzKC^U5SSupKBvW18Kq=J{~9SWrnmd@XcwT3PvtXIolAini0pajSYYQMPXwpQ?v@} z5xf2kz@o!|ePomv^vTUfcr;jX?i7viN=pBCQZgyk4(fZ*P@O+VEX8?69x-t>Q(BaC-|2lnt61;qE1(i zHDq3Ho^txY@|kOLC>sYKF3ALS%)&`eAi#3B;|q)ciok^FTJ#{ok`lv(6K;T59nN*+Y1r*vauyn$JQ9 z&GSwiGG%(@q=E98?!K6(YGPlwyCCIfIFw+TBOvm*>1I^Sc-xGuA<+@$LHaD`H?w0e zjF&~{5C4xLY6ieP{y+;!|9QxtHT9N(a4>^ zrz?%9!$US82Rm_Uk8&{HzWIwSXn-jLj#_D8oFOtd4IqbJ;h%K?ZK@&y*Z-;Yb8+fd zO2en2U@q+Ahn-<`ym zgFz&QG2rA8-cIx>#<9HP)`BGovfUl8WVCFipXkvumSyU^zpYORntJObOe5?XO|9N>>`vvp zxu`YxW2l6RLOBJ3jVSma(Z>;59ore`Yk50T5zrs$6{R4ns+={P?hXn-sxMJ{Ki#^V zUq-@C$QtTG*pK{1vl8F^%}WaSZ92&Af?_sJ*p=XrdqU5?<3zFsfAZOag#pAhrQFi5(j{5k>UuFv$@KSHF72_uE-XiwzBSg2w$1T+Su z!^bT~zev>@bb43byrK-!OBi!d4kgRQQE#p&Pfd?Tghzzbe^g+;tPHUO3i!k8s;a8< z=r<4(TD~W6z+e=t4Ym(2x$sHHl-M2cf=6b*FD!IlUdr{a-4shB(B5mDg4tlBm#%?# z&&2Y1HZ@?CkQ$HRstBz{0LB;nb&xVwl=hjv zS1Fl&2*SCu>v4&gkx^En%_s9g1VgT<Ghg_JXpFqH`pz| z%^o@p@c+~l2c(rGD!=qY;hQ=_qz(Fi&XK#`REX&oQh4AS$U_dW`kPP5yi%t2A zQ1Jd4&@JY$$Ng`4rVSRIU#L-pEVSc`;j2~Zk4Bk4TLgY|$(@>3x+kr9j#uqmv!;1~ zlwmr3pfEbExk^=!h^RW`Zz>ZT(ml+^_X>dlvr2P8(=s62ZTO0INL5C$1~TrDh@x<` zuLA}Y91eFl(Trz>E27<=&Kq(J0SAj!;g8II!FYK}FZi0~Z(`#lE9&VNL=r!GA2-S7 zS6}Vjk2*-m04tSEZ?aWT*Zpgs2>w+-!N!v77=-MM}$@kq?P0^K_XB^oJ+>FOOuh2Hq*$Nsd++?15)-oMys^W2$L+I zfZ8morDT-!_O9{EhB52FWKclv5pZa~jk(hkYe^u*20bdw%k?##4g6?1pyNlaZr3)v z*xcL(gdZ>3OycF9wYcf;vNvkIfdcTvOa_@w$>lq0nwLPXlM&GAd5u{p`p^B@NwIahXz&RnmsxgLt~X@1ASs+}-i~=OPT z)0B@QpqW&BjPq6_l(UtvSYf=yf|O(YHag#J!)wv7V+DXu(5MgZcvCh;tk9r|)tw?M zW-zm@CZ`iDZT$*JtBt}MZ|ouI;!`6=58kMlK0m7eOLJY}(7SiQi@|A45-*C`dIa$@RlDSHi>DqDg+<$b}v?-XYK@^Rx!U-Ao%>Fnu65t##W{n2-SO9z4n8%v^tz* zSmXJV+$HULky|5XukA$AEL_DKd^gUO%vE$)?=Pa-{s>k9nt>Z&HtiVx0l7oCXruLG z|7H2qyevnS;%cAAX~#N6o-pA%>22$-VuG#3g^v#ji$k)8?}Z6MwC|ng0};-2#2B}; zKV&$GHz44EgN*~Cyal!1G-n27=?RIh-(^(7q)Hnv9S!eIJ`G+7KHBAU0Nq*~y7{e!FkYx>Z*D41>G*RvlIuZj`IjmFS)N5ZC%-)MaHoUb%`}NKS39fvYV+ad z8Av=A)v#TAiJU*DSz@y%_YMf>;!IgRU(PrX30xVPR(BL7k^UT7lL4ih;E)STtL7T# zAsrWqU~=xLi|y;eG{nZm`5kQYBhCIyQSu8#WleRvR<|1BQ1DpFp;8XId?zn2O!g9lvP_1V%oQ}U?YKBt5n zea)B4*L_Xf0XsA)-xjnas&=#BN8C@dDt!lMri+SYvgzv%^}Fg4)ktuu_B^SMJj05+ zhxa)1nM-i#@XwT8!>x9F`Ai35+2PF3iyq=At;;>AXJT01(TIgjd(kPV>(YxX#C9?W zS>E^4)=NrM9`h+~UVB>>)MwVc|5(jpR1(!OPN$gW@7=3+=X@Ne!UOr#1eB>&(WVP1 zTQm5FKPir-HX|SA^fx>7yYJh*C8_PyIVpp(Q4MT9we6)AA5FA}>L(V0ga1My6X7hS zpul-_*X-X5JpM}hbn>%dfu0|elX$*_Tp`P*1ysI{T0&wmO)Xrk@k)sodp0Gd9#MYr zKN&qVJJr7YiwUvfPW0gGm$fG>)6thu5L#g;@;k^2VgVX?v?`g%R{P3^fUG*cyI~T5 z`Yzk&x4A%W6|{dTs(sE!sW0ov2foO=qqz+_qwNphE$+wXIrrl|1Enn+`ay&-=4z@{ zNnc_`lQHrpIQ+yEsq_SJLC{=_9PWnD3MM%}F#QJI2=ve!O=Sbqr4OI)3q6zmwD>&s z1bFL8T8?^x6Bm<>IhxQ4qySvl(lls3{ZBHT`x^r2HQjnGR;*$R)!MC^aIwptkI|$6 z-F|~s<0cqx%1=n23c%PNlLc?NUxv6U3=}7-IL2(nA{;S+M>YBskx!?0+&Ao+-ws6F zNU}?``|`LNGN|bkftQNk#ui?eC)}^aX4IAL@1ruM z+ss8$;p7Lnw~sg(%#i?Bi29;CmpAF(4vSUhS^tt#er>RzL>9bnB50h+XS1Ug5D2!( z)Sd^$rQ{-bjv`msZt-Q73+L~@U`oLCiJU(AI^Vpp*GZ^G;+)9dXFeQOnLS#USKkZt z^!y%`EY!J-olQoj!1fNSqXT1}1l*Cwf84}voG*hwRnHV}d1pZ?jzbQ<9)E=wU<~W( zB1d%tU~XNt{8v8{!ORJ^uRSnTVCEp620~6++aEUrJX0w;18J5M9V$8#+KEU)IBo>K zvP`=4N96#AQT}hd?CM|Rh(*{Xbu456qObuA!jR3qs7?^AuM}COMRi|@C>xc@Mn79m zj<4$-5HH6~Few#^*^z0EvNEhvZ6WL)P#R@eQ52MsjFkBVE4_DQ0cpI`4(|Z%Q-x!m z(KWL|Kb5fvDxg*fJ^FN}VP@`ncI+deMGb$%tpd4K~VVXqHj@#`lsb!Kx z0i8Jy9l+uCkdBE{0nhp4yu-CMXehxAD@vsf5ir>of7w~9qGi7 zdKHJP_^Kb-)1e$TS!XF|AOr|d5-Hl<^Og9e+py{741H-kqaWIoxh)T!`m>CyA;993c;G(OJ{kP^sC5+o*P$`xUdL0{09z)PT61qBJNpOUvtCKEXE^FO zVcN(2J^F9IjAwc`O?U6Mbi~hjt{Y9Oa(zBWO?&&tF5iHd;)eNJd!^IjS_ z+MJ#VC?w7;81dzjWcqTp)bv_sztF#u!q@VEdF{TsD2oC8X}=6o1>AYrpI=*);QfP% zkYkv)zrL(B6Db9K=5gu0mfkdlUkhOvE>Mvh<-@v+s#)-DbBYCx&eK>0pxP|X(F=P! zG-2cXLR+BcjY#kH7bFY4Ko;u8$alQH5iSEz<~UF21l~UWukZ__UInmXcYu7ec(Fy< zohtx{VThg4gxG8d`PZ}zczg4ugb32Dy!Kv@h<&4FPL+xkc~-i|jGS7^D?2I26q3mZ z4@vaPdfO`Gpg2{Y*j@+B=M)j$Y)Ayx+qK?mJ{2XWC*|h%N~qS+l65|7u4Gg*_I()} zz|;Z7ZJKhN<^uNQvM z$JB@DV47$Vfg}y^H>XY0G6WtIGMw`F?d?&m>`(uE6v19#8>Lq+zEhO-;^Lpr<^mb^ zye%O22T%3_cj)Ma#KUu2auJB&T0bl=8-~g^Y}7)p?|J+7?%U z5d{k0|9f{z4{>R2o&o!rnj!|_Tt74Xnupvk1Kx`#?fCSDo6MWbCoxc?4_3?IPUO|L zLDWFF!SNEYz+nWoNVr2dv#(tJ^%|Nkn83W+8j%*)Y3MaX#i#|E_?vo<+uL(y)bTQD z-Tmu`*!H>5k%wZZrf2P5bsm90FvWG;S34MA&B}Bfe%TVZjF~|DDqIB{!7v4u zH9|=K=c-NP6sA*w@N)4nxtlZQ(r36Wq4*x$!!e$^N&EkQg;}xG31}RP%fMrX$=<@v zwnnhY2kZ?{I|R9Zfh()Pg%VrY;aSi~Lwr7Ap<+4U5(a5zo4z_eeRaw&`!eNc&%4ym z{;a<;Sp~UtHXj6y2qd2=7PG+Nh>^b2#I}?m3Q0^oNA`w*e-;P~u6*4*&geL3G`zzs ze&cP2RMM)L)q;F`4$N@%!Saz8ITW6JhtLkS zl&~)aWnfvm7Ke*zcWur=v^~e%HJTxGv@EqgpVk_J&0OEc#-!k@eU8fEt4nS*JN=&r zJ~eBQm6|sTb*e%jg0zfergAxP?9uK3^+y2>keEnGNo6^va)o*K(uCye)3%>=lo%eM zGY9HmEv@w}gZ&ho}at&|`(RorSnY%is^^NC{2$!40;#vM4Zv-EZ_ z6&60Iw|Sn$DqBaB zAJCO_)nO*2bet&7RqTcjjTtw8Q|T`9y3P+Ku}Vx?~# zu1}!%B7*lwQxFgmxB-+$(?M$4kMZ$?51k{^$#tclYHP{V<0W~79s}kxC{6h_+O|UA zOq_Drt_SHFxl;e#Q8DP)BI|f$t(}?3-aTNxJ8}2RGt1}~Rzu;&fGg0jSo!`e`{~rg zI`!E+s~K5K92bn)NR-Uz-pbU@Kjw~VYJ7wkZv6ju`S>@p26UIyHqqk0)C(T<$dpSmU=R_|?1D;+<$2=BeY|Vyck6krQ4Hr?Er@r09dc z`+ZWPnR2&<{~llhI#091wko#YY|?@0O6kEz^f{;2CY-gRE5($5PxsV1hiS^|2mJFJ zwN9k2rRMoMO2Lz$lyYPN^|Dr!{y{|+I*`d^g)L9)Eh7nk!R+Ir^-O%D#*pxEMX>#i zV05F$65qvGTR47R?7M;0m*gK!K1U+thdzE%G(!7YUHxb_+w_?4#?js^gVvlRmxck* zYT=!U6j4g}?Ed}zeHi)vDQG_#O2mS3HNjCL;R=VdG?@o(|9&#FZ}@Uy%ga6Kbeobz zRAw+og-Bq5!4F*{BkcL)9`t(yrq`%_RS$J+=l0>=+k~M6ZRe96Rjr@ZQ34b%Y_!-^ z`Ml)ZVq~0Oijbf~#oJAyv;^+Jx;w}x8ww+FXN&lI;%(B_z7+f~Qo(%qmuT}v2Z#;Z_2z1wlkcckjDBSCnW9!NSHTIK45r)a@RT`d(~R{GJhivm(txuu_j zm1Hi0Gw4D$bQH+9TmsY~<(FdTXkD`ZM$R<;rFAY+mXpMWy5!zsIbB3o>!`7j@?89Bs=B+y?*{q;}OaxRsWh=XhlU z_Fkp0ttB5!;ECgK-*2AUwYocgl$CYBdF40S711|+uBd<7(cudrrk#;fCAb2bF}X8M z*gQx1uk!!*dPI|59CfZUaHP!OUh(v9UD zTpmV?OnR;BwFXO+1@pX7d@xx!e1mB=b|D{jIp(ZxKJ*Th-!Kle&nE4kV+?~c8Cl06z0OTK_ODF=-oD3a9=9xJ-a-1_r}x*(N$j5~)E(6kT4myp z6zopFzt61F24TNZo+!!Tx{Zzy&2z*!L_FB*ZXBq|8cp2}+MEgutWFPt;idINzhtDJ z@7}B9BsH+O!#$>Nw?)33z5>jqsFqqbnbjzF?^&q`lIU`#RR^sJzj3STt7PQW5iYb3 zGpwk48lJExaA%b|sT=6$v3}3^(#r<^!mXKoj{fx0`)tFP3W***FPz?N+MB_5L^uyn zEgP;)lFnGWt8Xk}UM)YO@I1pWE${*OQ@GO@85w<={y9U0P1q+^QX+gK0Aem$X%qrh zl+OM0YK0kZ)&VVM3q3qU%U3@&o^+T9qKNV|O$xxR`2aQxLTP$E`jlR9{g8i=csiK; z>}dQLt{O+IjgOF@J^TGjnV`jlo#|tD_nQ`@t@qkw`+!LTMCJXj+e68P*Ikr23rYKY zJ$mG}n$p-ZF_1z^eH9I>e2;}`kHqUM0~=`Y!hLy;q4P4`wg)2ZGOuo$lA+t zy!Hv=$US(Ei(ftZ10+^|D0NEnFQ0XZ2FLp2y>_ns>BS{HS+(A+;7DCmGV4&ED4@Iy zZZn*c<42|Ka_%)j14SOn+s4Bh2>zN3GwLzUR zjC7}KL?yU31I)>Eon3!lc>LzJQ=)NV=cOJUsQR^UN? zwiN6bE4=I&bmpJI1e-D{)?B7_=Xb;n7Td2CkNPui>A_Z)1;3l|+?+czxQ^|yeP+f3yJef&GEL=y0BD*v}!#_k7iSa>~EBQj(DlcS>&LV?j#^+qWxe z28njhkppnv)L(-#y2k)7Sh6PnYOMy(1<8rPhV)rGJV*iyBYdcT$b@bl0EXB~0T&w4Z1x-v0W zLPbq(@Mz1{JnE6NGXV8Z&QQ{l49BYc1#4ryET+$(>;J7q|J>{Wk1TK7ls);|72)88 zDj?891}WfQ(SsDWl(4!7cEvI>Aq*mz+3cC1*BrR5O2P zOt$&QMP9sp?lzs_xrksVEw+eX2M(ea`#j>gIV@d`@9u;20VM^Ad!Saie~ny8E4|ak z%^+fWqxM~^FI|;{`*-`yK*;&ZncZ@Qym~xu45wef$&I7<_syew<(-6*cGvwH^aSQU3a=8bi5j1{xHyHW*I3-TAf7n9iLg;qS%Q9hNaATV@|LMeQ+?FrRCb!C$r2fBr{n=w#?`#7FkW|9qY9>&ydhZq z;A;}LG$NwTZ&=#@m-5fHkNP?4&k^YzDvoBhm|mic{Q$x@r`aIXz0sT_wya+)9T~gL zuC18vYQ?M5mbP>D96ax}he??OOzA<|QP0NCP8GLvKsOx-Vt@?jX427jkLS6tW^;Ic zoeWuPfB(BAmK6UUHI7{R%wU3)Y0?I0!J$0AnzkIu0J~P40^#fQVb8RA(8ik+0kRy| zSz_epvaD=M>?-;Ff&#wpK2l-pG&Fi%$&h;?))vEoV((xn_L>ydWK5Yw&T*Z3Z%<*% z)&sG(L;JP1&~8_n63ag-n?QrRqS}l~Yg{r`K4eb(Ad>GJrgD^rutE=CkEoluVxTreR zBOF<4HtBrAa#YMK5YJW`RK~&1zR@Ew4cs)kz46Z+Jev%#z=EGVrPIG-aTre9DzT(+ zC8grPY;O{A6^7T=d!6zQzlkvzhTCG2<*qV^8-cLAB40tlPCPvxCFNy7^N{XdzwI_L zk(PwRAg-J6WC&rHPqp5b^M?A%!+2U{7AGoa)|NKmg=;72?I6Nka111xS`a`BpiA)f zRxoSIVmuII4?l6g>$zQ1182;5XMcdi6*zJ+XgW@ zhr+Z5M`{Up9p<%WXZJYSC%^UHgx2s46nzS%_}T163uA60EV3;#mPCcW=j6Oo4|{Tb ze3F4A5)>3%U^M>IOuK+VzRp0t|8|@FQ{Cy|q(WfpBca?@lrgOBh+2BmH0Xs?L zMU@;ICO%1)7%*W=#_Fk4ojHY#`6}%>F(_#KC_cPMPYyc|$KFi-)c- z`#rPHy=%ElF}`~kF4efWk@ORtGfe}RfT7!WvW z4mOZ=)!!_eeUzvVcSpzk2Cu<+@_!2XKmTmWpUWLjXyU?wfRt;YY2|M0{M*Vck3WN3 zf6=!5rerLMQ8-rkUD*3FJ_^qd5q)00Ahli{iA0DoISC_eB$C9%-WFWCoBt>V0YY(} zZjUN`UqQR&NZR)u?wV}S$*B*Cwl4JJ0EWBB8KdVHt7TxAaxFu&1iE+WB%@y|$W$x}(GIAskm`-^#{1Fw8zywPihg-g%WhPsGH&RnDReoE(qp zwxFX&P{nM@_C;Xok50JtX1^hk-HJM+$@rFr`xLr{SoB%xE#~KDmk-O>2<4reQrj<| zTuH8Z7`l7QD6+m`saFc}%v@b-{F4=}VwwXwK^=?Q-WC;*53rex`E%T`oC6vELc7h} zmicmij(g4}b^uMS0xR_#Q}6m*A@Bf}RN^;!=O_Yo$61t;PP=+ehyz=6?U;?0rECy= z;BZPpOUVMHCC?mN=gT9zqSD+&9^6-@V=u& z!2A_HX`f@e@j-3qJ^f4A(rz}SF9Bvl612kM3C;FgZ*Bo@&!}^gK{13q7Vl|NT&tGG&36w3YNI~+m!*W(F;C|;d9T>6k^E&7Qo71YX5_T6C?YER20uGXzxs8S^S@QNCJ^y%4P8&sdWi^U>qFje@f2VE zxi%0X$D>0QP!`r?7I9-r3bb?pe-zhn`zeYrpY1%m*Z*)gw-d53-r34oxx2f60TtEU z9M}!K>|VE0-)ySBnF)x8C7C~NHu-ovxVE1!=G6cdwq~4fTSEHO#1N}v^|K}PU)jxZ zy16Zc-Z?_<^F-qS35!Xo*{$`xcz^VtwlhvgkaLwl3=rmAw@@=>)J1H+fzY2Z2A_TO zt|FK;_usPq(+4V&J6olRK!!)%N@RZw`+N`aHjrh1} zMwTA*ylMV8>)PZIBB4iooryj6#pVlPtp0%L)e^^zFmd1M1@zGN7u=-W;~n{uJ4Lf> zuGG!Ho5`uEcgIqCZV!2y%q+ho^u1j=^4$+p-$~~oWYP_ncewihb`@yy4J?_+=fLH* zuTA5HUITCf-#}on{HYlL+iGe$2?PQ!KI8mxUjS`Yk{#TLAVdT)xB+ME|6GXIg+?+? zKy3pa0J4|4)vn1-t^V=92?{cBdO6H>yCJg@FZONq4~mnZ*jIaaJ_}B zRqhw&D6g!pHECWSh5ibKsZ~T$>cp-ux@GPb*4;pZPWkLm7wk%RSV__P^ob+h_@>u9 zja-#Et6_mA>cD%(M|RhTx|&?u)u_=tB)f{@uLpFPPc*I9(0rsmy&|c-zS~P~zJVv7 zJ%nUQi{q$IXs*^D8oVD3jp1 z_9=PPjNAoXSok+GT%~wUKO`Fz&G8LwxrgPBS{fF{h9ireHlG0ZeePzadP_}|PhBM^ zbn)?*$K|(%#1h2zUUwSbWXx&+oVE(dG&Cp*3oop+}77pH*nKOK}-z$2ve)n@_MRJ`g%106Pj&1oV0q2Q}aq#n9!J`+a=Q38>Z;HS||R-?}~K^Gidj^=!wHQx;eIVU#sStP%+VKdD2w1>QVzw3-z9#XN-utukxA{mw+}vSjD1=Yb%uNbVi zosjSmBM6W_H($^!7g?G4i_VzZC#>B%&E}rd^T}SWVtglc)m_NPc`=oY(Eg{C9toLq zJK%#fu2z{=DJm8rkd|YP&a@ZMxh*?{yZALlH-${xeNydfv*o9UqDZ2AxuYJKD)d*S z{Ea&{o-&6;ErT2K>^VS(Yf>f(iucY-X=P@dq|(DmJh6Z?FB10i%oO9C4SA6CdV0VD zYLVy_Cg{^r-WrCdwbXt4&a~<2^_!IQ_nVM6_Z;5c(GDdgwD4XT3K%|dKycZrN%GrQ zul)RE+={1RUku(~0FJ>r4D6DAdhrXO~S@n4060sktqQur+-5XYX^EFC3 z?LJ$N4Cm|a8Q+8Ti~g@O$`(#a@hJE3%HFv;hKVW>Ntkx$T zcnZ+fw|@Q{deGMI$`jiT`cl)itv|<}^%0R{|NB<|HejqNhh-2@sqh!C|iIE zqBoY@#?x{gwP#qw;hK=gpoi)g`d&>Zx~NNJ3`&|%DMpB> zprw}9mW{tFH%xlxjuZV1pH}Dml39q2YiqozqTOfj1vX`-CnI3hs^a%MHKGhe z12Q2l!*BES!B*_SXIR?umH7XK!8}EaIX$=AmVJJsqit9$b~(8{r{Yny>FWAShJ{^t zz}=dlFu89(jd*;g4XC-zH?GNO56@i|xfvuLNFRSBO?5D{lhI=G#aV6E)@!=AxM()6 z|KzeaibF8eI5x3^s>@L82~)WQk8|KXI+p7{_?x_SUQfdyz{Fr_%ME1{KzHU5A7%Qm zsO(w&rpg}0pP5mr6)K$BLk8h>es;)PS}7Mkxm;s)3rS4NeV2;V2K8iHa`&E}jl8(i zm9z|x7O$U1N{ z^6tq`rl}QXb^%dPoT{=u@sm&3A+|%KM_!&5;8gwM@6&DO{puC}=`h8%yz?0rFQph< zhO^VG?+vhD^+288`)djX)5uKyPrqT#$lUcgF>bm(E?`n_G&-#qD{Sez_yzT58fVLPhQ2umZ zSX)x4S5Cy-lQm|XHa7ctL4iPL#D@2?+PH$+0DHCMgZnung&_|80s?Fcq~+Ve?L3N1 zv1Z2_x!)!<6FhfcU(c9Zb_$V)oRX9<)UN-ya43@H`b3HtWDVk_QoDXRxeNWScotNk zXaGHP96x|Tm6w+9{+VT}1|Ax@E;{)_!L3a!R%cp>fQ zKj3aPB>fX8mZsh_P_pzzk+UgxbC;S0BETH7l)jzExPyw|k#nb_roqe>U@C4IhTFm-;X_3Q2wxs|koTVu1(ba6Hys6-Dy}Ob zG7W^jcjHc=*<82|^Zmri&4(3u1G9)@jE{;bg>|Mm^VZBrw6&fmj;Z0Nai4tWrKemu zIqW!;mSCEsEED>}7jdx~mDC9;Uloa;Jy+4i7-^^M_o{nu_!t?S1Agi<%x0MTa&Im6 zz8tvdamt@^v^i#a+%n^<9U{$#un;?y3>GyjD=VXm_kWKn77Ao)7!ny-P_PArPn#^$ z{~jQK&vu9h;6RmU@5JlxLx4W(yU}kTu3(GKEf9i7dJ&5!t%bM{{9`7ci!9Rcn{)Th z)>_`TLN_I6Dy?+WjK08g)EP8?Hvjuu;pIu$3lZn;o^c$O=+Q-fzB?q+@`=x|-Z60Z z!>roWgZpp{0TiALNdjC_GfwQ{Va)ImsCh=&EOl?Mxd|Q3QBbSj(AOnfDnehskUGW} zr62Nh7&f`YiG7A}pV5%)9n82|ORbL?zdc8cQFza61GX&8SBZ@u0X8lqG1JO@*OPQo z233CHxMS$;;e{!^az{>9X#?NgkR5fTM$XsFYt^xlm;aqV{%mE-4Rs&38LXDOnwky+ z-}+OMl@Y7@8>6;Cqh(N{?PbLh(JNyt?O&N+{^q@l`!+C=PS#-btB9HRXotTDq zh4+6r;nMnzb0*nMSigI9U+6Tn*Un*WGaeESBKg^rjb+|}6B#{GCdL|A{1$`jD=fUG z{pWZ&x+90@w8w5OyA$VM3D6P0R%gEcfbEsnj{oLKfY{xE0TyE6z@7sM-X-&&KfO+# zyvUl#YTTauvDHwG)%LxCRzWG(_lpj>y#d(SV|&<{!YI|fOc#tx@ShRQtpRPFQCL|HR+F8z?kdr#}9EPqy$s$Hy)2udEuiw4^CPy?iC+$yBAFQumgq01F#6r?O)n*?e_|EK!C3oeGUgncstl$|_ z8!k618LD{bq2S*cZaH9%dwVxUAmYW;bAgx_eXKNwOz2}Rr+m&w0ffmq|5~~+-8Ce| z#>Yp#Jg5&We(X{=cf=KHjx}88K_qd+n&7p~+c$o>2gG{!-%{Q!z3vv|-d8?4wI8v6 zZKZT2sryQ{?1gVB{4p(ix;6KP4dd@#Bdg5bh{(uthE?zA%6xj#sYdUxb~2KK=YCO-|F-uXCB*bzR=8j6{_PO2gCi`tXI``*1AsKS8u4~HUlLrjfMrT_utfiU zOEO}}nvZM&&@=Iz{O8{r?nDD5NqNDE8Ok_ps!kIgWSg`$Akf2_WXbM5S3k3`kTy+L zMAwimdotA>8=I1ife9JViz8ARZ=I*IT(wA9iX#Vsgh~Y^8owf4nVTQ7WI4Zcx(vjJ z`O7n+*}A<_^5)isIJnh$33c_n)K?p{@gpSX_wvK?U?K*9sWCDoZ(?%tL6wqSCg<+k z6sOGT^hbH(LRvc-rPvga&KhgS@B!XXl2ue|@@B*-E>HXQ(IfLp3K=&4WajG@hzEt^ zKaR!UchfdYu=;}k93Hl5&2)U$7KO>o>Q)_J#5}di6dK(qqc7n0__%UTT8-9N- z9v+AsgOUT--1g8Kip`(cHJ+1m4vyD!Zlb!+U!Pqf0ki4e@ZR;JZ_-IIlY4 zkK&`*%QqRj$DnkWlwr6K@aXwIL7=X|yL8F*5sy%jGBF0ARb5s<0|0|}VI?L7@-r5X z{^92!YJWeb@wFahNCudgq5R+3lJo_-orhc9p4NX{0FR_Rd$0inHI$jpKDwE}y!nxA z5f!3zSZo;Q!sQBwLL%|OhMXP z6RJUQ_33Ob?VJk?JLbPTm#?MXrkJgqc7yCM`T1LCQ__A%M)#Gp zW1@B_)6bqn#SUiGPT|mTiO?^ALeh8NS2^$E#lQ+2asGcyq)Jc$<|?RfgkoX>k@5;k z-ma`b=xO#pm9E*k*W%SbY2LabZeO@bi3k|mcbhczP@D>dzzwWBv6F#=Bk-er^H~j_ zJ;P%E?rDq~9bVo@~AuV(zH0lqhd zc<}8=!WWIK4(6yr_5~EzylPIO(5%iF%M2IR_%)Xz54GV&F#{R__gF&_aF0x|a3
    jZZj^v>3TepW20apRYO#Ox*SgAKoIDN*=HA%{j9 zuT85#T4?A?u;W&3R1oi#JNss5bi9+osU}A;DP}p(2{IJlA$*C)o9EDjC!rpyJbMEE z9@^`Ui#0`(Z7*$%PW{Xy)OC3&&h*R#T(D<}DLv<3OEmFcYej*T6s9oems#PIUyg}j z>sx`(MQOII>QG5NFP&Z&7$~mf*k9mv?}iIqs`eFnEk5+jMHw{U(`Ao8bdwT2YLe#ci{JFEeY%$WwcG zM8sJ#FC8pne0)eb^Ird!s6V}LLhVVRo#O{X`U#?T5hGn)tRWJR90kBoTAv)JxSLC3 z@w8ZDj`Amfv}-;pcXYof%+L3)X6cTR9(I&2#0#o07o8hDGM4%Nyfn32c(iAqpfTBY zu#e9)ARnI*gxlCM)3Fii-uG?W-A*fbf8$lW#ooLD*#ZHLMic3;;}&;G�`wWV%E3 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

    7& z4vzo-N@Dd_aPS4K7Tni*_e0!)FXcv8@Isoj6eI^+Z6^V}0^wuuRMAJwVW22*B$z^V zWe!?Ak==rHQc*k>3~u%sUz-CLP4Yi02=cc(O1?Yl zA%^P9Yn)}C>e^Y<7E@=tw4K;ShZVHMmyMPz7OvqE)A!{tEtPW+-rlEKtzLA2#hDk9 zXBz=u5Xv-rILbs6!6>J%Lt$vT5o(E>VnV%lafVsgPQL4M^n`F5vMZr| zg$93`bt#n}nNI#D;66v-{L|W=;bFgZV=(GWU1G-u^_w?|sTXCv+R_YI*|VS_oqUoJ z74bN4SIjxPeLReDpwDs;bNjS$KKSB*cyWLS&Cr0o(y#uhoeot3bu*E-r9d^7uQ#|X! zAk!-=xr4yic(-Yta%ShJKz9<#uFS!{oTVZ?HSSqUTJ-somqC#x*z_o=4ksq1o4dJ? zm6?w@SXfGgXAjID{+3*ukXZj~BMYB_&~P1Gf*UTxbd>7pt^|KD?^u*v$-*P4g$38? zQ2v7h+T#@yI3Tm;hOJo@(^Yeh@o}iTr^o(y=h>w9r6+8RsS^oT7KPw7ot}$a`Cg0_ z475Wm+&axO-A?it`#sCGW_o-U6Wc(MY@lLi@4K{vXThby);di_(1 zS$SNdeBUlbCePc(rVK;;6o^;*)Hv;ZOy7>0R2}}*DkhhFZnymQAW6!+?h}H<%bk=t zmp->KX;$Q;$iVq~(%oMSq^s1|xS47~NlvxaPN~roX(+lQvl&J&zot2=QMol;GB%~z z&dpUcl=X@7dCjt+S=*((CmLYz#@1nd82Lhdqiqkwt3#YT za|plp#o1$Dq;<7S#up(~@!{dGzfAZ))E$oW@RxFLol$wXp71E!4comKTm9t%D@Nss znB?@ilxROQS_}%zd(MNir7s2~>nlw%k>EEJv5IzIgaykCF=gi4a9FV>TN}o?l_Y6S zwE^seSz9uFRcWvnkx6aHyeb;N?omF+-@f*-L$gh()_hR>f#L6~0 zCh9`o&$Cy>?EKw(wc#Mkywiu(Y4B1N`~nLjSC5Ha?+dK2&RUHg$2av(-%Lbv+|KAd z_0d-rNvC~ixb#8MLqG87)%Bxg;n(l=tT_SWYZt$OkMwOA%7Qybpa)^Ki%7aEoO;jzdE39xrPXlYhC%3$Pp^COcl1Gt^Q19vs%gGUf3ibk`<T+1u<7DCx;T^-GEv!ui~&3#X7&`{lKh zj#VLCBo=gT&YCU~=OMcLNaWdOqu!wbR9>wOSgiIq-O))bg@2I;MIKCo1myGm!GwwekI6OHlY{IdPU+)ns$- zPwDmJE!WN0jZMZrRZeI7L*F<1Q0}DIZVW~_tPQ(EBiRd_qk!uUBc$?P*~38tkMHw8 zaMcDJaGJro{|b)nv)KBTaj^&N@fhVL4~Ok~`A`KIIul8QR14JYU=ji-t4$^?H^HDn z;I9Ie>rwd!)8m=Ang%AN6meR)jVaSA565qB?oTTE+Ec1U@}fq?h{scIgh*DguQtfM z6Crx^I&j5eWNAzP`|N9E;%#x_i%l+jcQhnI^oE(0kg>{pC95n0?13z#sVJw>HZdVb znXyr|%9(I}>q|c`ONlHNggMN6- z82jcr??KQlERnN_>|mt_k`H3VDf~4;tnWxZNC9!x?`<9?D>@=egv2wc)HiRoBk$|I zsG@*a3`!T9b9nyyR*sVVUR6K55R{MEmfC05jLZ&(WSq+K@~=BP-1UZdreS41QyTIO zya9Os0jo$hZ5Al2L-g@E3IJ%!#zS5oxOalt7X;B!o?_Pg!Hj#tfkywN(GDz$4`sSa zjZmtxem3??$%na5#ayUJoNby8tZw7}7%){nyOlg2NjUCKa)^jH>djDA8YwGKdX%MjGMEKVQ((j+IW6M@Azy6H5Bw6p5?wd$5A|~#aJ1B^iza6 z@D8WM*XVeXX_5b%uz)UF(X|W2%t`<>Tn~VP9-woeCXV_YxB}s6`yKL-|G)T45GP=td*b8g=SP+6XpT7b9JBna z)8_Yo_05S&P4WBr@%wYC`(pz50|G5I@Da=^lLTVnd5|{&B*4B-6UN@fI+q|hiC$J> zBE?^5D>k<3(bDsHLOeu!59GP5*fDYTbvy%7DH72s+{b?hdUk@g_@}_GOLU)dm{ro= z#wx(3xlMFis~3g{uQ9^kYH8_RF44XCWtnB0QQR{_hbcA9oi2nMQ;$-M|&7c4q$kLUa>c3Bv3rfWn4d&+&g4U#Iix+4etQ#2jqne`*Z?P2CT$ z>0p3;@%O#0u7N=T7<)@J!FdJ@GMu}qQ-O4{yQD`wM*z>)TmJvJ0Ik|mY-k>nU0R!N z*d87tp>O1M=}w~8Vr(Syv#jdSPHw#hb7dx@{TFq+e#%H35l8L>H5aL6CgVI^HC{49 z!C@)8v7P8^NtdbjSbF&@Bb!I+Xkv~#z=mx|g3?T{%1BY+)=cuOjqDWL^-O>UJ$T0( z7t2Fnr#dK*4)qxK^{D6>_s#KAu?k&rvp1Zofz}6Q{y92kF;OwXG*Rz3`Afewi@pYZ zqyqy{a>UXGidK!h78BFCCcdU$@zb?`k8gw-+gzm_=4_T zIn?W!qQCS+4j39YxW;Ig2|j@wo{Qk21${9D8uiUeE|B?57@Jb5m_%ow^skk$4D0)3L> zEo{6PSN7x$=0TurA=R-rh*b6<4;;e!O8Tzs!Zc+(Z6+ggpQp0%D6qR4cJppTCVIGs6fa=;(Ixgq7XIiCoe z+PaJEl)mt{j};`|u-y1{kcS@9UiSN@1^5KNlfQjIkNg*W=|A}NE{yE-*y&CTEkPU1 zI50?({#$#`jC5xR-%`UAZ^@gUeJ=Cz&-W;g$j?`Lal6oT}ow$cNC zR3b~0k24$e;nPAsZ8U9$u@e*ZV%Z=yw?Mm0txV~AJyZHHp8@#e1Td9_%*$vE7-A6@ zw2Jy7UdSDeiIN#=v5oh~XUu^h?oNc-0rsP3f3DH%@@OoJxfG#{<1n%;Ueojs?^FfNZ*Y&IU13q! z@f*36#3Ui^SPT`G*@&^kW|fh$8au`5+to6wO{#-@PxJ$GY_X6Z-+BFM_lpY?GnPhP znEj?FR<#{qe~?66>i3C#?J;_+rk{ppTg}Bz)~!)CwD-+jBFw^$1KwO8yS z-o^RyEQ0CUA^55V19{|mxyD3BbMYlC!QH4vypD$CCM}!dtY~!VKwc{6#f^XP$=r9q z8VxJ0U}})6uT;GdxV~jCFP;felZaMJcvo?L>0^2W8!Xdc(;WC9ZBbDCZ4g8el7^1@ zXaxYgf>&6ye-&8TmplI5|77IZAvVF*VzK84Z*SHbd(>|8O5v+m&}Mw4d2qdZu8VK4 zJ7=V8jCWi6u6+PCGb4C(tOW25YL)(X_%BW0!yn+TzlSSHJ1+a;wX-Dec|pK0uVBK) z`EapqS>cDVv-6m6*St$0CHbL%7}%1^QP!k#sAP$Yr97wl0u3&FklP9Q&2VLG+N2~n z_CVQ<*sM#7s)otY_ba3rqu4w;CZN14^I~{$E2uqhOt@`M`(#Dt)+=0wt_XcBci`@bIpiJyw}$kr)SPju7Yi7 zlmT`Fk0ePwNieec2VMK)5j$i1LgWCjv{Ju*zwLuc<`fYaN$xYBx~Jl3QKM$s8&^E? zrc(+TYWcETz|^EGMNB=8;{8E@)gDGFWnY|}Rz;55I{L2&j648d>oYOlEoLQ-B#J*(CCk&P^$ z1-N-ECKF%EuRR39wF8!2OaN2rt4RcOt>cU8N#IfFUT!z1H28P-9PT?WptODNy?Q7c zYzQTlKL6jEbMyhgG68!cZ*002W0mCzAP`j>j~DL%A}?6^W1)7KiA3aDGPkX$cv=<~ z0e3Ml?H|=<-(`q;pygXfxE@q+lTHfz)?44rl|a{a0|0ZjIra-P3Y!{>$E$7wq-vgy zz;9Y65WJX5JZ|)J%ZK8WJ?JX23u2~l$76g{^!UtF_N*;si`&$Q95R**r95L63628G zjEB0%ggnVqV>O{us&{2E(hJ(XcRHbGl&nE_%_sW)DCHc}oj+c9XdGc?< zFcyycg#M03{AwUaR%&%xXqU)8ET{KzAhF-l^#p0gSPMWi~+mebDOi)>G!7 zbJ59uj{XG^E_XdTEl6y#mlKVA{QRf0vBLM6W#H_3V(6$-Z3hY%$cEs(U3>|`5Uwk; zPWGh`r{Zs;>o}kVHoUxS8YszumoQdqT78VQ|6zsjgo@dO)tqtc*@VvO9x_;+Ex^F> z#VBy92 ziHM8a;_@+0<5%e9l(P)4#$8-BS@9=7H?nV1g=XXT1gi3sgfh-YU@-XZ{4!6_t4XXIfk<3Vj;mXGT zhkN&Keep)i90RUIpb;3&vS0$~$}>;GJ2(vm*B~=U}o(O&=a`n817Ma`>Eh-OEAs;+ji9ce=S+^W~9*#gNBC2JyZ+!wFg%-2gOHtS-NOo`jG$Se|PH#Bn681A)h~F z0!-?pECm3ipw}5q3arMSu(J=^IZVP1_Ow;LJF*Pbb+sSLcVwDC9R4&mWGof6s~^2z z_MIrY)s*?U#Dz!9^2HG=;=yCpSYnImvtfg}Y3_V^T^_(^N|F=9OoRnYb$(7KJ)^GY zo{QUII}=knYnvAS)Mi#~u--V9x3?`Jsj2gwhGi`ojTOT|&uNp&dQ{r~Qcq|xdP>~_ z#pCx1mtMG(7OD=RCcZ>GUw7alnX+Et0HRTNeC^ox!A^Bn6n|vkzgvn_kLlUkI5qoA zQy6wxjXA!OV(?V{IC0Io^OrUz*$wK3XTQqRi(gD#;MiOZ8{IuqFtquxb~FEK!6Dh_ z;?Na&ja%t=%^D(YJbKg;H>y&sxxxZ?cn26Uc`RudzlkICxgvR65RLpPM3++KBmXRM=+X9$r?QS=q?fP}W@vmX@?sM}JA}q?cj7^9P;M3+RD!n_ z96Y8XPQWSoV}ZjkB$9S1jsI5;u8Bes*7SO8HKoUP*{kiGu(O>9IA}rOs{fByf8?v! z!;sLXeM>C}b{j8}-rE93Dgdc&rA8sML%9-v%`<<~9d|1weT|O!`>>#? z<4brurKuj4AWo8@9QX`vv$nWRKB@S4_%HQgKu!+7 zL$g%w=(-H5^5Y49kokFB>J?J$RI8CtZ40Ywu2Aj`v@UUZ8w_fXOL}>DJ$i=aCzE$* zbN0{R(fqe#-ggWCUN_=Ai@Q~hKzzLmSToyt9E&_v@jAC>r*7`2?b23?SnE@fHgx&L z8YU*_{gkenfc(!w=EGwMR9;>23d_mC@+;pP`b_sa;VT zo!3m_F#9`*=*SP9=KqbLooceSz^N7#-dq+Dq3H2@Y_%M0;)gAOVcqqtluJObZiLRu&ON`gN-nki;hhpMn68|(rCXH`>- zD9g}&HvC<zvDjNgC^Y)J<;VfZldqOlS7&Y8K-vGH?r-k0_c zmANDu8+8}DRL)iQKv7#{%Bkp~#VuEwe#u#=86WvbrfB~sdx{ETVTbvTwT6~F)3oS= zTQWD=xh&GV3ysVbxMP!FTnd;FVK`q_!O$2n^VBMN;Q7gwfuR6hOJq`kddc2fRQTWt zo74sSf_w6VJ0&g7JVOq~j1d!lV)r2|9FZo6OikJFdikAmw@JP7h3!aKr8)4k3X3pj zkCrpd{n`dQ)PQ!Z69@k9@C=hI(KG=y>^|>w-~DP1xILNjZqtqoJ?^Kl-ESgK=Dnv> z0HG|P417~8urwTAzIrQ^e$PVk)hjrc0k|$~hfM2(F~p)3-B+s0s3t{4(B^99cikFF zD#`f9A1^=sKRH4~*M)M0NY`&(0hCc~wKlTfwQ+XhbDHVA=ty7!wHvN9XhEG4ZB8Rl(*tuL!|^pMf8YQH-)fc7qtvH7 zIg`W(Vw;EQ8co&#wRov+#ct8j|wydj4V`wW>Muh|eK%HBi{o^-?b8eG4H z)}#~Wgx^lL^Djj*@fsaq79dK?sAWKO(;a0S@uZy6w0Me=aAF=DR_`n>B2He!u&iMd zPD}wF;)@7oha#di7q53`9G^#fkF)51Os46JOFZee+`h6Mx58I2rFqPADSZ9XPkawk z#HcR3eA76$aC*J!6iEKxguG#vW64Ie}fQ|T4U^+8%@LVXp@lMmF;1QQ8M=eIGxmV1ifNmCpI(~80P zXNx8drH590cW**({bBu?&ePBjLn=5s$GkRrK9a@#X;w-yXkQPX<-?TeEn1;vaC(+l zoVeA#xj(@sYgbMGMr_|4(KvfpTq04?t8*O4p}jV2nnsM~VHqAx_?*}6aKa+46TD-y zId`T@%#Z-@^WRW$>v9dotEJ_~94&9o9NKp8zwmszct;v6=zEECO5M z-#`Ry$2ct>&nTX!E*nuAyJ6PerbG zr*$MLjgS@B&?hFXZ^@iCGoZ6sghQ}5h97c2Q%!RhPIK!5bQ|*27}AWue90@XCEpQm z(vfH)p~x!%sw3$WKW;oJ(~s!zwNjah`*hVDn$84ZxuQczTWNz4|NPaMHX!x zl_tjW4IFN&6PsyQ(H6v^o@;_16?a;XZ?RDTD%Z2*YW&cPpeTuk1k`VIXm@VPH_p{i zC(8_I`$0gP=>G}B#&->-=vJ5R?voM#AzUgpubv=DAQ1<^AX-DqBVo|@{H`Tpm7?@)K z5>Y?H1ANdBjuMT4(_*BlX6V1X@V;ClhO+V6(&hL^s5ieCd(iQ{&MuGVDCaxFL^fz~ z;SoKcJvLI|ox-uvjW%ffdLb33C(3|Dgv!T{V_k@VgktWpAx8+e zIOD{N!V|6WFZekNUj0jUv`EQ33Bg;kVT~g)QMDSM2e+@D4-KNMDzcl1l~m2V4LAjE8~|)2G`<3TYPfPy zZ5f|c)>$BwlHLv8RAOgcVR!{pVdLrN&g zGF^#o{(AlsJZyOMT+}WniBc#+bUV&V3ifwv&US$b-(CCPrVX<6w?I`K4*E zeZ6Z?z{>eEu1(eCa}CF4RzM!Er#+qA*qx~jy|k@{esg5cA2;ZtA{G!>R`IlT z`?2d^ydRsC_BA$CW0HjVn7sz0Qw_9_{Sh$DzU3+`IsK=WA;2BjGl4ZmG8u7X024MZFHgVu zQ^_GmZJT1Qn1ZK+nqs{2e=AHd!ERh0ukIESd9Z_kWx$y)t*1C_N6<7n9+so^ty9B; zpWn&_Hh&Qr0$!=O=zZy<`N})dj zPVW<9=)?TG*l*bjaYvVCzCE(1xm~SxRsFcv21-Yf1jtFe{SUa{&7VC&Mt0J6pz$Us zi0Y5wi_EH!uRwdnU!#T7UCurD0rgFhFh*YMR`qjQZBn`^U+TVDquvRXGtl|fAdCK2F2T(+Ur&v( z-~iJ+Z2i}>-%l-eciVS82x;!Ht`dwsu1yzNw_iDaIc$I2`A79f(N$46k0#fJrXDo( z$hfJUp(VK@Y&mv7+l>wX1Jr2xj^(0_oKj{d>_;!H`IQ{!Ti~{3Z2aA_EjsH=%cg#I zWEYL_>3^?DUS8g=fXCc%7Rq>d@aa6z)R!|lahA5kjVb+xWpGJQmG6C{uF zvZDx0gKPEkaZe{;HI9M|GquR(CG;6HYf2;AO&KF=cy<6EkHFkqI9)@9m9A_j>Jk&@ z(`EJ!M!L?!(Fgii+4P)@lowvI~(1O#> z`ymowu<0)vi`%#EJl~8XhnmC_OBwz7{VwZa zfsxg$O2;uver&Q;+N1iCxw^u_@Wbm8%+u4;T}_Uq(V3bVoPfnDeasm0`pr zNIPi1Y16hHFn%3epKQAYVQc^^Y8O8Ru@A0@=)p|aahrM?>bUwOa2uR1^8ZvVn`p?7 zP>}!cbp(tX0gL$D8=0COkQfZZ92EncY{2K-*xVFlUI%b59fk<0Y#AvTL-*Pm%9U@- zJEmb`%hdFASbT!D?$a~Mhw#_fuCpdKyw_6?cN(M*aNa+tokhVls<&6UjKp;__-^Fi z+7or#Y0IF8t~b3(k{l7Q82--Qu&bqcRKQS!;Lb2g%wY-TSD(6mHS`mHOl6J6`_{AY-XHd1eTl8vba-k2dSxHOm#Nj7Lo!P zBWL8`Khn6Jp=1Hq2D%sRt?l}Y7WNk_(Ede)!DF$qI1&ic2q!A>cA0B6;Uuj;ZaX>i z<--C-L-Umw-L<5t_a)Y0ZxL87RK=879{t}#iMaL&!f0FVI*;0oW0GT??>77j9TwJa zqtWGMR97i{hE`$_Sf6xUit&*ik>zy~!f2}Y&m$k}?XUlS_0tkh>(yt>w;T&z$yT@G zg%t~1MKDjzKsw+T3oR4kCc;{qWlPH8jS_zmU^YNBk3~+*n94V4ZD&d`^*+~(Ki>^| z>iwb%AOr)e0&q8qPWoFk z%6A_IqvTB3+|y9*gNE-Tc?P*VhJO7DcWe*NdF}Nu;*{bW;E;j_;o+ZaG>?OKe!YyZ z#JkGq`RuKbt4uD99qc}h&azNzsn1x!Fh?C}vE`J{L#*m|B1&h>oGaYDIaFPvGG~qw z*SV?-I>G)l(rmpn!o5bZyihXzu_rfcdF=I1;o|V7zE(2~2sxcbi}2ES2e$44qT|Ci z)2pGydl+{bpWopxT6#h0wdgN(KMT;^28C~RSQ#6sH|fX((uUd2#%@xTV0Mi@Hd;1t zO5yerzGS-=et5kvPCxIr&i)JbZ&#*ffrgZz-f zoXRV4+yav?Jqcl6ce9B3;f0=vb1|w7q8bjTE@26|D@0=$2fR4@w`r`;U2}WocY{8f zn-{(-hv~sxG7;!%>zFAJkGVr1!FT(UUq0P&(Jo5icF20}P!`j@PR9Exf|Mmg&vPU& zKw_3+IV>}cO=Oqb*J8-X$n4eu?nIKhbz3dv4XQ=SbW5u$%O{Fz2`*&dal7#q)74c% zsou4A#X~892f42XucD8tsn%UF**5XZ_9~#O)r1Yh3h>WPB6jwDpJnXMeva^BzN> z8%agIW2o09Po*CMm}I66Q>*51U|#1k+(Z(=Q=TjLi}yM$x@u5Ee*YgAVE<=Ew#%)6 z-_Os3BJ)i;kxf*Fr&S`uel7YHyuZqG{D~zwQb*EqGbkB7VT-J3X^u$Jk>3&)JgEIBPK?-@^9Xz$aFYMt=t=qF z6bh%5fk4yO9_mji+&_!)&l+&Znvo;4j+L*jm=3W>^8en_*nUPx%1kbwd<55bQ;8Wz zXQ~-Z*EG&E!KsY>my2##sdpPuYGq-dmlGq2@Ct$lh5g|w`cDPRfA9E*6>UPSjIj9v zy?!r+a;zaezPx(>Zwh=IF(4;PTdq6f`yyyXbyxEq!z$W#8C zM;o{3(;*+GXK^Y*i0d+U=e5{y6fFOW;m0c$$QNC6s1$k6uRlnA*N|ua(5NkI*xV;@ zg9k%|c#o3S(Nqv_@v5ZM+>{K-5|K1Xp?$zueEf)PSbY*0T>rZ_-m!Ndvg_TM6P~I^HM9RRK(&_OG=Oe3 zXq;~^4TyhgL~uG}pK8oY0Q$=unXkupi6gAXQ5QookNTm0$h{lJ_guM;iTS z?MO<-SaEyrQI+ zh~9MlsG%JraiGCY<-6*8Qo|y3R>gu9kv=R*k<46uwhNTL)K7(usLkqF3+t++zE$nK znxyer>w3HPI(6lhFyZON9GjU>ZDCc;$YC^K*!Guk;ZW}0&Q%ZAx zOVdB3=aXp)4ur>3rhED45BrAQ`3IZ!c@|4{|8?$a<@%2^-0DZ&W-?t`heJGe6M%B|OjsHRLWGyE%(VQw3Z2vaZ!WhrRGkb3T&2#jYiN2EORzt2Zl!}g0kd&r zej5|xZBOz3j|LQAjRPTamxfiW$Wd+N2iUcIz3k@KRw$qC@2l*|_WG?8_;_n7@XexS zdbOi(hG~E76SGG&L!(ZoBT6QerUoBUi5~w zMsDq41UX_F12nZwH8MLZMiMA~!x9Q^3WPTTB}g)}?p34b7j1W_{O3XyZ~bL=7w$;W z))?La`)^iN`rJq3(+b`HI#fJw*o*(tSMiSYrlexOPWFHIX}y2CVE-kzreXzlmaLgU z&q%*P7U=I#+YEWt53D!HQ6BbyqLCI&64}SBUAKplzVn`@!8g5ZK-fm7p{7-|(@?9? zE+3>hfjZzIX5{;?BO*_|r2JpaYqjyIgseF5I=WG3OMC&i6UJmfeb);Jc3%e$!6P3s z!6X8_s8N=F#WU{BHR8V)RnS(ZSNvtcNA=P-<&%g~iRRkI@CVTqdG$u3{JQK?$TT|I zPN+AV77Si~jEguT_Pow?7hJ#5P*?2T$2#c1&Y^FwIgR8EzI@<|J^Z+UOZ8%6vGqyL z0A4R*V4wVPJT&}U$g}YIf59Kcjc=lYKMd$-<744U9Rxu%OvSCOkO@r79V%BdxGK&M zc2f&6T{`^Atpcy=JZ|%j`XetI+*=<&=c+6@t_`A_FL3bUbiL6G$F(M$3tDOzZ-35? ze0{lo0W;0O#>d5X-RWhmH0V$^Z;-CrI`r`Ctb^CuT<@!D07|&M{>*Zypu_alz8yxe zJ+2Pc9(~y0)%l)v{dabTC%EigI$gDU ztzn`LyD}SQ|3baW!ZCi>B>~lsP&xoSR4aVz`n9!t!{!=k+OybS>^+GTT}fnJ@{w(l zHn6NT)&kW{Ca;pkNUANp_PJma z*oXZiIcDd*_ES2_mOeYA;eYim$cvZhHZSFp@(CX!iUba(5pMjpW!3DdF7qk?_~~n< zkEVi1A&&_@i`npI$9(A^$@3?UyYBEVTYH*CfXj6ja3*HkR{`}m(5EB9)TfKA0 z?#rm%x~RwZ&K6c*dgPyG1>ydg!7o3EzPJ<0a9MW5Sk_rTnIZ1i{Eu-p2w(goV4flL z1Iq@8_ML2cT!!^h!%%$&K91<^S$B**#eUCIgaZZ`Y8#&(7#@b9?Zs6Sv;2q13FkrP zJ+kFg81s3zheF$tfsMossQ?UtFaB&1nhB6n`N)n zdT(xSnyY+3)__5xmq@0CnOXiJ!kWGO+*(nN{~kEPqZJ>DXM8i=;V*I6dWts%HG=Ic z%|7|BU~qnn+GYU(&{+L3)T`6grk&oX5rl8ZLZhOhfS(!}8@}`MiY!>jU%UJIbCll| z!N%l!cBzL3s~unbz>Po`Ua3OoIQV=Tt93feVE$W2Tv5w?WVcN#3W_!EPbewNlO4@# z6hn`D-FQ6~bj4J>o3<1d*qn27c18c@1~mu*`_9Eo{KE%T)Vg{Tcc=M8$rwFxI?P7T zTB2+vzu>%xvzr!hBA4{P9eUw}A1Ai#*eel8Wkh`GSm^c@m%G!>gOmy53g{4P>@?3d zd^T1Y>keD^?5)GNk6eT6>LF@dB3*QC6giMnxtqRasjyzWt-T63yoQ~ zbbb-PCRU#k;45-E^sp~`Bu2CpTJCtOfOts>{%2GVgw3kZsfeh8_uV##`8bQM*E?J( zR{T4l4fYSNy`F8 z%6SopG1DSnNyuew3OX%;MAK(*YuF19&JUhp%Ps$&06D4`6|W87r!eFApvP&H5E(bQ z|0t_xN*Fo2Z0q5X70=%FLFiX{fD6ntRX_uv+R;tgx7H{3^#pPD<&1-}T!Ud(i!+vz z%VRY|#PZJ+jPJtqxt9+MqoQXHjQ~YMf6X}Ydc|^aI^p*VXMC$ z<8N?}lv=P1YEZ(&O#l83L?{A}1b#7=6aXt>e#jrQ;t>;DIEJwnkWo-Dq#GP^Yv%s4 zs5J~w=K!WFm_2d8t^z<*4NBD-v}{%OciWJ#XsRxAFAh@n2dq`AB*NC!2r9D-M<#cp zD~q_t)1+^V{s1{3q2cd9ZyZ!b%2dL$47rYyHfH!bnNP20vfWP~XLG}+v_P415>Rkk zAxDD)w|y=cAc}=-_}RLGUVSDQ5^?UDH|?2L%o@4H?e@R|Nec-z3V|s19EAC z`NPZ57PU<`ZnxvZ0D+~OoMO?B&R*!mkwe%v%FF6_yn*v@n;Hnjv*h7^07?ngxVPW# zDF0Klxb7F;Ft2BsMOSlo=q;X>jl#RXozO&KT4I9dB%qvlpO}C0dMfCRl}P(W1%jrP zB^jO7%eBzOwRoI$w1ZPA5@gHacuO`)jwIrIpprHSN?JSd`u3-0DCB-!xK+xcqo=_} zG9~yJm6j>Ycv_>n;u`}-Pu2@PYb7$2-AVkOqwn-*d0V>Plg@3?;@QFNT6+vCYmWYl zKtC+Tb-qw&2$iVDvSub9_Y<<3L$THSE~R-3tX-X=J)?OakM(~nYGh0w{;F8;USEH{ zJ#hHpv#~6IGchm(+6W`BZZ;)G0jpPp;@bq_+g-aiVJ1<_K;xv}<{oW3Rq1&6P&VML z=!&Ck)2m|qZ&O*XU++*5D@*mHhjIi{17ne-AWR+Qshc_ z2HM!~qZ8*k%BHCNY~l@TFUN$?d$8Be^ZAV2x#UiMYV*aY)C+O8UtA^R3p2 z_}mjB0?))SQHw9PJSY4fl{VcSds?2;r=eT1jNKA%_w}-a0$#fzAMYuwUOcC(#d6dA z&TXrVm%WsjY-DWg9Dpxz6E~YoebJ> zwxy1j6_q6;<#=wg2)|FyQ?=?M*i@coA(%>Hk(NzAA5Gj{syGi5JNYb2-eQEKQPbtB z7RVGI*KSp7p!B!DI)}j{!1r@&n9ze!n^nP^epIXdH3sJ!A$?TB~Ntzbse~G+HN`W!qERa)Mp`W8H-h z724<{f?_OlngH|9&W2SZ?tmXmcW*CB2hf%_0T5XdZ{7}F;W9JsD21h9y3vs~At8ZE z%==pqIzCWEh&}`W)WjW#2&;8<1#Lkha8IgfYHISMWLO-wHxx)oHVMoQE5;|<=^_bC zBiNIQyh`b!u3JnsAkF70P9IQt4r81K9rg2|EA=RdPTrlkWJdw5!~E)t%@-ZKFcN{J8K35M6J5K-Ecm0VDCT> zZ4J+geGH)t=avX$QD_W7`;mP&qfuw&eBN!|9VV$n%fy=pPdDP;VgCN6RuEJiPlysG zj#~04SLT^;MA@*(My2sVdr%~0)9j<;1rK-<-o{HgR#^boV20FB=Ko_AN;2@_eCxfi z@`)|lLFXIkiC4E~INchyS9hi2DL`R?AUH-W*`XoNc{6Epw`FTaoP_Dw-m?(^)NM$z z`RB6e6$w+IpqZzyyjYBX7&)=gwKQFDi>4iLm_Ra2`%c|=o zfvf!9_Fn1*A|C)t(b%&em*rF8pG}vScqmevkw5Rph=nZHH+bVpA?%_;4_voG21>SVtMeoT|L$oE72px zVz2DxC$+keeLs6K!pAmlDOL7JBru31*|fsMHI|M)u+&SJ!DI$?410pt%~EBoxtY8AYVKdL}~c*Vi1_DT4I{ahycLYVR@OR_=zy4wFWo z&p3SIBhh$WCn3CWTFV6bd-l>`TaJ1ssk?xh3!l$g4Id><{HT!a7U3~1MWO%G%Rpz# z=l!3$TXz{r#pM$qLw5K@k3MG;7d0VC8;<@)Jd%x;K85NLrA*3WO8P6_y%WthVJoGz z?TX^YIT(ST=`g%Y)r06HZI!4Hwt*8z#)7nt4Qc!9X_{>L#PxJG52XpL%4;#C+3FXa z9kOzNF2%oEf1GcwK<4|kD;jt^Wc^CcKC*j)@(|Fo0CM*_7(|&kDu~s#w!Y%2MF-h3 zfWz@2%{pEa!u;$NJ;N=^+1^ZThL}&oKMdEzm`4Q_Qa}7Q@$SVeI}^5ZK7UkiO+;?B zg9kr1Zxv-;2rMcFy|k^e#Bs=$F;IhG!8PZ0+md53>_c9kW()CfQ=Fkf`BX_8=v!@6 z0z4R#w&tEVOw;2NEgJzCZ9vqXUY&lFW}Fy?yfo*+E1A(uqATN zZ?l8^7UhyqHK)?$t-DQ)q*dBcCJC}GDZ0L^ESJ+a!!?H5JRXKu-hfnCj{)U z+I{*aX**EB2e?8Xy}iACgnApeL;a~gira^GkbmF!hTriRD(oCq4n3*F06Xf%$4PzA zQx1Jo5xT%5sI-~3aXST}Kd0O#_4Q%)k(1?(gsv)z1U_#z&vYy$#hoj)o08Y?K>BrR zcA9t<*^MpL@uiZH2W6N)4HR9KbOkD#;!2X*P~7qxCy2TykOK?MX*)(1U^DK}ab9aB zgh#{V`>a4ZmA`+K$IUik_i$cPX9|rr6CS|^fLehYOL(gF!R+mg!|TG3BQ1%P6?KAd z)HNJUPa?g3e>4)9R-xE~?3Oh%c7{97ws5>aZ6=cZz3c+f4rC9Yg!2>X&j_#7G2?7x z1k{`!F33t9u=?+9v8||Gv?SrnJJ&DX@dA7`i0F`tddqa8Pv+b+Um)#oFN)B6%|djt zOEFvY&-&!Y&Cm3N-}%2QN3Qo6aJt?pqb}3AE8Ys*e0fhoB4RfwPPZP@gN(_xt z^X<{zI-S3YJwjt~d_vqEcs+RMEwWDEu%Ow;*_6#C_~tP^vwJ+L2aI$?XrF}(-zPSypI*-p9Wui6qkQ}i7yLr$yNVlkhd z#zoaB?jay%ASQ1)Tx~{68---p0`>PY{mhtArns=&*5MbYQJ0~Ec_ek+sFIUcbUxa2 zB!B|5-WAhGy=#gmJSpBq);L`k6crRDIkNn-O(UbK;uWRZFRQt+EL-7Y{U>I!aSnc_ zwQc1LRXuud#Jr!1xjbs|BouYUZ1ME5q;9^C{r#FCHb1lfH!ly<^n{1({p5S`PGd5nzN)K?kMTT#iTEB6UcdS8@3 zuFx8l{OOQaN7H1#BUjcnXX)K}F>@N;vtL2*BeG54&v~7eN^UD!(PFWN<9PL?gSG$u z#Dxr?$H-4x{M|lF0;LcjFZ0cQ>A)HZ7idHp?1L5@!IRhP{}ikw!@)uUMFJPV6I9V& zm;!eQw2f6XKQ%&##A}0DIe$k)3a!83Pv4R3Z|D-ZS*-)Fmd7yZuMtCuA0@Z6RjWizrp3p{ zXGwBkJOcY|jGp>cxgVN4Wt8L;6naIJ3e#c$bpXFhzdI7yC$4~2(S1-*U=9N7VCU(> zOrXtuu?Z$jfJ5y45|ZGWv9nleC`q>y8r=G9Z^V>f{OQxDMqx(!bDwD?Tv^4fo;CwQr7E=O{^+5Z7DK#l}e z)VP`uPjs2~ZAY1!@Yf}mqUtctjelrv26=_>Tf}^{$lbfkK8 ztaf2muot!1C6O0j*qy%17^&@N)3aO`PL(CXDwo)QExc~YZC$J4CL7u`op0*dZ~XP` zr1odCg`|9x5kyA}z9}7nP+eCrgAbT4++OwGBb<9$dnW<_4X@*B-$`T%@dJ;i_YKGO z60>~f9o}(fN5A%gPvStPu%GM|9ziHQ$Q-o9a$#Ff_K5vM6p5;COuHao{U;B5TN5&P z?aEd_Q*k0{YzuVLAV8-OD+1*D*47I>&!4bUD}mz|Rk#7aft5 z2ZfDlM2?16_U|l3fzKNtKH&SisE}7oblPhO2fa71m{_v^cOMs}>0Q;pnLT=;#f*yu z{(APgJ?jrd3EdOn9svwsfw7OXb-cGJB7z4!`alu>>_!>S~oMU;H&fUi}uXV&%c4Oz|*)o!+yx_pX=KL1{Yg4&0tU$Sj?9D!=`2M zbeyJFC;g|wMkKf&>e)Wl`vXPiuNB8T1; zynylt%1*3@M5K?$`-D5A<`TK_tBt0$LUb;KFbVYZ_voI6`#FuIoR6~hcErfi#{47F z|Lx_c*rIOGjQ*hXZ^_60z+hcXuSZ&0D8wH(DwioDW7|)&b>0P+4X@gqR(WE(UQq9y z7-()2Jm4xtJn-EkS_17jrfY8jxCtM5Ulkg0J1nKyb`{`%`^WM;oaOKK;vcU>9vsZ( z(#oLDuz64is0*c`INN%L9B24Hu>F#l&n)@<-dlgrb|@<${gcf?4N3z1^NerS9GRUb5N>e(T2AFnl!TJ!&*wtC3CDeD$Dur3E6a zHa}vtFVf#V=-la^$QP-zw26h#qr+(>zgQSU0>C~cDG4$9(+g09-WTCeK6|>aAl;4k z6y+fxSyD+rGJxGYpODbx%S%!HH$gS`u~9lugVlk=G9VcIIF|-#YGu52czw2jak`yy z#0}Um`51=St=Qw;G=Gi7_#Apwjva1K(M;&ix%u1me3aeSyyh_9-cWaREEGS#k&-_m zWj$;0{zwre#*fkD9QM-T=Io|Tq?7J`3I3De^vjN!aJ3~c4`Aq)z*bA1Qsx=%kCKRi zKtq~K6_8MCXvF((o7b+K3}CiMI)orZZ)Pq!M%USs8`mMj$tEkKjc)2t`#%aV(Hyex zKbQFl*Jh7{&*Vy=JO4l}$u}7iqMfgg&~22zSAOyvnG56c%2Cysn5{{Pf#>_QO&nHU zp7L%)LL_DwC-F!0)#d*QH{jg8I*S%Cw$B#px~)ZU!pr-z1b5Nc_rBM!*RT}7rEt@| z(zV_=8h)l{{PYR6+l&XUE3lJ(%mJYG@^8OOGtMk-5t{1DJ`9c?hue}rMp48 zJO1tSe*YOqXK+O3oPF=L*0rv{^qX3q9n`+Rc{P`00lEsy#z|0+*5zTZ_67zD4V+3; zzN$IVTJ@=pZwq{F_wj{He`R30M#cZ~9w#|Dg{QOM9^}My7iJx8Z;#efBK~`|#)Pu4 zvDH`yFq@5MtWR`_0F5-8^T~0;=w}d)^adrVal4}-{l7~^NVUjf$AJqla_+Wh1?DXR z5uF}a$L?MLZ3pCO+(!|4-L8iK`p!uh4&5vB6I5sT42UfM*XsT^l?eCFascXTsk$jl zu}w>K&F<5SV9Dl4#d}i%LOEa9PXF{ZrbqUW+BHFUyj~)$9mvRmm|q@r%@lRh@)ASw zSWx`r2rN5Xey`23UzIl_5QF2+|4|IO+jRZrtC-tmJHmy1z%W;LC+Z{wc5juxr+++V z?XmenR+gADW%Mka<0T7-IIM@CS}-6lP-NvT-j=IDY-I?#XkH?7P+d`+Bg3pUYXUu$ zYh~>^p|+>*1m8-++UZ(s1V3IlnuKUMXLI}woVJ-WxZ&|lS0_I`5&G)SYpxd3NdL1- zEgS2eCf#L3nABL)OGGwe)r>LrA$)DNYmZ5DN~^hllT+q*qbnj&3*!g##Vog5 zKVefLk{Z1M1YbV6qfJgzcN5rI=V-kWRf|veWK-WOaFddfI&M~(C!*zKr@jmxWl)9x zkb}J2aC5AX1lw5QZv6?!*~RAh&@i*(-Wr9^)%^kB^ZgEQFl(uv@z6K3r8c8SMC1u| zj0TW9FpQft|L2=M{gs&0&d;Gaa)wZ->Ik!(1p%lOiL)|b+BR)0EdGXphBLLn*9mC~ z9_fK#GoS|x&b4?Mo&Kv@I_l@tD(gDIonH8Hq(fGjM=of>t)kq{rWN^iQIXGNNM6OC z^H49+<^*zCLQAf1kU`xEI3h1as8mpvQgfczM=E>$O$@fa zVJEO*r`&r49mc-_ZV2g9Rg+W*kAc0#!afc}(O#kgoQ+jlm=NC+*O1Y%7dcIx;eB$) z^GU+*Di8IV=u46*V>FxSu=_uSRCcfpPTw7NGe)+Ca;>~Jiz_9+bD4m&p-LyiCV#pV zQeW<%{(F{r0w;uinYqwz-yG_e6sjp;UYHmwUl50a*C3ShZVQ=jxQB&2dmMt+dGS=3 z!h@8CBWzKQ;%1)HMi^i84RibeQL1cupXl)u*!Jf-|8tUmQoyZntouHiWykdi*s+Dz zx39YvfNj0czv$IN-xst$;r}tSc*(4;NiONiQH%Sl4SWnhwMc`S7PA(R+IAK0RyK8T zhzHt7JCNDn(5$`t!=(P+^CN=+w{3L{rLJz_qP(olJhqOg%or6N`Tx(o* z@8<4%%I>{Ay4~^29?jvALl9wO8*{vs7urc`q(C@ja?~@4;NOYlEogc6;DcvJ4VhKa zdehm6%wzHNCiTm?ZuZu19qIT@pB*(btzlHpLcUjRj?5HwPO z!ZZLa;p|^&Sz((-Aar{Gq zh?dgNYISPe#n(n!ZQ|SE=c5H`9K)|0p5~8K+v3SEiO4(1IYD_jg9f>OCI=Umjz<23!&}Dt{#sJ_G3q%8vqUWrrX!XCrez7 z+NDC($fBeZ>tnPLF7Bt<|9!M?-@FD=OJLHLAYTMjJzyc?tR;NaE~s<|z@Nml%*>+< zKQe&21B6KbNLZRHs3&fCo6~&*X06P#u<+O>9oh@01mV62>T9>*4bKKdoc!5P{e{hq zrVQUiV*-!8#5cXqi?#4>oG|}c4(aJ0_1))%y+-J%M9Rk(rMUz+&xPNQyC|0jQ1`A2 z9Mm#y>@Z7#SIURXN7sG4-2bj%jVW)~MKzZ6)4--5Jy{=$7x#158|wns>R*8(aF>yL zComKDPV98})l=Ck4Y%v)>@sX*F&b2o4It@jJL>~PFgd>Z{+SaCK$=j2b(LH1BRL}z zpw@r-TmCnr83Utu^E)a(zE}6o@vpoDb<% zRl~mLc#iM#?yLB#DNbxNayRr)dHC5ByHr8M+P&&J?RRti&lR0aA*N+2gpW=iRh_ut z-9v^0rhfjtHX?0kGSs5~U=gN(4~gcsYCm{v$kw3#IAdD>@zl4KYD=XuFZ%$PVc$rAO$k|z0}ci{zw3M%EF()P>hZOvEa(b9`WMPb_IqRL5Qe0EdMV>|gsKxDyc z>8?k+e7)+yqs>O@b`sLerNAqd(&>&5@AByOJ=1646Nk!Zwom$Nl2$g^Bj8>i$UhQD@ z9k6`=`NJ*d`OmFa(AqWET$YcJmN?;SqVu+XZkoQFh4scIwPK!`n+ndIq<1!R&e2+# z~b$4-cl5_xdoJ(En&o8Ca^QA+3~cR+6pwx zV@u2i*xB+mpM8Q=(tcn=Npk!#)`{+ht3bH@%$q$faL@09%F;Js^~p2*Vy z6{}BS9KmB_ljfghgC?T@Q_{pGZ!$+$&+`Jvq-{QjIRPI)i%(b(_5Z5(g$zCnz*Rt2 zb9eWKu!2IkS=xV%94sK)fB@KiZQ=|r$6#%yU1&Rvbf!bQ$fzhq2HbfL{xL1vPLVR_ zbk67p`5P~7W8H}hLjG45y{UWY!FyzlpUKSqJ5dq$zqx)DKhk%*G3(+dK%L?XdgK)~ z#U6dh6>|D{kJRD{4H2C0I)Qr167SrF7uXO8XW2z*Ge>yl7S&Pa&#|?p@bZkd-^9I0 zN?i+~*uN)5!pCWP4f+SQo_3C5ruIUiA{6)Fi!N^@wrgmtDuoHsO851 z<2C^)VfXuCb(6?V*J$S%$9Ew-+v;3R-5V2>`*oe2oS|t%=|(nI(Md~en`nJfqd4!% zx2lKY^#&63#x@g;%nd??3;b{*IE6H}otfM!BIhYQvRJln$xaBMv)|sYo2#nkl*5iPfSoo4V#)txRt*FN*z;D=VPS~4xIT^6 za{D((VHZ3U26(_U5=d@PNqGlAR1%lht=+CI>g<^x(Ls?WVB@ej-!S1Z-TpM7WkOww zg^0Tt;esMHMsUcr$?TwqjHrw3lF#O$Ch6WQ^tg?G0e<;YTtOC*5{t0)n-ovTIrO5d zci%90CJCQv`W;T9Z(FQ6JbS;d^`E+tzg-h2zV;IvEzRHXd==J-vCeiot|!;PzbRI~ znjnJeI$+3eRJDm}@y&-(P;as$Y=^W6fLoUX7-0SY!h7u|w>YpCWXaM>xgtb;<@&P| zwJSy>w9AV^ymRMDnde(()vwiviB6;m+oLX0m?!j;pRNRCya|r{TMfdG+Xyv+&?6~E z#;Uo#W%gVW>#A`ZAN7PXi3a0{#$1ls5MBd%+4>eD-458F*_GfLtc<%TqfB%4tIIR~ zncyeZA=dm6XK`Cx54Z5u3BQWHEmTHm#$88>PpwF){IgAxqO?J;k}d<5IE6g1;(JOY zs$WQ(A2#u=i?Qh$P#Kjp-^W#$X%OlP69i2L_vVU)CsA$(v2FLVZ3H@f7@gQa7eN*= zCbayX*dFW{4QSC>;}F*1?IfHHx^Dd8^C33-wohO4!yoK7nJ0Lk<+MxZG)NWN7i6WiGR!WskohIu<8GuwdIM?`3`) z-j&7CbRs@?!_bvZ=&aL2%4p62rir=E?7=W8(h=UZl}mO2xh}3mY)HknkT)*ML0dJwKEU2AokVWWC^xl*$&3QP0oIF7uqF1t= zL{{Q}MAg^&D}2|& zEt?xf6Z*QmM!mZ3H)C>eaxreH3i6k)&4d+B$ayGHRsl&HNH?f=NF^*t@5-_1RFLx1 zeaK7>H2gVV&0c+otuPs!sa3#^*RllGnta*yoY9^tl%N*O@*U+&TIqjcXdF{4n+Y8a z-kwpam|>wgeq16EmvJHBz{6lPiL3r2X^`!U&k;@Z^qS_qp{3)0y#7#~TXZ$gA^x2I z)6+Tw(D3(P_F64vTxT-y1qz5(!3GT|u3)Nf_Zb$TR&t9)s(mPp?sF1oft-A8rq>~u12fHmXKi6MfpAhT814* z)|$ENx)TgzjfRhQGIP3H-^wkqZ`E%U@h&0Ip+QZDq0cPBa_W*i{w6}BhmSc6@^+^` zp`uCoq$%{)HVR~96%nU&+nwOcvmX;*aUuG z+*Ih-8Gv%2TDo0NJAx6!&j2xd8n9?dqtP12JV@mXmE!n4RqLFn7`aL&p&>@KsDD4f zuG->6KIB1y%)-qf-H;`g@%cM_+}Hfis;o8a-FuI8J;*(;NP@ywIcGXgh|vSUraDug z(V>H4vwOo(LAek3=XY;xw0s8HEhP{#PpvPM5fOGLaN4&7U6bQ^XdMWGZimA#v>oDZ zJ80Dr9IVJ3)iSQ3mCx8<)g^j_Y)!Pev3v4^hvMJMfJ5WUArlj$qU~Y9e)SQ>Kcdwe z1R-?5w*+RPZMPc{8Qjj{xw*Mxy_St|z3adOcB#`hoBqEPTxeS+_S{Ge-GP z5kO!B&_()kS7wXvT=MDz1Fe5%u;vKrc{x}I(Q~i9wfkiNW~)H49i01<`kT)uATOXE z;s{Q~%F7zG&2q;-TCk1n?__(87fq)LeSvi%ls|!Mcu)>6XE7JoYcJy~=}(gJ%QrsR zt6Uh(YNkii(+}Jqh?TZti9xbbnC3f;^rH~V9{<%xQ!PJ~9@`sc7CR^b{DwzEd=~wm zekgj3YRJsgipVBXTWR~^f&ki(j{>i8=mz690BQfG~(&HiO%>z>L$&Occ`2!-`0<}TSpkiS!#Kqf6l|3 zrRk=v7}>U^W^it>^o4Vj=CSM(%(R;%QX&0-@^U8rrEY?lhi)(YVb$2g#bm8E9V?yP z@p+v!QaJGoCo%FhtFzk8Z2X^aa=c5*u81p2qc1T?iu7O6ZD-Esb)&A}qUwXkANM8w zUlWK1zv8qEa}jeq33|gtml(P=Bw3i+R+&S?jG_DJPK=sFM$37@R9PFP(Jtn+d(y>q zxZ}Oiy6XAYTPo@Omr|7yrK1Xn*WIvovsVzBz;kF&P*93II_I%;W}-?7SgUZ-L>mDK z0BCGM`1Ly_Y9h-@P*HZg9GXpRG1ahhsVjWH?b(2N}-$9ic%C##` z@t2^Mg3lcF%((8DIMfJNLoXzTKDjYuj4OOKTjHJ5m_b;64k=|CqRDk1XGLTY&Sb*eonT0$|QO)ZAaePqB}tN}T0gfjw|-CXAa zu?XB62FW%{*=eccZ+&I~C07`|)mp!aBBYd2owRo}zi89H^U(5+T-Nmh(N#j;SR`2ir6IT zx#Sjz4ti@H!pRIazcGF3X_)$8R*?~4rWnU7eF_cj`^9jl4E+V?(HDFtz~5E98+aIm z-ZCK9B`&58(o{P25xhK59A`o9z(ap@_Ol9I?T3#v=8FE!A+I}SRcgcp%XF!@K0H1Tit|^EKf6e&q-~3lkAKLCEu*zldE&v5tP_Q^p})am$NSq*(9r9~%H@rvCr8-| z`N=`2NA-T8#4s=8`ZFxdmI6;m*N0Nq?1Y&G3h@R<{R)E6oXY8jlGzZUBVh0EvHDg4 zgf=)jrrNK5trs^HGREgS(>G(hx`=v)<%=#_lXLK#H-xA!wXKrky%IXlgqpyfI)dSu z#TLNmIM}5l+W2tJ?O%@Mq2`h$v-3KiNBo0lq_rX3LNE0uC=FjKo29&N$Xp5e?;BxK zI;HH6buPDXE`PzQSR|h=K(LmdBz_S2N)@%dqIvD=0HOcC^I)Ge^Zjgy(*Pe328csD45km!oYtM2g(C8VnI%pEOHsH-CZ=(tN`{EfY`Ab13G^mr$DH>+}kX0Sauk?lQXCj95;7 z6?=xS>Ak*m4KUJpb#<8b;a`&9@V49S9>%bYOx?nf(U+}rjiljim(=OCh=gdZ^B~@W zGt4tv@n^5OIxFihX+E62e_}Sz;?XGQFCeOI5kY!N{`5Md;cM zwj}=j0~R3%9b;VD@qGHbj5agOCu8aYLbI;{5YhKE+a#eZW=y$L}Gjlxd@;A*r)GM^A8$g8bP;?~n0epzfAfF1SYmw=Q~) zKp=%SSA+#V!q4Dj@!YUhD|@`B(T2JAEQ{X>?yWMS%q0T`hhT&fQ7gLAdq+(je+njR z!xCXz)Dx!m!Brm7?rVW--E6mTfq~s($)aXKH;+(NBYRPh8NPgHrfQbK$RKP@DYV^c zf`fh1K~|YVk%PU4n$ygJ{kuq^OQS;G$gzkr4CYabnk}@CF~?hAhcOg($G7gHtH3R= z^Zjh6ahPiGZjojH8&*A+DC2kt)wI0x+W0Au$8QulzRkr1fTS9% zl7Sq%MZ{C_-Ag+4u=NLoG(<$7Zzj*WX*?cSg^V)wpJj^A9QXcOHr;D}^(g}PKj;zQ z$;s|?y6}Oa@q!@w&x3rYz^wPvtg{Qobbr_WKNnzuP!W4QW3!@hsu9SoT@HuR!c)S`B^KSAeHP5dmn&c-H) z5nQ*0p2OsR`I62VnfrbKO>kyJC2Ejm>VgYZa2cz({N&|pS*`LzojAIN zl!%CkZYy=v7%p7oW}#LC04LdXB|Vxl&(t1X_pE5+{4hDqOZm-hSnsG*2O4U((%lok zgz`1d7APu?<}FB2h_@USLY9BArfX@Xa>7kYHUxg>4^ULLV(^u&Yw@dKhW=au?DJ41 z$U%GtsQ&};c|)JlQyN2kdt=NFzsNk^rRuW^)??fJ##nlTK^3bIOS&PaUP6LdbEtvi zH_SO6dXnuJG4~fT&zb@+yYp-!S)<0JWg8g7wKNZt&K8%WQUe!hHeV)zr0F*1W(zAQ zLY|Htax^jQAMp0IHc@F2{n zAzZkNJYKNwM+?7@li!9UxDF~FAh|27p;0_Xg^u|y2fuJdJPR2{lZj>9(6iAKbPJ5? z^P5%K;&13h$4VeM_rLH&BLsnFwhSl|6mV3~Zd~(xejpO^WBz%xl6^Q}UC$1I@g>QL zjtu4pz9d;zIz+h#T1lbf9M5nFpN@WgeYI@k2=PW@pt31$=l9l0u!=B=*F)fUWi-{D8}B3H+)p*S#Uc^@yJJb zsThZ|{~{h`%J?2(xKzav2_tFv>nus{eJ#*({Ca7Z@k zjow6wgQkEKy`L3CoC@a(7AP5bco1R;#gfAFz7bYYw10l&VoQsy{*7;WaA0L?OXg)C z&=8X`B``D4qF+Q}vtZ!E)aS)0t~XnJ(4toLcaHw`Joe=Sp>(u*Zx*7KLzZQS$1TR% zZ)|g<8W?t=3R;XWCLvF4U87u6)*sKi&hm%k?%*HRJiC5E`rwe&wQ~(m&vmBbcM=sfcn>YJ+l(E>8S)5*OcST(n-uB$-NM4K}R}TQp(lrzxB_zor?10!s#acDE0X zoU1GSb;nLW;#QacI$aa%(eVlSTa8QRj2Edoo79<2nj}pA$~_0JdRfcg>dvP`y=y0w zztYo)EdIgB*IVvrk~UUfp|GW&ODJE~y~C}MDT3%?lYQY9F(8;@rhusfVOMJq9S29UXdbjNBaKk!sp@KYKMB+B<896fyDHJ^#hwR+nSzukI!lKdHZ0};9jT(J zxjB601Z690YsKXip9XGfNUG8W&zDlHe2}XGrdCT!%gC4*$Lm84U}HCLHB%Hh91T^O zXz1bb-LQJ#*Vfyclhxg`O)(JW2&OQ2{>>uH1R|6(i0H4*!%4w_lpt$R`#gt~akv7qD?IGNg z#bk3O@8iV6g`*ZNlWr{sB&fhXJ-vGJj=^Q=#55Y`*5-oCl;17A~1FWq9je_GnftX%s0*j%=Ou z7u2)^jtS1RLsHT_&et1DV=axkY4DpBFCoTj{mcu=*p-9zJ&zbn0vp?@gQ>4qx!0QQ z;_V%ONX5s>zxq35CFOg&YmwsEo3IUj&X;Fho6wGW32gKSqi1QI3-H6mes zTEuZ*L>t@ge)p{a{#{+35$Xsc$57~n*NzQlKCP_qMu_3tiM^T93q_1fF%p%RNiB-Q zhz`}dhaHnS9 z6p9^pGG3CB$7pkf@EwKvGEzR@;d2}zbYP)-(Te)ob<1u3dMioxUYR8DP)z1g3!}?5 z8ka+Ojn-qswlCFI{FfdFj4#>e#|O+mtJ$RbcQG+)1E#LBdBUJTX_IQ2i)sulz5y^8&8I#WG)LA=An`6DJ5mRf8?_4H!!e*GFF8nUdOft2;-Q zaX@~n+a9_@tm`$cY^<+zZLLuxggFRN8X7|uE1W$Y8Xp!j9jW3zde)N#UZz1}-7h!> z06TNC`HqBJ;8B1zf^0*#28v&aOE16rhWmha5ikNrc;HHqcZT6S$1uHU1sh;Bl%B6B zWbxA>_#+CSP$TP=&j=zg&28GtucvK@=#8N=Yke4aIZl!9v-8x!rRwzYoH1l3((|ib z%(|e%_8iX|&<^{|!AP z^(#%+aB2{314qk_@eVG-5?ZoTTHlTXG=3PZ1PuXheUoM#QGYN+Y`r106*|e*-IOaOc zi<>FjTiW?lje@R9kL6bp5qfc4i~C^480aIAC*+&2Q0{I8EYw_y zqQjQz6ev=X)M|h39Z+&?Qwdyo5^8v|{-I1CMaBQEv+WRY1QP7;UQ46sUO1tD9sooe ziPmXDPowk)y{4EclL5?z=;ZGH~)c9LL2DVhJNR0`4P#MJV)5-cF#g}(hh`)K-c(_RRTaF2mYuy$C*1(-%+lh!*WItn=Eb#4$#zx7&tc~@EhNOnF*aWuhbbORijC3UC5o1@wR=PNSPY5YX-n_p>V`?Obb_7@(( z$#I#r(0#~ETz~f^-bo?~0n6`#AhY5diC9P>T{3`A!A-F-w0i+$VF2O~tG_26XjYT_ z*WgSes@BeLt@nfgqeab%WDbGc)%Vpn+l0GA1Sr5=m2O=XSxcm7s`n(<6=>UH6}UwWS=Ue8M-F_W;0 z%Y4sjtn@9nPl&!vpeLdu#UImmQ0=!5Pw(PXLU(~KUEAYbS zWSotaq;u;F9SfleC~oqIH(&;b&@ta4_{YIw1D)cPnBXq*zbMuThhD>P!Up~BK)Em7 z%xla9I5P!GLZar7`gu2B=qsGwncW6Dm2+8Md@~RC@6|`u%X(+RNKS&E(y6nDmCI(; zSJee@d+k~h+FSF+TaQ{zzzP*hzDux`>Qm2fU6xvtte}?CLBUa%k zWtWA1D#_M&Dq?W$aEDKUoyJy~p8bgqZ?klFaAK*Hs9r<;R;}w3N7Xc}w)J*#E4v@^ zpO>~jHXUC9{dEpxaYe_xN;Z8pA86ekm)bf+l*-xG#UDQS#J-QfZj4`K|9k3e4?XKg zgU2nIH_6>!j!?7NFn-;h@-ISy4q-wh+;5duWNpK3|F{Ko(p0U-1PpKXvon69VcD(v zGxK77*5@=Fy{H61tXInGjjWE8Qc@Y=c+do@93~9ML0a>^S|*4lAov~ z^;sV7Kb9%5_RKq;iF^MKW4l6MT0O>$A6Ctk(9dXqh`7YAQ-*M8d?J%B!jj1o5paf9CVLX0ua|q|}%yC$~g|5+i_WsfO zBDtIQl5#sHKotSzU=BsOda(kKi+! zB+K#}X-vuQ_IvS{lhY5Ef^aBm$f;M|u_J+*c~nSz{p0Fp zP429>-L{O>Qfqmp!_I8Ela{3GT_eZLw#C#@_BljnFF0@H!?Pv}x(+JO6MtGPJsu%Nv#HxZWDN1 z0dhk-E08;BPVC$mt@0mw2k|SfuUoVR(GZ|}>D7z~W#Qpjq?exgsKHK%<53IDpzQu` zh>5~rfTi@+>HAkaFLpm{-~S3O9IYIaf#MAkz22 z1yJ2(wiEB`?WP>A$QU{$GE0AJGNJ7q#_NmVnO4^OU~%u_Ndfo4k|k!v8tOeVxMGR^ zU$q@)?WzZX{t1BvS{`O+VD_qi{2a+Mr{Aj_k8&gHpI~uHOvli3%NVFl8My z30Ta;>J&QVKm&?bc0$p~Q?y)N z2-elI0(he;cFcc;Rws++MSpZrYX!LN`e9DGb!6^5;Z7V;Z2;z9HR68H4LM!Wv3o?M zdF&Y8zcw}_(P{6Ho_zeu-)Yadzn%UVz<1L4#kW{*@DKwLc~3c8V!RD%4Ab{o=WxFQ zJmSy${rQ(^;rFzJ^{M(wGcal{0}X4YZ9+sZ(vf%mLJY-Q&k$S_+CSFJ1iWmUA47j8 zbtejtN#p6)M>kuFuTIn!Yrzh7^`?{IVOyeLB0#F<@MC{<-VL02Z}Gb{E$?vocz(;2 zJdN*>d$0_vJH_wNfOm(VaUA{|njM&4?;}j>)T9wI%=s3VthjpIPET`#V81VYyM{p@ zR?QBq0?SLEZqj6~-5oF4YN-3^)!+VGIqI?^3gh3Wt;!dDU{CfTN&3E8qSP+zFa{#J zgB?58Ov)C@;Du=lR9vatb1HR6Te$pVd~a#OJH$-3IC z0d!&H)3vtad{wy6$nAp1Ct|NWUlnvdH9Mp|wEn=s!gn%vHE z>Mfq(;W)nbd@i-ru5PlC0nS|iH|t;cRQva}d6_WJpevM`Weuz% zwfQBi%cS#EsiG-GrN%iCdKBp}2*U6cr4^Y{5PP}|B4)ljG|T3ElWu(vh>(DvnYL=UmThG310fM;w&zzS zQqTpzBo_lB7_|I-1h{C2bNHuMZuzadzUkn--NYdL`h?S+8_0FJv?y5^INv1Ec1m@4 zop6iUue@LB52KUYnQi=%ag%Trc_RCs%1^3F{RU?W(@H`XEsFA^fc-uaYF6ZiugTjx zd;br5P(RC;X?!l9pND6$cCG@RW)Etl0&ig>(vLn2UU>J@oy2+)emv%trap<47*fy& z>)yzzU+Mj$zpCW=h%phJXhpdXNf@m$vAmgG9%RayO#vX0a$nhtWL%2Y$#(RL?8t^$ zJv%7=>LGyF=kPcBIPVD$d}iMXG}Qh^M00=GUHeA=YUSZgqesr?ve!C}Jkl&5VFg_J z{aR9Tv|1jRFZ*S_`)gvq?UcBdX(WsLS?qp6+yuizHA)LlA?Zk#=i6!Y{a?3FtNtTD zMB9p;P(6jesc=U?7MSdsKVIh&f1 z^$Xw`K?w7yVSI6ND#;Q;ulVPYlW#ew{5ugpb3|AARvuQVVNDGVou$oj+6)=90rcVn zz|S}TD2F19X=+B%5S5h~_r#K)_S+kJwWXx}P6}lKR_`@}n{*c~>Gi)yt>!J$+9PfK z(ruUCB2lf}Z!sqFtAALIS7-qw z0iFWy9z`|RJP?9zQ;e3}ky&AUF@7AAoH(9ZPzOn|*}gEbxggCh^VL|K-TIXCJ? zyO2qo1~29JW;xE46^87G`hE~@2wb!EzD&9o#Cmk}Yu=~Lp~jqYz8b>gP*GNUyhGn% zrRUgt+u zLIfBSA**cqlc`((<{Hq>YK(f=E?l|Wj(NX}!Bc8m5O~Py| zno?i?9Fn%BCY1Dt21I~UH{_W;}A9qRoPe`f2 zotOD`lyKt2G9PtECV1?`HTEc9eFvUUgZJLsYW33`LCCYu1P@-cu+2h|^03hv79qs% z42*+tNG#WlyBBx4*VVv*%4R2Ln8*Dl*+w+$Qys7l24BN6C)a8#dp zNhn4uIg9J#Qz3s|0oz1lIRgcasRiYn578xW8PGFcG^$wbuUOlpF(jy>sho3ic`J<+ zy+kWqibIf6E;MAX6FK_wq$D0k2OLWTCPA5M$kPyyRpRhITZI+A-T8sn?ZO!utGMxS*?9&7!APnwWlTL({EIZF@{ifge z`ySPE{$6-(xgoMg$C01@wOtU*yu&1_sO4}W`2o*v2XefTBKA_M2;&hF=iXabv({m} z<)4-uDUUkv_4!_xFWRf;CL!rkpV^!VwhH_Csgk^u{BT}$pjT6_#;IX^$chVSvGI>= zc7LxF;Sx7oP|69;Nn!o@7!U4=H_#Eq}e}EJ>e1%q; zSG2UW?|?m}qeeH2v4Ie%K4^UJ6>xF52V*}8z`FG5uU=zN+sM1Gtc4S&Q!4&OzYJNx z`+{V+0l^nYwWdMS?2j#}Affn{#CmOoIsXSc@zy%NZ_>WvC^Eob#Fv?qut$Ry zO^N!&t~?p-gwy4WA`gi&`m35W2HZEuSW_z>F#!37P2Yi8pnlhpE4*OivnK`cIwH1V z#*LsFJ&*gI>ejN2Dy6EyorXH^l5EApgXwNqK{8kiM^-`HfA+I}62Er$)gLYiY%yp> zJg|l`b*%H8{41)`SOz_8YdZ@!a=zo0FuD&HGbSJ`9bN^@#^4`t->6C}GGG@cdP8Nz z@ZX1m2e1abcFmNIat9o(-MDOdm7Kgws|I>{tVSL7$~+}_t~k*B7)~gpQM;`r0s|x+NMuf z$0NyBjmv_#9AmSzzpRCN{$bujrrTyR zqAx=M3g-K_F&yJb{Y6a{;{io$k8>rN#QnH@`EhkHgkfioZ9;CiQzBO?!6oS~P0Cb# zr*grO9v@W(|JXLR+lEAVMaSxrF6G($UXR~%D1jPoy{9Kn=UH5@A?Ff!cH$!Mw-fdJ zg<8lg+rTVkd_o!algzf}=UoS+%u{4JOX^x8M2N|~KPGB9vA@-?v#)HM-;rNvAN}6P z>5S#qvJVg4oA2jqF?gQFfu$%yq(_|r1*0qK3<-w`MXc-T8^|AGlwLaI0N*I=ORl;; zXaHAtBWD%=15zw=IHQ|=U-8|&b8gAqL+Rf@j5MUv#r%D-lKIduNl?x zwTPu$ff7M@nQ~iWUV~)uXjS-^Y zThJ3XQcj^nJ>&V72b{p}-9*oF?rPvr$9jRk3Xykk1^CxBJZj z$l6Nd+ZHSgNT0{E_m5j{6L%;7czqhoe-%?`AI54uuCdfcMCjSf6_UBwjMrix(rW50 z+IG2aOPmThUPA8mUs8cikosyg%kR{|{6xpham13~ow>J2lj52RlSlPMXmzSdd2CZ} zMe=^?=E*bKj6{LhXvkRR#Z+IUgXT1wgYbr!p#B~r7qL%%Z^nHS<%gDWZ+2}cc# z*AGe)Si|MPX+$m?zN}O&^E&N<2T59X&yVha<_4e){wT#$=&xsViRW|pz(+erouR6( zZRGr%O-5!oWZX20&y^LV2|247jH@pNQr)YOY^*|G<-K|mS*G82%MWk2AbNg?ZNe~O zR_A^Z3t8iVy5BUqeP#Krf!umr{>?KRjMQ)K)tV+{RA;qZUoSUrSNB~qx9~%3X>Q|Y z3%w;J-1y>F3^Z!Mvy-LyFhN6!9TD`+{6LmQ#vaBHCZ2A|5QAhd_uA@HM7&NA=(@bs z>XK)+#O-PV$ngiqeZCl16zD=u!uHMC)9W;OXcf_@H;B))Wvwg4*L9(q->tk_*+v7d zkC+6nS3n5hB7UtSU*r$-aY=hi#tPMg?Q?L4i_M+)_D;oIbxd{vN=-&qw%PL(Z<%G; zQoC!6X{|dY=)&^j-LY9WMio$|1S{OBfT+UPreu67Zbr~8e(Lh0|Ajz+`y^!CjaHv;ZJPm5d~TbzE68 z`;N`yoN{vXM8A>Lk81~uB3k#Y?d%z;`^euWpc}8O2HHE;jNn%sPKZoeF$oJA11KC54Hy(JxHGd%bG za)mTsiUYd;8tSHaDtuQFZ;$v4>9Lr{Jyw5qnCl^zX~D5OUxnB^>BCwTS6?t9AiEj1 zQ_i0+-ZPx{9^jm}Aqp~eJ@Oin$5{<@biD!taw#E1h12_<-Sv1$imLM=@xQ6rG<-7^ zL^w^_G-7S`v4DjSm>K<`P-91p2W3rDGct_5{u`u=u&UeJ`OuHt@Z$@~XFu+@^vQ9L z%o>5r9R4eoPm<92!}~mjWD@)SUgeV-g8jerqMlxrQ}OpcrQXXb;an=T|mPy9D6G}x=>pL>pDs9iNiIei6*K-PaSB`hi4}H8UL$v?gyy- zZ8))hHuCN@eJDsY1dr9*hx;#a^|(CUrypmc+5I0D zqga1sh8F*!3I9QnFoQpQef_B~(&tC%ED^gFPe2D<_}ogRK}D}M=ZI)zOC>7@%HrZ8 zZ3}v2`Eb@pIMG0WN0u~mG3mBRmdzVlduP_y=XIgAvHf-n*fg27XZPmB_UqS&r0JG+ zWICeLb_SU`jF$-L3_X04#*TmYqklZFpLs&#mbIb7>sKas@b91b0l_)A*bJBLSKfBD zV|Zre$i}>$bE6t$yb#Ps@r6zJUJourLT8t@wMB)mi&0TS+8B)@UBdnsx=IP>Yb^O@${ z4-~o05-k0CfS_|wLRGTjE81 z-r(w4uda#bL8w=*V;;C(YMxF)GyfKK7kR;zR4wGAZ;?0N?X+umxoeMBIuD6ljTFmh z;7r*}jdkd)+{||v-AwJbt=Uez?cBz5lTW*zOi)(P^9fw`6`tAOeb>51Mb;q z^Ou9vH3i{rfwR!Wo>*Ra&WLdXpO~nqBZ4#S_epdqu5PoyP?d{I3LVCYjYQQ<_1*OU zqv@KXDt)7Mwr$%sCpX!)YpSUxW3pY7?V7B~6Q?F)vaQp}#{GWxuG>G=s?V z><5Zz?c*HC>5A4g;LaE0>9uT|y>{EPN!o9xD2D)AvR=WNh%5b|kJB9t!w0!7z7L#fol5NxSHK+BuJP71DM{nPF| zf*A4H$EY{jop!9>pjod~LmxKghsu8QuGsC7>?1y$RgrzQNx&FT#jXMfqK^W!+(7l|yw#(Bs6tsv^S zaY&@k*Xg297s&`13K;{B_g#=7e?*K6PUMWZ|4H2m7Ipb*i-j}wb9j;lgztntyvw#` zGOOItip^2%;$Zb{`BkUj)C9(-y?5gG{?WYra)*hC`Jh`@2AXUNX4!Gn?<<122=mwn+NEZCj}Z>XnAm1|F4AQr+B7@rlv=7;?J1C05dT?%?*TH z0V?KgWx)d+yqs;4nEx_Qvrg<6`T2k``@bk@5NMUsD?e|S3;EL}82Y?>FrDDU%k`M>My+IXREKoWV-B_wbd8Bh1ED;+CE=I8I+s}u2SoE<}Ggy! z$PMOW8#$vZR~&yL0~LsWnb1Xj4v06nU9ou%0CDf3sRI?ZypFO1sjf}QV{fhZ@#L&L zfW5V8FI-$JiDs`7_5hiF7uhw!T6`qEdb`QYwpOm`01NxRo3?km#Am}Ene{5}7*_JR zSl61>KImtHa^YyO-GW$9@dFdINzG75ZyEeL)}7j2j3b)e#8aiKh(%efb#nEsz6lBIych zXSqk7#$CRUMCtvAE(LH$XTzLMyl>moX^!voppl@5^#t>Rcug>Qk-{BUN-(I1op?@r{=JYW? z28l!6v@Xl}cAu&Fga;gR5JxnEINkX8%@`g&M`PG^-&ua)UOLYRrNd#)*Tf zg^@8^teY;aQ){ww9Uy$81zu<0-U@p`AqknGn(9D>kn|LqaG|gAXREY24^I;32uiD* zI?vF6r^G@u2e4xK=Csrn?ImMJeAYhp*uBT&feqdp$c4wcsZik* z2AXbx(mKF#9laDY9P7%t9kAG@6tqX41f=^B;`h zo-4O!WS(O{#6L-E6#2m1?bqq=&F}tt&jjb@d2#frO{__o`Az86{gaO&F&fxLvpdi6 zbH#)4kik-lX#B{0u1N%KO-!RS<$zvR0Ey)!~@no!i zHt@r{4k&WU%t?(f(WzLxVgt-obrq5P+hDZ6&R`;t)WLWT7xQ(F z2p0zALAnp`sV{tscLH$x5VzhhkL|Z+ z)u=$QMfJVg`ZZbxBqGEf_32ngu$)vG&VK5Rj7ZF%{FSv=GL4)H%QC|tRJT1eer~70 z&)7y%W&_MqmQ-I|2Z(LgP=^?w2+#q`PzXCRg&FJJ%uFvsP- z0TWse4jxUeQE&fmIjtJ5LgDu{_ln~nRK=R$KxTrw(;=B5supmsV*RK(mi3xm7 znjajJg*YUK_?GMX02Cn5d+0@%dSVUXao{ZAG=dR8IS??fVfqE*!+q!^@kkK6z`R?7 zu%oUJoq6t`NoAtplJhJJ&(r#!0%`)}!s&T229YR4lrzmU97mavr9bHV!X`g}owcQ< z<>&%1NByj=M}LLm=i{^Ei2&Rt@9u)Bl8i;i!Cv*&+#R8ebyaD_BAorpkAUh<-_(T8 zp*?yp^X>rm+_6B^c`ERS{(@zp`FXdP2!vzit-wxC% zH~wi^SG*;0!a!m`KAM6t(KJ8s_Im0ix z4S$*?#=jd)ZO&-&j_5IwtrB@a_Y7=1hyd#Qmr0e!jI=DG=M>W|M(A zB0&>}4sdXuA}+&D6)`cg3JAzE03~rUG`K^%M$dM$zyy&!r(N=+f<89A6Yjpn2Z9lj zsL`y{5k8FNjc#7S_d!ckuc;W{-d0{p(f~vZ6uk#fjQ4MZ^^z$N7}6CP2)j?h0CO8H zBCa2;i_kK}emR^MuE==pAU)Q)>+KtKyWR~eMuVY6R9o^~+AWf}V?4|disfbq>%PN` z!{~2HW+8b{KjAB78zs4yO1rh`)&hM-zEsQ;J_*~kuPvMj>tm5IYtV0MH_Q@9)#?y) zb=0I4e^|Z;*<=l-ajlctU;ivU` zDu90v4@T)GbHk17vFUm0q4c}Zu}40w`*U_o{y?Z?Y$da@GeEN|a)w;9I*%7Z(|McS z??1auCwgS?!#`L@pWx?kF&@sfJleW|;FX(ScOaa?XEm=haoN=(aCH%a89vRQ_77JN z>Y4eyt#zdZfW~zpztf5(m>K5nV7$OiQmykjq zIz~ogeZCnBdFjye*0xDj>1o}mwe>kY{wI#MvrMttCNXTYQm9DLJTqS?|Jixbkg!So z9(B-^-ulHrHEhuPXv{gG8r2#XNB?4vTw~X3+|^M$kL-ig;sUZczg+dXD?7I*eX8`4 z_+Cj;Ui)Qfba?gSM6Y^5K|`gFjEuHj4KCjT+!eOQN9hTt{Qhr$=ftCmln)R%kS@a^ zB*{l{OeXee?z51mY9o=oWUlOg8X^aAULsUruMis>```8+@ZL%85|wo~#ragFb-f&I zkvyjt{U;G0$Tlt2sflM%@ghk1gY>3X6a;YyfIdI2=pG4O9u-h&%x%d^2RKN0Dp*~~ zZDyhRA=Al=Oau4UgYeK=)tJsBxK`J{QLP)6PNEE^fOqOL_ z|9{5bN=~EuO)W&qLLk089mi>eZ(e`J_p5@01h_8?_eWj_;XMWN>T8VH0Qw6Mu$Vh6 zG!7^s^bAbM2(JoGpR8a!19`>ghoF z9gy)l>_V|Qo41phErNG0#W!=mepS(7Q{5D??_9dbslli!q&mh|eb4?mB1B)}PKv_d(*TM~;+g0CHPp#Vc5Nj8?eKf6G1TjIJ9vd-xItoL8X>nEH9gu=zBhY()0MW|rEO(*r%Gv!j{ z9Whe(uhH6B^HqD7?%N1E$?uxbN)stvBx>V+kDb7rz?6V#heVPMT0m z#AO-5^!jB;Lr|-dD~ZwhvRKi5Cb#Tjhpz$lT756#Ygm;E|0|huaH$0%wM-+BU>F6$RdTa)_6}>QfacR8;O*F$7Pxdvy>9)IRX<)yKR^DVbn8MF zZX$NM$HE{k(})JV2w?K{NRK{j!ISyapD(0(*tw^xdemTX7U771j|cOLhd?oD($TuH z*5b=wP5lSaJ(m-HVVaP=+C>(Syb}YL&B_iuvy*~uMz@i4G?k1Zjje!`Te+Vv^o)e1 zoOaQDwL8~5y1oQ-q4yKUn)#6*Hr4IjzgYLEf1hxX_x9QDmQoYG1`KfNQ#$?6@gxp2f(a{FT7v5;_k10#+1}S0r;fVM6 z1g_ajn`Be_!#!|`aRPRAEVOM^KeeLSY4bmn>BC6D)js*(CR+NH^!GQMp>{W~c40Br z20%ZyQrT^sfmz1nqi3s&E*ael=QSZJ%9{_^{{y`wp*F7)?5iR8_lzF{q4x?vCQ;dMy2_@6>P1iphXT1!WR(&$ZmiHs8d?3K<} zZPcf0SaB0BQ0gxNF&b9IUMuSlJ-u7lHvv|%7UE5#`eP#ps5j?jSXcMJ`vu~cUI4LD@yPj2zD*C`RE?05^^ z<(X3ZZvw7MN*0)L9oE*g#@Al7*e$d_4d;8eKFrH94g(sor8;9<8=Gv?_v-*WeDVU% zb}BfC#uF_wi_a1$`=SS2yxe$q)0>Ur$W5-OAAiAEbzA)l{Ho>iN9hnl-RF$uUe#e! zCrmL=cg(RFcgA?Se}$AsGMTGao=u6pgK!5w+Nbj~yfq6(a$aeC-_Y86-m(Luqjcjd zJ0QyZsmxW|^5TOFS}(F2C8T~8*I?tJU6IP=qS-W^A&O53zhgxeOSInS%I(BNkx%U3 zcIp?+F^U|&=RxTHp7!9Di_FzX{WZMqA)Kya^cC|fQ&hDCY55aQT?8cjHzvR2Uj}NC zxdY|D(TFGFWJG>s>hIzCPA|f(S~fPHHTxnx>o>l|J+#MGAq};C9rkqGy}a7x2yvbT zi{5B=w0xL&FnoFFQNI+XqT0;@de#o3awE3p9uS!skdZ<_PHt;wH)IIijQP6OKX?eFxK7_W&F1)k3vskUd7HI>A*!Tyo4h zsp!`#$BE?;(#wQdLEux3)wrlpzl0F-#)L_YqODEq6wweoo-I1Q#z_6V`y`eRPW@{Y zMUOSKi)ax|1F~`Vk}M^x#~$VGG*ic{OiWt~@rGceZEgmF4N#hUjLogTgCf; zb-MO$a5sIY%7(hCtdUXxj61`7S0;;vRGcJzM_*AKUh$}equ(b#Vj0i zwIl0UpHr@R9>wk3C7NONbG$_)ct@@UhNPhi#9H{owcPS;72duv70;bEEMq}d8iiw{ zagSqY@rqqO=Udjv(7iW!t6}>AFg#;+ta-u7sSoFy-YBC?fwFK;4v<^(UbwP&$Ysxx z#(?dkrlK;*1Tx40Xc8GnJm7cP++VCUeC+KbhRD#d-~dr7zIN6Wk z^7P7I`NfPy`**ihCnqpf0Mc+KIz_2Mp?n^=!YsPm0cIYESJf?`SxbQm2^(wsk! z2ng)KUMJ&~jfOLISW_R=zI&U|cXviqt`B9+t|uNwvcHUymQ4+ZjH8W&U*8!usJ;2$ zAp|`jHH~S1J%~EF${#dE-Ng1=M>=w_`o8sGV!~s5^D>3XASvmZM#98ok3X28q07b5 zP{fLc0m^RcKkb;|U3)Kkis+CnOyKL2r>9K7h&wr{ycziN1>iwI;QOyIRyR=Qj{U+&jvYrVTw?MLpmo zpQkV%Jr322^{00*r@34I9kdpEoPeh>K#YhToM4+saVUKb1S@d0hz_lh_fCdRL9br% zd2RL%o)56BINU#N`J({76d+HRQ+FWBY-#ht!)WFi0;J<;I&z05gkryj*81SMOgMfx zf#-hWbITjQx!^5+S9s`&3=^ywy__~YL9ib&qyrj*?G@$VHZI77>tLdcf$zn7)r<3{ z@}cT|)s+;=86JOWktHtGBGOMOm7QOR(O!kVaOBs7dn?1Zo6cX`U5XqVQ*hqul(Fs_ zxIRT1wn(Okn*&jy{ZY}E*Ylpz`Da@!qVv*leNa~WXc7YX-MHN{(4rJJ;(L7O6D8WTKJWmD6#_a!ErDq1IG zKquJg;2&I(WgY>wA@u}}%`(ASp}=lnTXICvH3rD@WyZ{v9sxl}6*-p3(ym>YpzFiC z1Qq1zXWI6kv+Bl4kL2RnHvmDAY*wjg&S~w-@a)=X2e`oV7CP~30|Jf>_^4E@$)BM* z3X_llASpVVF}9k~>c}btlJB5eF$V~0g6d!}#=W*vxm3K||8vQX-%uqU3vJs;@C&Cd>gnJn4+AC4lTpI#r(h4J$+=Y8d=~b3 zhxX@O2C9J$-AP(#yrFUt6VJTcq`_tc_J|deFb*QKf>@X)ye`p9%L5=r2xEF(md(Px z`>LH|@{7`!bcSy?`h+*G?|c0zw1b3*2uZIU!J zsJ=+IB>ISRt@cG)QkI6G=m)nv_C-n zvlO)PfcD^ez{QwN^UIX5-T7lLqz>E9%i~jOJX?Ik*YDoU2|R8O)6ETw_y3}AE2W=F z`1!;mY7JxfV@2}4l|HxpGU!ySGAf=wok=vPl`VVbNf$);q*$h*3c-$m#vp5gUCf{+ z14|zKZXthJk-cr&p5%qQ>E-|0l-OZCQ-IbF-@(*SQ}-CZ)<$O}nVTWg@pt#Ie8h-v zG*P=$$Y=O5Fiww()B7S-G&8fD*TmM_GVbSu6l4UlWlOfQA~A6qAD_KvY&F@vejvz$ z-EbDrb|6w-1{46aejra;&(PEophSTb5AGgrl%;k@2+a%Fp7Sx!qhvmuqaLKtpJqAn zvdca_GFn|w9itsjnfcpHL1j0$vKsEjSWJx#Zv32+vZ1@I{}AhcRYmxQG2CkkSxl9b zxNj!7hu&|)>bYnpF5tIkHN=<#=dN6GA$@Zn6@_n3uTs*QaM3kQffOhwjUtexRPMq# zY{VufLbmnhTQS-%nKHI7W_qvEu-`BN4vk4BO+1%O)0p=1@`B!mYOIkI)EjceAY38p zM;66nV{P#G8eO(R>vlkbpKoO5W__KtwPwd-cdyQ%

    A>E3z{4R3aV9R&N}%zNGUu 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ⅇ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%0AUzt<_X^Sc)$R%g(cA1Z11JdF1*UtCAM?`VH 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 RW;?8cFg7?#C^+dD^*@zc=R*Jh literal 0 HcmV?d00001 diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/package.xml b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/package.xml new file mode 100644 index 0000000000000..1425e72cdd886 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/package.xml @@ -0,0 +1,40 @@ + + + + autoware_motion_velocity_obstacle_stop_module + 0.40.0 + obstacle stop feature in motion_velocity_planner + + Takayuki Murooka + Yuki Takagi + Maxime Clement + Berkay Karaman + + Apache License 2.0 + + ament_cmake_auto + autoware_cmake + autoware_motion_utils + autoware_motion_velocity_planner_common_universe + autoware_perception_msgs + autoware_planning_msgs + autoware_route_handler + autoware_universe_utils + autoware_vehicle_info_utils + geometry_msgs + libboost-dev + pluginlib + rclcpp + tf2 + tier4_metric_msgs + tier4_planning_msgs + visualization_msgs + + ament_cmake_ros + ament_lint_auto + autoware_lint_common + + + ament_cmake + + diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/plugins.xml b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/plugins.xml new file mode 100644 index 0000000000000..c51cab7b7c2c8 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/plugins.xml @@ -0,0 +1,3 @@ + + + diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/metrics_manager.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/metrics_manager.hpp new file mode 100644 index 0000000000000..444799aeef615 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/metrics_manager.hpp @@ -0,0 +1,102 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef METRICS_MANAGER_HPP_ +#define METRICS_MANAGER_HPP_ + +#include "type_alias.hpp" +#include "types.hpp" + +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +class MetricsManager +{ +public: + void init() { metrics_.clear(); } + + void calculate_metrics( + const std::string & module_name, const std::string & reason, + const std::shared_ptr planner_data, + const std::vector & traj_points, + const std::optional & stop_pose, + const std::optional & stop_obstacle) + { + // Create status + { + // Decision + Metric decision_metric; + decision_metric.name = module_name + "/decision"; + decision_metric.unit = "string"; + decision_metric.value = reason; + metrics_.push_back(decision_metric); + } + + if (stop_pose.has_value() && planner_data) { // Stop info + Metric stop_position_metric; + stop_position_metric.name = module_name + "/stop_position"; + stop_position_metric.unit = "string"; + const auto & p = stop_pose.value().position; + stop_position_metric.value = + "{" + std::to_string(p.x) + ", " + std::to_string(p.y) + ", " + std::to_string(p.z) + "}"; + metrics_.push_back(stop_position_metric); + + Metric stop_orientation_metric; + stop_orientation_metric.name = module_name + "/stop_orientation"; + stop_orientation_metric.unit = "string"; + const auto & o = stop_pose.value().orientation; + stop_orientation_metric.value = "{" + std::to_string(o.w) + ", " + std::to_string(o.x) + + ", " + std::to_string(o.y) + ", " + std::to_string(o.z) + "}"; + metrics_.push_back(stop_orientation_metric); + + const auto dist_to_stop_pose = autoware::motion_utils::calcSignedArcLength( + traj_points, planner_data->current_odometry.pose.pose.position, stop_pose.value().position); + + Metric dist_to_stop_pose_metric; + dist_to_stop_pose_metric.name = module_name + "/distance_to_stop_pose"; + dist_to_stop_pose_metric.unit = "double"; + dist_to_stop_pose_metric.value = std::to_string(dist_to_stop_pose); + metrics_.push_back(dist_to_stop_pose_metric); + } + + if (stop_obstacle.has_value()) { + // Obstacle info + Metric collision_point_metric; + const auto & p = stop_obstacle.value().collision_point; + collision_point_metric.name = module_name + "/collision_point"; + collision_point_metric.unit = "string"; + collision_point_metric.value = + "{" + std::to_string(p.x) + ", " + std::to_string(p.y) + ", " + std::to_string(p.z) + "}"; + metrics_.push_back(collision_point_metric); + } + } + + MetricArray create_metric_array(const rclcpp::Time & current_time) + { + MetricArray metrics_msg; + metrics_msg.stamp = current_time; + metrics_msg.metric_array.insert( + metrics_msg.metric_array.end(), metrics_.begin(), metrics_.end()); + return metrics_msg; + } + +private: + std::vector metrics_; +}; +} // namespace autoware::motion_velocity_planner + +#endif // METRICS_MANAGER_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/obstacle_stop_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/obstacle_stop_module.cpp new file mode 100644 index 0000000000000..d45ca3894587d --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/obstacle_stop_module.cpp @@ -0,0 +1,1180 @@ +// Copyright 2025 TIER IV, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "obstacle_stop_module.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware::universe_utils::getOrDeclareParameter; + +namespace +{ +template +bool is_in_vector(const T variable, const std::vector & vec) +{ + return std::find(vec.begin(), vec.end(), variable) != vec.end(); +} + +double calc_minimum_distance_to_stop( + const double initial_vel, const double max_acc, const double min_acc) +{ + if (initial_vel < 0.0) { + return -std::pow(initial_vel, 2) / 2.0 / max_acc; + } + + return -std::pow(initial_vel, 2) / 2.0 / min_acc; +} + +autoware::universe_utils::Point2d convert_point(const geometry_msgs::msg::Point & p) +{ + return autoware::universe_utils::Point2d{p.x, p.y}; +} + +std::vector resample_trajectory_points( + const std::vector & traj_points, const double interval) +{ + const auto traj = autoware::motion_utils::convertToTrajectory(traj_points); + const auto resampled_traj = autoware::motion_utils::resampleTrajectory(traj, interval); + return autoware::motion_utils::convertToTrajectoryPointArray(resampled_traj); +} + +std::vector resample_highest_confidence_predicted_paths( + const std::vector & predicted_paths, const double time_interval, + const double time_horizon, const size_t num_paths) +{ + std::vector sorted_paths = predicted_paths; + + // Sort paths by descending confidence + std::sort( + sorted_paths.begin(), sorted_paths.end(), + [](const PredictedPath & a, const PredictedPath & b) { return a.confidence > b.confidence; }); + + std::vector selected_paths; + size_t path_count = 0; + + // Select paths that meet the confidence thresholds + for (const auto & path : sorted_paths) { + if (path_count < num_paths) { + selected_paths.push_back(path); + ++path_count; + } + } + + // Resample each selected path + std::vector resampled_paths; + for (const auto & path : selected_paths) { + if (path.path.size() < 2) { + continue; + } + resampled_paths.push_back( + autoware::object_recognition_utils::resamplePredictedPath(path, time_interval, time_horizon)); + } + + return resampled_paths; +} + +template +std::vector concat_vectors( + const std::vector & first_vector, const std::vector & second_vector) +{ + std::vector concatenated_vector; + concatenated_vector.insert(concatenated_vector.end(), first_vector.begin(), first_vector.end()); + concatenated_vector.insert(concatenated_vector.end(), second_vector.begin(), second_vector.end()); + return concatenated_vector; +} + +double calc_dist_to_bumper(const bool is_driving_forward, const VehicleInfo & vehicle_info) +{ + if (is_driving_forward) { + return std::abs(vehicle_info.max_longitudinal_offset_m); + } + return std::abs(vehicle_info.min_longitudinal_offset_m); +} + +Float64Stamped create_float64_stamped(const rclcpp::Time & now, const float & data) +{ + Float64Stamped msg; + msg.stamp = now; + msg.data = data; + return msg; +} + +double calc_time_to_reach_collision_point( + const Odometry & odometry, const geometry_msgs::msg::Point & collision_point, + const std::vector & traj_points, const double dist_to_bumper, + const double min_velocity_to_reach_collision_point) +{ + const double dist_from_ego_to_obstacle = + std::abs(autoware::motion_utils::calcSignedArcLength( + traj_points, odometry.pose.pose.position, collision_point)) - + dist_to_bumper; + return dist_from_ego_to_obstacle / + std::max(min_velocity_to_reach_collision_point, std::abs(odometry.twist.twist.linear.x)); +} +} // namespace + +void ObstacleStopModule::init(rclcpp::Node & node, const std::string & module_name) +{ + module_name_ = module_name; + clock_ = node.get_clock(); + logger_ = node.get_logger(); + + // ros parameters + ignore_crossing_obstacle_ = + getOrDeclareParameter(node, "obstacle_stop.option.ignore_crossing_obstacle"); + suppress_sudden_stop_ = + getOrDeclareParameter(node, "obstacle_stop.option.suppress_sudden_stop"); + + common_param_ = CommonParam(node); + stop_planning_param_ = StopPlanningParam(node, common_param_); + obstacle_filtering_param_ = ObstacleFilteringParam(node); + + // common publisher + processing_time_publisher_ = + node.create_publisher("~/debug/obstacle_stop/processing_time_ms", 1); + virtual_wall_publisher_ = + node.create_publisher("~/obstacle_stop/virtual_walls", 1); + debug_publisher_ = + node.create_publisher("~/obstacle_stop/debug_markers", 1); + + // module publisher + debug_stop_planning_info_pub_ = + node.create_publisher("~/debug/stop_planning_info", 1); + metrics_pub_ = node.create_publisher("~/stop/metrics", 10); + processing_time_detail_pub_ = node.create_publisher( + "~/debug/processing_time_detail_ms/obstacle_stop", 1); + // interface publisher + objects_of_interest_marker_interface_ = std::make_unique< + autoware::objects_of_interest_marker_interface::ObjectsOfInterestMarkerInterface>( + &node, "obstacle_stop"); + planning_factor_interface_ = + std::make_unique( + &node, "obstacle_stop"); + + // time keeper + time_keeper_ = std::make_shared(processing_time_detail_pub_); +} + +void ObstacleStopModule::update_parameters(const std::vector & parameters) +{ + using universe_utils::updateParam; + + updateParam( + parameters, "obstacle_stop.option.ignore_crossing_obstacle", ignore_crossing_obstacle_); + updateParam(parameters, "obstacle_stop.option.suppress_sudden_stop", suppress_sudden_stop_); +} + +VelocityPlanningResult ObstacleStopModule::plan( + const std::vector & raw_trajectory_points, + [[maybe_unused]] const std::vector & + smoothed_trajectory_points, + const std::shared_ptr planner_data) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + // 1. init variables + stop_watch_.tic(); + debug_data_ptr_ = std::make_shared(); + metrics_manager_.init(); + const double dist_to_bumper = + calc_dist_to_bumper(planner_data->is_driving_forward, planner_data->vehicle_info_); + stop_planning_debug_info_.reset(); + stop_planning_debug_info_.set( + StopPlanningDebugInfo::TYPE::EGO_VELOCITY, planner_data->current_odometry.twist.twist.linear.x); + stop_planning_debug_info_.set( + StopPlanningDebugInfo::TYPE::EGO_ACCELERATION, + planner_data->current_acceleration.accel.accel.linear.x); + trajectory_polygon_for_inside_map_.clear(); + trajectory_polygon_for_outside_ = std::nullopt; + decimated_traj_polys_ = std::nullopt; + + // 2. pre-process + const auto decimated_traj_points = utils::decimate_trajectory_points_from_ego( + raw_trajectory_points, planner_data->current_odometry.pose.pose, + planner_data->ego_nearest_dist_threshold, planner_data->ego_nearest_yaw_threshold, + planner_data->trajectory_polygon_collision_check.decimate_trajectory_step_length, + stop_planning_param_.stop_margin); + + // 3. filter obstacles of predicted objects + const auto stop_obstacles_for_predicted_object = filter_stop_obstacle_for_predicted_object( + planner_data->current_odometry, planner_data->ego_nearest_dist_threshold, + planner_data->ego_nearest_yaw_threshold, + rclcpp::Time(planner_data->predicted_objects_header.stamp), raw_trajectory_points, + decimated_traj_points, planner_data->objects, planner_data->is_driving_forward, + planner_data->vehicle_info_, dist_to_bumper, planner_data->trajectory_polygon_collision_check); + + // 4. filter obstacles of point cloud + const auto stop_obstacles_for_point_cloud = + std::vector{}; // filter_stop_obstacle_for_point_cloud(); + + // 5. concat stop obstacles by predicted objects and point cloud + const auto stop_obstacles = stop_obstacles_for_predicted_object; + concat_vectors(stop_obstacles_for_predicted_object, stop_obstacles_for_point_cloud); + + // 6. plan stop + const auto stop_point = + plan_stop(planner_data, raw_trajectory_points, stop_obstacles, dist_to_bumper); + + // 7. publish messages for debugging + publish_debug_info(); + + // 8. generate VelocityPlanningResult + VelocityPlanningResult result; + if (stop_point) { + result.stop_points.push_back(*stop_point); + } + + return result; +} + +std::vector ObstacleStopModule::filter_stop_obstacle_for_predicted_object( + const Odometry & odometry, const double ego_nearest_dist_threshold, + const double ego_nearest_yaw_threshold, const rclcpp::Time & predicted_objects_stamp, + const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector> & objects, const bool is_driving_forward, + const VehicleInfo & vehicle_info, const double dist_to_bumper, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + const auto & current_pose = odometry.pose.pose; + + std::vector stop_obstacles; + for (const auto & object : objects) { + autoware::universe_utils::ScopedTimeTrack st_for_each_object("for_each_object", *time_keeper_); + + // 1. rough filtering + // 1.1. Check if the obstacle is in front of the ego. + const double lon_dist_from_ego_to_obj = + object->get_dist_from_ego_longitudinal(traj_points, current_pose.position); + if (lon_dist_from_ego_to_obj < 0.0) { + continue; + } + + // 1.2. Check if the rough lateral distance is smaller than the threshold. + // TODO(murooka) outside obstacle stop was removed. + const double min_lat_dist_to_traj_poly = + utils::calc_possible_min_dist_from_obj_to_traj_poly(object, traj_points, vehicle_info); + const uint8_t obj_label = object->predicted_object.classification.at(0).label; + if (get_max_lat_margin(obj_label) < min_lat_dist_to_traj_poly) { + continue; + } + + // 2. precise filtering + const auto & decimated_traj_polys = [&]() { + autoware::universe_utils::ScopedTimeTrack st_get_decimated_traj_polys( + "get_decimated_traj_polys", *time_keeper_); + return get_decimated_traj_polys( + traj_points, current_pose, vehicle_info, ego_nearest_dist_threshold, + ego_nearest_yaw_threshold, trajectory_polygon_collision_check); + }(); + const double dist_from_obj_to_traj_poly = [&]() { + autoware::universe_utils::ScopedTimeTrack st_get_dist_to_traj_poly( + "get_dist_to_traj_poly", *time_keeper_); + return object->get_dist_to_traj_poly(decimated_traj_polys); + }(); + + // 2.1. filter target object inside trajectory + const auto inside_stop_obstacle = filter_inside_stop_obstacle_for_predicted_object( + odometry, traj_points, decimated_traj_points, object, predicted_objects_stamp, + dist_from_obj_to_traj_poly, vehicle_info, dist_to_bumper, trajectory_polygon_collision_check); + if (inside_stop_obstacle) { + stop_obstacles.push_back(*inside_stop_obstacle); + continue; + } + + // 2.2 filter target object outside trajectory + const auto outside_stop_obstacle = filter_outside_stop_obstacle_for_predicted_object( + odometry, traj_points, decimated_traj_points, predicted_objects_stamp, object, + dist_from_obj_to_traj_poly, is_driving_forward, vehicle_info, dist_to_bumper, + trajectory_polygon_collision_check); + if (outside_stop_obstacle) { + stop_obstacles.push_back(*outside_stop_obstacle); + } + } + + // Check target obstacles' consistency + check_consistency(predicted_objects_stamp, objects, stop_obstacles); + + prev_stop_obstacles_ = stop_obstacles; + + return stop_obstacles; +} + +std::optional ObstacleStopModule::filter_inside_stop_obstacle_for_predicted_object( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const double dist_from_obj_poly_to_traj_poly, const VehicleInfo & vehicle_info, + const double dist_to_bumper, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + const auto & predicted_object = object->predicted_object; + const auto & obj_pose = object->get_predicted_pose(clock_->now(), predicted_objects_stamp); + + // 1. filter by label + const uint8_t obj_label = predicted_object.classification.at(0).label; + if (!is_in_vector(obj_label, obstacle_filtering_param_.inside_stop_object_types)) { + return std::nullopt; + } + + // 2. filter by lateral distance + const double max_lat_margin = get_max_lat_margin(obj_label); + // NOTE: max_lat_margin can be negative, so apply std::max with 1e-3. + if (std::max(max_lat_margin, 1e-3) <= dist_from_obj_poly_to_traj_poly) { + return std::nullopt; + } + + // 3. filter by velocity + if (!is_inside_stop_obstacle_velocity(object, traj_points)) { + return std::nullopt; + } + + // calculate collision points with trajectory with lateral stop margin + const auto & p = trajectory_polygon_collision_check; + const auto decimated_traj_polys_with_lat_margin = get_trajectory_polygon_for_inside( + decimated_traj_points, vehicle_info, odometry.pose.pose, max_lat_margin, + p.enable_to_consider_current_pose, p.time_to_convergence, p.decimate_trajectory_step_length); + debug_data_ptr_->decimated_traj_polys = decimated_traj_polys_with_lat_margin; + + // 4. check if the obstacle really collides with the trajectory + const auto collision_point = polygon_utils::get_collision_point( + decimated_traj_points, decimated_traj_polys_with_lat_margin, obj_pose, clock_->now(), + predicted_object.shape, dist_to_bumper); + if (!collision_point) { + return std::nullopt; + } + + // 5. filter if the obstacle will cross and go out of trajectory soon + if ( + ignore_crossing_obstacle_ && + is_crossing_transient_obstacle( + odometry, traj_points, decimated_traj_points, object, dist_to_bumper, + decimated_traj_polys_with_lat_margin, collision_point)) { + return std::nullopt; + } + + return StopObstacle{ + autoware::universe_utils::toHexString(predicted_object.object_id), + predicted_objects_stamp, + predicted_object.classification.at(0), + obj_pose, + predicted_object.shape, + object->get_lon_vel_relative_to_traj(traj_points), + collision_point->first, + collision_point->second}; +} + +bool ObstacleStopModule::is_inside_stop_obstacle_velocity( + const std::shared_ptr object, + const std::vector & traj_points) const +{ + const bool is_prev_object_stop = + utils::get_obstacle_from_uuid( + prev_stop_obstacles_, + autoware::universe_utils::toHexString(object->predicted_object.object_id)) + .has_value(); + + if (is_prev_object_stop) { + if ( + obstacle_filtering_param_.obstacle_velocity_threshold_from_stop < + object->get_lon_vel_relative_to_traj(traj_points)) { + return false; + } + return true; + } + if ( + object->get_lon_vel_relative_to_traj(traj_points) < + obstacle_filtering_param_.obstacle_velocity_threshold_to_stop) { + return true; + } + return false; +} + +bool ObstacleStopModule::is_crossing_transient_obstacle( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::shared_ptr object, const double dist_to_bumper, + const std::vector & decimated_traj_polys_with_lat_margin, + const std::optional> & collision_point) const +{ + // calculate the time to reach the collision point + const double time_to_reach_stop_point = calc_time_to_reach_collision_point( + odometry, collision_point->first, traj_points, + stop_planning_param_.min_behavior_stop_margin + dist_to_bumper, + obstacle_filtering_param_.min_velocity_to_reach_collision_point); + if ( + time_to_reach_stop_point <= obstacle_filtering_param_.crossing_obstacle_collision_time_margin) { + return false; + } + + // get the highest confident predicted paths + std::vector predicted_paths; + for (const auto & path : object->predicted_object.kinematics.predicted_paths) { + predicted_paths.push_back(path); + } + constexpr double prediction_resampling_time_interval = 0.1; + constexpr double prediction_resampling_time_horizon = 10.0; + const auto resampled_predicted_paths = resample_highest_confidence_predicted_paths( + predicted_paths, prediction_resampling_time_interval, prediction_resampling_time_horizon, 1); + if (resampled_predicted_paths.empty() || resampled_predicted_paths.front().path.empty()) { + return false; + } + + // predict object pose when the ego reaches the collision point + const auto future_obj_pose = [&]() { + const auto opt_future_obj_pose = autoware::object_recognition_utils::calcInterpolatedPose( + resampled_predicted_paths.front(), + time_to_reach_stop_point - obstacle_filtering_param_.crossing_obstacle_collision_time_margin); + if (opt_future_obj_pose) { + return *opt_future_obj_pose; + } + return resampled_predicted_paths.front().path.back(); + }(); + + // check if the ego will collide with the obstacle + auto future_predicted_object = object->predicted_object; + future_predicted_object.kinematics.initial_pose_with_covariance.pose = future_obj_pose; + const auto future_collision_point = polygon_utils::get_collision_point( + decimated_traj_points, decimated_traj_polys_with_lat_margin, + future_predicted_object.kinematics.initial_pose_with_covariance.pose, clock_->now(), + future_predicted_object.shape, dist_to_bumper); + const bool no_collision = !future_collision_point; + + return no_collision; +} + +std::optional ObstacleStopModule::filter_outside_stop_obstacle_for_predicted_object( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const rclcpp::Time & predicted_objects_stamp, const std::shared_ptr object, + const double dist_from_obj_poly_to_traj_poly, const bool is_driving_forward, + const VehicleInfo & vehicle_info, const double dist_to_bumper, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + const auto & object_id = + autoware::universe_utils::toHexString(object->predicted_object.object_id); + + // 1. filter by label + const uint8_t obj_label = object->predicted_object.classification.at(0).label; + if (!is_in_vector(obj_label, obstacle_filtering_param_.outside_stop_object_types)) { + return std::nullopt; + } + + // 2. filter by lateral distance + const double max_lat_margin = obj_label == ObjectClassification::UNKNOWN + ? obstacle_filtering_param_.max_lat_margin_against_unknown + : obstacle_filtering_param_.max_lat_margin; + if (dist_from_obj_poly_to_traj_poly < std::max(max_lat_margin, 1e-3)) { + // Obstacle that is not inside of trajectory + return std::nullopt; + } + + const auto time_to_traj = dist_from_obj_poly_to_traj_poly / + std::max(1e-6, object->get_lat_vel_relative_to_traj(traj_points)); + if (time_to_traj > obstacle_filtering_param_.outside_max_lat_time_margin) { + RCLCPP_DEBUG( + logger_, "[Stop] Ignore outside obstacle (%s) since it's far from trajectory.", + object_id.substr(0, 4).c_str()); + return std::nullopt; + } + + // brkay54: For the pedestrians and bicycles, we need to check the collision point by thinking + // they will stop with a predefined deceleration rate to avoid unnecessary stops. + double resample_time_horizon = 10.0; + if (obj_label == ObjectClassification::PEDESTRIAN) { + resample_time_horizon = + std::sqrt( + std::pow( + object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x, 2) + + std::pow( + object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.y, 2)) / + (2.0 * obstacle_filtering_param_.outside_pedestrian_deceleration_rate); + } else if (obj_label == ObjectClassification::BICYCLE) { + resample_time_horizon = + std::sqrt( + std::pow( + object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x, 2) + + std::pow( + object->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.y, 2)) / + (2.0 * obstacle_filtering_param_.outside_bicycle_deceleration_rate); + } + + // Get the highest confidence predicted path + std::vector predicted_paths; + for (const auto & path : object->predicted_object.kinematics.predicted_paths) { + predicted_paths.push_back(path); + } + constexpr double prediction_resampling_time_interval = 0.1; + const auto resampled_predicted_paths = resample_highest_confidence_predicted_paths( + predicted_paths, prediction_resampling_time_interval, resample_time_horizon, + obstacle_filtering_param_.outside_num_of_predicted_paths); + if (resampled_predicted_paths.empty()) { + return std::nullopt; + } + + const auto & p = trajectory_polygon_collision_check; + const auto decimated_traj_polys_with_lat_margin = get_trajectory_polygon_for_outside( + decimated_traj_points, vehicle_info, odometry.pose.pose, 0.0, p.enable_to_consider_current_pose, + p.time_to_convergence, p.decimate_trajectory_step_length); + + const auto get_collision_point = + [&]() -> std::optional> { + for (const auto & predicted_path : resampled_predicted_paths) { + const auto collision_point = create_collision_point_for_outside_stop_obstacle( + odometry, traj_points, decimated_traj_points, decimated_traj_polys_with_lat_margin, object, + predicted_objects_stamp, predicted_path, max_lat_margin, is_driving_forward, vehicle_info, + dist_to_bumper, trajectory_polygon_collision_check.decimate_trajectory_step_length); + if (collision_point) { + return collision_point; + } + } + return std::nullopt; + }; + + const auto collision_point = get_collision_point(); + + if (collision_point) { + return StopObstacle{ + object_id, + predicted_objects_stamp, + object->predicted_object.classification.at(0), + object->get_predicted_pose(clock_->now(), predicted_objects_stamp), + object->predicted_object.shape, + object->get_lon_vel_relative_to_traj(traj_points), + collision_point->first, + collision_point->second}; + } + return std::nullopt; +} + +std::optional> +ObstacleStopModule::create_collision_point_for_outside_stop_obstacle( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector & decimated_traj_polys, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const PredictedPath & resampled_predicted_path, double max_lat_margin, + const bool is_driving_forward, const VehicleInfo & vehicle_info, const double dist_to_bumper, + const double decimate_trajectory_step_length) const +{ + const auto & object_id = + autoware::universe_utils::toHexString(object->predicted_object.object_id); + + std::vector collision_index; + const auto collision_points = polygon_utils::get_collision_points( + decimated_traj_points, decimated_traj_polys, predicted_objects_stamp, resampled_predicted_path, + object->predicted_object.shape, clock_->now(), is_driving_forward, collision_index, + utils::calc_object_possible_max_dist_from_center(object->predicted_object.shape) + + decimate_trajectory_step_length + + std::hypot( + vehicle_info.vehicle_length_m, vehicle_info.vehicle_width_m * 0.5 + max_lat_margin)); + if (collision_points.empty()) { + RCLCPP_DEBUG( + logger_, + "[Stop] Ignore outside obstacle (%s) since there is no collision point between the " + "predicted path " + "and the ego.", + object_id.substr(0, 4).c_str()); + debug_data_ptr_->intentionally_ignored_obstacles.push_back(object); + return std::nullopt; + } + + const double collision_time_margin = + calc_collision_time_margin(odometry, collision_points, traj_points, dist_to_bumper); + if (obstacle_filtering_param_.crossing_obstacle_collision_time_margin < collision_time_margin) { + RCLCPP_DEBUG( + logger_, "[Stop] Ignore outside obstacle (%s) since it will not collide with the ego.", + object_id.substr(0, 4).c_str()); + debug_data_ptr_->intentionally_ignored_obstacles.push_back(object); + return std::nullopt; + } + + return polygon_utils::get_collision_point( + decimated_traj_points, collision_index.front(), collision_points, dist_to_bumper); +} + +std::optional ObstacleStopModule::plan_stop( + const std::shared_ptr planner_data, + const std::vector & traj_points, + const std::vector & stop_obstacles, const double dist_to_bumper) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + if (stop_obstacles.empty()) { + const auto markers = + autoware::motion_utils::createDeletedStopVirtualWallMarker(clock_->now(), 0); + autoware::universe_utils::appendMarkerArray(markers, &debug_data_ptr_->stop_wall_marker); + + prev_stop_distance_info_ = std::nullopt; + return std::nullopt; + } + + std::optional determined_stop_obstacle{}; + std::optional determined_zero_vel_dist{}; + std::optional determined_desired_stop_margin{}; + + const auto closest_stop_obstacles = get_closest_stop_obstacles(stop_obstacles); + for (const auto & stop_obstacle : closest_stop_obstacles) { + const auto ego_segment_idx = + planner_data->find_segment_index(traj_points, planner_data->current_odometry.pose.pose); + + // calculate dist to collide + const double dist_to_collide_on_ref_traj = + autoware::motion_utils::calcSignedArcLength(traj_points, 0, ego_segment_idx) + + stop_obstacle.dist_to_collide_on_decimated_traj; + + // calculate desired stop margin + const double desired_stop_margin = calc_desired_stop_margin( + planner_data, traj_points, stop_obstacle, dist_to_bumper, ego_segment_idx, + dist_to_collide_on_ref_traj); + + // calculate stop point against the obstacle + const auto candidate_zero_vel_dist = calc_candidate_zero_vel_dist( + planner_data, traj_points, stop_obstacle, dist_to_collide_on_ref_traj, desired_stop_margin); + if (!candidate_zero_vel_dist) { + continue; + } + + if (determined_stop_obstacle) { + const bool is_same_param_types = + (stop_obstacle.classification.label == determined_stop_obstacle->classification.label); + if ( + (is_same_param_types && stop_obstacle.dist_to_collide_on_decimated_traj > + determined_stop_obstacle->dist_to_collide_on_decimated_traj) || + (!is_same_param_types && *candidate_zero_vel_dist > determined_zero_vel_dist)) { + continue; + } + } + determined_zero_vel_dist = *candidate_zero_vel_dist; + determined_stop_obstacle = stop_obstacle; + determined_desired_stop_margin = desired_stop_margin; + } + + if (!determined_zero_vel_dist) { + // delete marker + const auto markers = + autoware::motion_utils::createDeletedStopVirtualWallMarker(clock_->now(), 0); + autoware::universe_utils::appendMarkerArray(markers, &debug_data_ptr_->stop_wall_marker); + + prev_stop_distance_info_ = std::nullopt; + return std::nullopt; + } + + // Hold previous stop distance if necessary + hold_previous_stop_if_necessary(planner_data, traj_points, determined_zero_vel_dist); + + // Insert stop point + const auto stop_point = calc_stop_point( + planner_data, traj_points, dist_to_bumper, determined_stop_obstacle, determined_zero_vel_dist); + + // set stop_planning_debug_info + set_stop_planning_debug_info(determined_stop_obstacle, determined_desired_stop_margin); + + return stop_point; +} + +double ObstacleStopModule::calc_desired_stop_margin( + const std::shared_ptr planner_data, + const std::vector & traj_points, const StopObstacle & stop_obstacle, + const double dist_to_bumper, const size_t ego_segment_idx, + const double dist_to_collide_on_ref_traj) +{ + // calculate default stop margin + const double default_stop_margin = [&]() { + const auto ref_traj_length = + autoware::motion_utils::calcSignedArcLength(traj_points, 0, traj_points.size() - 1); + if (dist_to_collide_on_ref_traj > ref_traj_length) { + // Use terminal margin (terminal_stop_margin) for obstacle stop + return stop_planning_param_.terminal_stop_margin; + } + return stop_planning_param_.stop_margin; + }(); + + // calculate stop margin on curve + const double stop_margin_on_curve = calc_margin_from_obstacle_on_curve( + planner_data, traj_points, stop_obstacle, dist_to_bumper, default_stop_margin); + + // calculate stop margin considering behavior's stop point + // NOTE: If behavior stop point is ahead of the closest_obstacle_stop point within a certain + // margin we set closest_obstacle_stop_distance to closest_behavior_stop_distance + const auto closest_behavior_stop_idx = + autoware::motion_utils::searchZeroVelocityIndex(traj_points, ego_segment_idx + 1); + if (closest_behavior_stop_idx) { + const double closest_behavior_stop_dist_on_ref_traj = + autoware::motion_utils::calcSignedArcLength(traj_points, 0, *closest_behavior_stop_idx); + const double stop_dist_diff = + closest_behavior_stop_dist_on_ref_traj - (dist_to_collide_on_ref_traj - stop_margin_on_curve); + if (0.0 < stop_dist_diff && stop_dist_diff < stop_margin_on_curve) { + return stop_planning_param_.min_behavior_stop_margin; + } + } + return stop_margin_on_curve; +} + +std::optional ObstacleStopModule::calc_candidate_zero_vel_dist( + const std::shared_ptr planner_data, + const std::vector & traj_points, const StopObstacle & stop_obstacle, + const double dist_to_collide_on_ref_traj, const double desired_stop_margin) +{ + double candidate_zero_vel_dist = std::max(0.0, dist_to_collide_on_ref_traj - desired_stop_margin); + if (suppress_sudden_stop_) { + const auto acceptable_stop_acc = [&]() -> std::optional { + if (stop_planning_param_.get_param_type(stop_obstacle.classification) == "default") { + return common_param_.limit_min_accel; + } + const double distance_to_judge_suddenness = std::min( + calc_minimum_distance_to_stop( + planner_data->current_odometry.twist.twist.linear.x, common_param_.limit_max_accel, + stop_planning_param_.get_param(stop_obstacle.classification).sudden_object_acc_threshold), + stop_planning_param_.get_param(stop_obstacle.classification).sudden_object_dist_threshold); + if (candidate_zero_vel_dist > distance_to_judge_suddenness) { + return common_param_.limit_min_accel; + } + if (stop_planning_param_.get_param(stop_obstacle.classification).abandon_to_stop) { + RCLCPP_WARN( + rclcpp::get_logger("ObstacleCruisePlanner::StopPlanner"), + "[Cruise] abandon to stop against %s object", + stop_planning_param_.object_types_maps.at(stop_obstacle.classification.label).c_str()); + return std::nullopt; + } else { + return stop_planning_param_.get_param(stop_obstacle.classification).limit_min_acc; + } + }(); + if (!acceptable_stop_acc) { + return std::nullopt; + } + + const double acceptable_stop_pos = + autoware::motion_utils::calcSignedArcLength( + traj_points, 0, planner_data->current_odometry.pose.pose.position) + + calc_minimum_distance_to_stop( + planner_data->current_odometry.twist.twist.linear.x, common_param_.limit_max_accel, + acceptable_stop_acc.value()); + if (acceptable_stop_pos > candidate_zero_vel_dist) { + candidate_zero_vel_dist = acceptable_stop_pos; + } + } + return candidate_zero_vel_dist; +} + +void ObstacleStopModule::hold_previous_stop_if_necessary( + const std::shared_ptr planner_data, + const std::vector & traj_points, + std::optional & determined_zero_vel_dist) +{ + if ( + std::abs(planner_data->current_odometry.twist.twist.linear.x) < + stop_planning_param_.hold_stop_velocity_threshold && + prev_stop_distance_info_) { + // NOTE: We assume that the current trajectory's front point is ahead of the previous + // trajectory's front point. + const size_t traj_front_point_prev_seg_idx = + autoware::motion_utils::findFirstNearestSegmentIndexWithSoftConstraints( + prev_stop_distance_info_->first, traj_points.front().pose); + const double diff_dist_front_points = autoware::motion_utils::calcSignedArcLength( + prev_stop_distance_info_->first, 0, traj_points.front().pose.position, + traj_front_point_prev_seg_idx); + + const double prev_zero_vel_dist = prev_stop_distance_info_->second - diff_dist_front_points; + if ( + std::abs(prev_zero_vel_dist - determined_zero_vel_dist.value()) < + stop_planning_param_.hold_stop_distance_threshold) { + determined_zero_vel_dist.value() = prev_zero_vel_dist; + } + } +} + +std::optional ObstacleStopModule::calc_stop_point( + const std::shared_ptr planner_data, + const std::vector & traj_points, const double dist_to_bumper, + const std::optional & determined_stop_obstacle, + const std::optional & determined_zero_vel_dist) +{ + auto output_traj_points = traj_points; + + // insert stop point + const auto zero_vel_idx = + autoware::motion_utils::insertStopPoint(0, *determined_zero_vel_dist, output_traj_points); + if (!zero_vel_idx) { + return std::nullopt; + } + + // virtual wall marker for stop obstacle + const auto markers = autoware::motion_utils::createStopVirtualWallMarker( + output_traj_points.at(*zero_vel_idx).pose, "obstacle stop", clock_->now(), 0, dist_to_bumper, + "", planner_data->is_driving_forward); + autoware::universe_utils::appendMarkerArray(markers, &debug_data_ptr_->stop_wall_marker); + debug_data_ptr_->obstacles_to_stop.push_back(*determined_stop_obstacle); + + // update planning factor + const auto stop_pose = output_traj_points.at(*zero_vel_idx).pose; + planning_factor_interface_->add( + output_traj_points, planner_data->current_odometry.pose.pose, stop_pose, PlanningFactor::STOP, + SafetyFactorArray{}); + + // Store stop reason debug data + metrics_manager_.calculate_metrics( + "PlannerInterface", "stop", planner_data, traj_points, stop_pose, *determined_stop_obstacle); + + prev_stop_distance_info_ = std::make_pair(output_traj_points, determined_zero_vel_dist.value()); + + return stop_pose.position; +} + +void ObstacleStopModule::set_stop_planning_debug_info( + const std::optional & determined_stop_obstacle, + const std::optional & determined_desired_stop_margin) const +{ + stop_planning_debug_info_.set( + StopPlanningDebugInfo::TYPE::STOP_CURRENT_OBSTACLE_DISTANCE, + determined_stop_obstacle->dist_to_collide_on_decimated_traj); + stop_planning_debug_info_.set( + StopPlanningDebugInfo::TYPE::STOP_CURRENT_OBSTACLE_VELOCITY, + determined_stop_obstacle->velocity); + stop_planning_debug_info_.set( + StopPlanningDebugInfo::TYPE::STOP_TARGET_OBSTACLE_DISTANCE, + determined_desired_stop_margin.value()); + stop_planning_debug_info_.set(StopPlanningDebugInfo::TYPE::STOP_TARGET_VELOCITY, 0.0); + stop_planning_debug_info_.set(StopPlanningDebugInfo::TYPE::STOP_TARGET_ACCELERATION, 0.0); +} + +void ObstacleStopModule::publish_debug_info() +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + // 1. debug marker + MarkerArray debug_marker; + + // 1.1. obstacles + for (size_t i = 0; i < debug_data_ptr_->obstacles_to_stop.size(); ++i) { + // obstacle + const auto obstacle_marker = utils::get_object_marker( + debug_data_ptr_->obstacles_to_stop.at(i).pose, i, "obstacles", 1.0, 0.0, 0.0); + debug_marker.markers.push_back(obstacle_marker); + + // collision point + auto collision_point_marker = autoware::universe_utils::createDefaultMarker( + "map", clock_->now(), "collision_points", 0, Marker::SPHERE, + autoware::universe_utils::createMarkerScale(0.25, 0.25, 0.25), + autoware::universe_utils::createMarkerColor(1.0, 0.0, 0.0, 0.999)); + collision_point_marker.pose.position = debug_data_ptr_->obstacles_to_stop.at(i).collision_point; + debug_marker.markers.push_back(collision_point_marker); + } + + // 1.2. intentionally ignored obstacles + for (size_t i = 0; i < debug_data_ptr_->intentionally_ignored_obstacles.size(); ++i) { + const auto marker = utils::get_object_marker( + debug_data_ptr_->intentionally_ignored_obstacles.at(i) + ->predicted_object.kinematics.initial_pose_with_covariance.pose, + i, "intentionally_ignored_obstacles", 0.0, 1.0, 0.0); + debug_marker.markers.push_back(marker); + } + + // 1.3. detection area + auto decimated_traj_polys_marker = autoware::universe_utils::createDefaultMarker( + "map", clock_->now(), "detection_area", 0, Marker::LINE_LIST, + autoware::universe_utils::createMarkerScale(0.01, 0.0, 0.0), + autoware::universe_utils::createMarkerColor(0.0, 1.0, 0.0, 0.999)); + for (const auto & decimated_traj_poly : debug_data_ptr_->decimated_traj_polys) { + for (size_t dp_idx = 0; dp_idx < decimated_traj_poly.outer().size(); ++dp_idx) { + const auto & current_point = decimated_traj_poly.outer().at(dp_idx); + const auto & next_point = + decimated_traj_poly.outer().at((dp_idx + 1) % decimated_traj_poly.outer().size()); + + decimated_traj_polys_marker.points.push_back( + autoware::universe_utils::createPoint(current_point.x(), current_point.y(), 0.0)); + decimated_traj_polys_marker.points.push_back( + autoware::universe_utils::createPoint(next_point.x(), next_point.y(), 0.0)); + } + } + debug_marker.markers.push_back(decimated_traj_polys_marker); + + debug_publisher_->publish(debug_marker); + + // 2. virtual wall + virtual_wall_publisher_->publish(debug_data_ptr_->stop_wall_marker); + + // 3. stop planning info + const auto stop_debug_msg = stop_planning_debug_info_.convert_to_message(clock_->now()); + debug_stop_planning_info_pub_->publish(stop_debug_msg); + + // 4. objects of interest + objects_of_interest_marker_interface_->publishMarkerArray(); + + // 5. metrics + const auto metrics_msg = metrics_manager_.create_metric_array(clock_->now()); + metrics_pub_->publish(metrics_msg); + + // 6. processing time + processing_time_publisher_->publish(create_float64_stamped(clock_->now(), stop_watch_.toc())); + + // 7. planning factor + planning_factor_interface_->publish(); +} + +double ObstacleStopModule::calc_collision_time_margin( + const Odometry & odometry, const std::vector & collision_points, + const std::vector & traj_points, const double dist_to_bumper) const +{ + const double time_to_reach_stop_point = calc_time_to_reach_collision_point( + odometry, collision_points.front().point, traj_points, + stop_planning_param_.min_behavior_stop_margin + dist_to_bumper, + obstacle_filtering_param_.min_velocity_to_reach_collision_point); + + const double time_to_leave_collision_point = + time_to_reach_stop_point + + dist_to_bumper / std::max( + obstacle_filtering_param_.min_velocity_to_reach_collision_point, + odometry.twist.twist.linear.x); + + const double time_to_start_cross = + (rclcpp::Time(collision_points.front().stamp) - clock_->now()).seconds(); + const double time_to_end_cross = + (rclcpp::Time(collision_points.back().stamp) - clock_->now()).seconds(); + + if (time_to_leave_collision_point < time_to_start_cross) { // Ego goes first. + return time_to_start_cross - time_to_reach_stop_point; + } + if (time_to_end_cross < time_to_reach_stop_point) { // Obstacle goes first. + return time_to_reach_stop_point - time_to_end_cross; + } + return 0.0; // Ego and obstacle will collide. +} + +std::vector ObstacleStopModule::get_trajectory_polygon_for_inside( + const std::vector & decimated_traj_points, const VehicleInfo & vehicle_info, + const geometry_msgs::msg::Pose & current_ego_pose, const double lat_margin, + const bool enable_to_consider_current_pose, const double time_to_convergence, + const double decimate_trajectory_step_length) const +{ + if (trajectory_polygon_for_inside_map_.count(lat_margin) == 0) { + const auto traj_polys = polygon_utils::create_one_step_polygons( + decimated_traj_points, vehicle_info, current_ego_pose, lat_margin, + enable_to_consider_current_pose, time_to_convergence, decimate_trajectory_step_length); + trajectory_polygon_for_inside_map_.emplace(lat_margin, traj_polys); + } + return trajectory_polygon_for_inside_map_.at(lat_margin); +} + +std::vector ObstacleStopModule::get_trajectory_polygon_for_outside( + const std::vector & decimated_traj_points, const VehicleInfo & vehicle_info, + const geometry_msgs::msg::Pose & current_ego_pose, const double lat_margin, + const bool enable_to_consider_current_pose, const double time_to_convergence, + const double decimate_trajectory_step_length) const +{ + if (!trajectory_polygon_for_outside_) { + trajectory_polygon_for_outside_ = polygon_utils::create_one_step_polygons( + decimated_traj_points, vehicle_info, current_ego_pose, lat_margin, + enable_to_consider_current_pose, time_to_convergence, decimate_trajectory_step_length); + } + return *trajectory_polygon_for_outside_; +} + +void ObstacleStopModule::check_consistency( + const rclcpp::Time & current_time, + const std::vector> & objects, + std::vector & stop_obstacles) +{ + autoware::universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); + + for (const auto & prev_closest_stop_obstacle : prev_closest_stop_obstacles_) { + const auto object_itr = std::find_if( + objects.begin(), objects.end(), + [&prev_closest_stop_obstacle](const std::shared_ptr & o) { + return autoware::universe_utils::toHexString(o->predicted_object.object_id) == + prev_closest_stop_obstacle.uuid; + }); + // If previous closest obstacle disappear from the perception result, do nothing anymore. + if (object_itr == objects.end()) { + continue; + } + + const auto is_disappeared_from_stop_obstacle = std::none_of( + stop_obstacles.begin(), stop_obstacles.end(), + [&prev_closest_stop_obstacle](const StopObstacle & so) { + return so.uuid == prev_closest_stop_obstacle.uuid; + }); + if (is_disappeared_from_stop_obstacle) { + // re-evaluate as a stop candidate, and overwrite the current decision if "maintain stop" + // condition is satisfied + const double elapsed_time = (current_time - prev_closest_stop_obstacle.stamp).seconds(); + if ( + (*object_itr)->predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x < + obstacle_filtering_param_.obstacle_velocity_threshold_from_stop && + elapsed_time < obstacle_filtering_param_.stop_obstacle_hold_time_threshold) { + stop_obstacles.push_back(prev_closest_stop_obstacle); + } + } + } + + prev_closest_stop_obstacles_ = get_closest_stop_obstacles(stop_obstacles); +} + +double ObstacleStopModule::calc_margin_from_obstacle_on_curve( + const std::shared_ptr planner_data, + const std::vector & traj_points, const StopObstacle & stop_obstacle, + const double dist_to_bumper, const double default_stop_margin) const +{ + if ( + !stop_planning_param_.enable_approaching_on_curve || obstacle_filtering_param_.use_pointcloud) { + return default_stop_margin; + } + + // calculate short trajectory points towards obstacle + const size_t obj_segment_idx = + autoware::motion_utils::findNearestSegmentIndex(traj_points, stop_obstacle.collision_point); + std::vector short_traj_points{traj_points.at(obj_segment_idx + 1)}; + double sum_short_traj_length{0.0}; + for (int i = obj_segment_idx; 0 <= i; --i) { + short_traj_points.push_back(traj_points.at(i)); + + if ( + 1 < short_traj_points.size() && + stop_planning_param_.stop_margin + dist_to_bumper < sum_short_traj_length) { + break; + } + sum_short_traj_length += + autoware::universe_utils::calcDistance2d(traj_points.at(i), traj_points.at(i + 1)); + } + std::reverse(short_traj_points.begin(), short_traj_points.end()); + if (short_traj_points.size() < 2) { + return default_stop_margin; + } + + // calculate collision index between straight line from ego pose and object + const auto calculate_distance_from_straight_ego_path = + [&](const auto & ego_pose, const auto & object_polygon) { + const auto forward_ego_pose = autoware::universe_utils::calcOffsetPose( + ego_pose, stop_planning_param_.stop_margin + 3.0, 0.0, 0.0); + const auto ego_straight_segment = autoware::universe_utils::Segment2d{ + convert_point(ego_pose.position), convert_point(forward_ego_pose.position)}; + return boost::geometry::distance(ego_straight_segment, object_polygon); + }; + const auto resampled_short_traj_points = resample_trajectory_points(short_traj_points, 0.5); + const auto object_polygon = + autoware::universe_utils::toPolygon2d(stop_obstacle.pose, stop_obstacle.shape); + const auto collision_idx = [&]() -> std::optional { + for (size_t i = 0; i < resampled_short_traj_points.size(); ++i) { + const double dist_to_obj = calculate_distance_from_straight_ego_path( + resampled_short_traj_points.at(i).pose, object_polygon); + if (dist_to_obj < planner_data->vehicle_info_.vehicle_width_m / 2.0) { + return i; + } + } + return std::nullopt; + }(); + if (!collision_idx) { + return stop_planning_param_.min_stop_margin_on_curve; + } + if (*collision_idx == 0) { + return default_stop_margin; + } + + // calculate margin from obstacle + const double partial_segment_length = [&]() { + const double collision_segment_length = autoware::universe_utils::calcDistance2d( + resampled_short_traj_points.at(*collision_idx - 1), + resampled_short_traj_points.at(*collision_idx)); + const double prev_dist = calculate_distance_from_straight_ego_path( + resampled_short_traj_points.at(*collision_idx - 1).pose, object_polygon); + const double next_dist = calculate_distance_from_straight_ego_path( + resampled_short_traj_points.at(*collision_idx).pose, object_polygon); + return (next_dist - planner_data->vehicle_info_.vehicle_width_m / 2.0) / + (next_dist - prev_dist) * collision_segment_length; + }(); + + const double short_margin_from_obstacle = + partial_segment_length + + autoware::motion_utils::calcSignedArcLength( + resampled_short_traj_points, *collision_idx, stop_obstacle.collision_point) - + dist_to_bumper + stop_planning_param_.additional_stop_margin_on_curve; + + return std::min( + default_stop_margin, + std::max(stop_planning_param_.min_stop_margin_on_curve, short_margin_from_obstacle)); +} + +std::vector ObstacleStopModule::get_closest_stop_obstacles( + const std::vector & stop_obstacles) +{ + std::vector candidates{}; + for (const auto & stop_obstacle : stop_obstacles) { + const auto itr = + std::find_if(candidates.begin(), candidates.end(), [&stop_obstacle](const StopObstacle & co) { + return co.classification.label == stop_obstacle.classification.label; + }); + if (itr == candidates.end()) { + candidates.emplace_back(stop_obstacle); + } else if ( + stop_obstacle.dist_to_collide_on_decimated_traj < itr->dist_to_collide_on_decimated_traj) { + *itr = stop_obstacle; + } + } + return candidates; +} + +double ObstacleStopModule::get_max_lat_margin(const uint8_t obj_label) const +{ + if (obj_label == ObjectClassification::UNKNOWN) { + return obstacle_filtering_param_.max_lat_margin_against_unknown; + } + return obstacle_filtering_param_.max_lat_margin; +} + +std::vector ObstacleStopModule::get_decimated_traj_polys( + const std::vector & traj_points, const geometry_msgs::msg::Pose & current_pose, + const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, + const double ego_nearest_dist_threshold, const double ego_nearest_yaw_threshold, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const +{ + if (!decimated_traj_polys_) { + const auto & p = trajectory_polygon_collision_check; + const auto decimated_traj_points = utils::decimate_trajectory_points_from_ego( + traj_points, current_pose, ego_nearest_dist_threshold, ego_nearest_yaw_threshold, + p.decimate_trajectory_step_length, p.goal_extended_trajectory_length); + decimated_traj_polys_ = polygon_utils::create_one_step_polygons( + decimated_traj_points, vehicle_info, current_pose, 0.0, p.enable_to_consider_current_pose, + p.time_to_convergence, p.decimate_trajectory_step_length); + } + return *decimated_traj_polys_; +} + +} // namespace autoware::motion_velocity_planner + +#include +PLUGINLIB_EXPORT_CLASS( + autoware::motion_velocity_planner::ObstacleStopModule, + autoware::motion_velocity_planner::PluginModuleInterface) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/obstacle_stop_module.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/obstacle_stop_module.hpp new file mode 100644 index 0000000000000..e1f94eb243814 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/obstacle_stop_module.hpp @@ -0,0 +1,196 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef OBSTACLE_STOP_MODULE_HPP_ +#define OBSTACLE_STOP_MODULE_HPP_ + +#include "autoware/motion_velocity_planner_common_universe/polygon_utils.hpp" +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" +#include "autoware/object_recognition_utils/predicted_path_utils.hpp" +#include "autoware/universe_utils/system/stop_watch.hpp" +#include "autoware/universe_utils/system/time_keeper.hpp" +#include "metrics_manager.hpp" +#include "parameters.hpp" +#include "stop_planning_debug_info.hpp" +#include "type_alias.hpp" +#include "types.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +class ObstacleStopModule : public PluginModuleInterface +{ +public: + void init(rclcpp::Node & node, const std::string & module_name) override; + void update_parameters(const std::vector & parameters) override; + std::string get_module_name() const override { return module_name_; } + + VelocityPlanningResult plan( + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, + const std::shared_ptr planner_data) override; + +private: + std::string module_name_{}; + rclcpp::Clock::SharedPtr clock_{}; + + // ros parameters + bool ignore_crossing_obstacle_{}; + bool suppress_sudden_stop_{}; + CommonParam common_param_{}; + StopPlanningParam stop_planning_param_{}; + ObstacleFilteringParam obstacle_filtering_param_{}; + + // module publisher + rclcpp::Publisher::SharedPtr debug_stop_planning_info_pub_{}; + rclcpp::Publisher::SharedPtr metrics_pub_{}; + rclcpp::Publisher::SharedPtr + processing_time_detail_pub_{}; + + // interface publisher + std::unique_ptr + objects_of_interest_marker_interface_{}; + + // internal variables + mutable StopPlanningDebugInfo stop_planning_debug_info_{}; + mutable std::shared_ptr debug_data_ptr_{}; + std::vector prev_closest_stop_obstacles_{}; + std::vector prev_stop_obstacles_{}; + MetricsManager metrics_manager_{}; + // previous trajectory and distance to stop + // NOTE: Previous trajectory is memorized to deal with nearest index search for overlapping or + // crossing lanes. + std::optional, double>> prev_stop_distance_info_{ + std::nullopt}; + autoware::universe_utils::StopWatch stop_watch_{}; + mutable std::unordered_map> trajectory_polygon_for_inside_map_{}; + mutable std::optional> trajectory_polygon_for_outside_{std::nullopt}; + mutable std::optional> decimated_traj_polys_{std::nullopt}; + mutable std::shared_ptr time_keeper_{}; + + std::vector get_trajectory_polygon_for_inside( + const std::vector & decimated_traj_points, const VehicleInfo & vehicle_info, + const geometry_msgs::msg::Pose & current_ego_pose, const double lat_margin, + const bool enable_to_consider_current_pose, const double time_to_convergence, + const double decimate_trajectory_step_length) const; + + std::vector get_trajectory_polygon_for_outside( + const std::vector & decimated_traj_points, const VehicleInfo & vehicle_info, + const geometry_msgs::msg::Pose & current_ego_pose, const double lat_margin, + const bool enable_to_consider_current_pose, const double time_to_convergence, + const double decimate_trajectory_step_length) const; + + std::vector filter_stop_obstacle_for_predicted_object( + const Odometry & odometry, const double ego_nearest_dist_threshold, + const double ego_nearest_yaw_threshold, const rclcpp::Time & predicted_objects_stamp, + const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector> & objects, + const bool is_driving_forward, const VehicleInfo & vehicle_info, const double dist_to_bumper, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check); + + std::optional plan_stop( + const std::shared_ptr planner_data, + const std::vector & traj_points, + const std::vector & stop_obstacles, const double dist_to_bumper); + double calc_desired_stop_margin( + const std::shared_ptr planner_data, + const std::vector & traj_points, const StopObstacle & stop_obstacle, + const double dist_to_bumper, const size_t ego_segment_idx, + const double dist_to_collide_on_ref_traj); + std::optional calc_candidate_zero_vel_dist( + const std::shared_ptr planner_data, + const std::vector & traj_points, const StopObstacle & stop_obstacle, + const double dist_to_collide_on_ref_traj, const double desired_stop_margin); + void hold_previous_stop_if_necessary( + const std::shared_ptr planner_data, + const std::vector & traj_points, + std::optional & determined_zero_vel_dist); + std::optional calc_stop_point( + const std::shared_ptr planner_data, + const std::vector & traj_points, const double dist_to_bumper, + const std::optional & determined_stop_obstacle, + const std::optional & determined_zero_vel_dist); + void set_stop_planning_debug_info( + const std::optional & determined_stop_obstacle, + const std::optional & determined_desired_stop_margin) const; + void publish_debug_info(); + + std::optional filter_inside_stop_obstacle_for_predicted_object( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const double dist_from_obj_poly_to_traj_poly, const VehicleInfo & vehicle_info, + const double dist_to_bumper, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const; + bool is_inside_stop_obstacle_velocity( + const std::shared_ptr object, + const std::vector & traj_points) const; + bool is_crossing_transient_obstacle( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::shared_ptr object, const double dist_to_bumper, + const std::vector & decimated_traj_polys_with_lat_margin, + const std::optional> & collision_point) const; + + std::optional filter_outside_stop_obstacle_for_predicted_object( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const rclcpp::Time & predicted_objects_stamp, const std::shared_ptr object, + const double dist_from_obj_poly_to_traj_poly, const bool is_driving_forward, + const VehicleInfo & vehicle_info, const double dist_to_bumper, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const; + std::optional> + create_collision_point_for_outside_stop_obstacle( + const Odometry & odometry, const std::vector & traj_points, + const std::vector & decimated_traj_points, + const std::vector & decimated_traj_polys, + const std::shared_ptr object, const rclcpp::Time & predicted_objects_stamp, + const PredictedPath & resampled_predicted_path, double max_lat_margin, + const bool is_driving_forward, const VehicleInfo & vehicle_info, const double dist_to_bumper, + const double decimate_trajectory_step_length) const; + double calc_collision_time_margin( + const Odometry & odometry, const std::vector & collision_points, + const std::vector & traj_points, const double dist_to_bumper) const; + void check_consistency( + const rclcpp::Time & current_time, + const std::vector> & objects, + std::vector & stop_obstacles); + double calc_margin_from_obstacle_on_curve( + const std::shared_ptr planner_data, + const std::vector & traj_points, const StopObstacle & stop_obstacle, + const double dist_to_bumper, const double default_stop_margin) const; + std::vector get_closest_stop_obstacles( + const std::vector & stop_obstacles); + double get_max_lat_margin(const uint8_t obj_label) const; + std::vector get_decimated_traj_polys( + const std::vector & traj_points, const geometry_msgs::msg::Pose & current_pose, + const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, + const double ego_nearest_dist_threshold, const double ego_nearest_yaw_threshold, + const TrajectoryPolygonCollisionCheck & trajectory_polygon_collision_check) const; +}; +} // namespace autoware::motion_velocity_planner + +#endif // OBSTACLE_STOP_MODULE_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/parameters.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/parameters.hpp new file mode 100644 index 0000000000000..ed17f60b6f417 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/parameters.hpp @@ -0,0 +1,210 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef PARAMETERS_HPP_ +#define PARAMETERS_HPP_ + +#include "autoware/motion_utils/marker/marker_helper.hpp" +#include "autoware/motion_utils/resample/resample.hpp" +#include "autoware/motion_utils/trajectory/trajectory.hpp" +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" +#include "autoware/object_recognition_utils/predicted_path_utils.hpp" +#include "autoware/universe_utils/ros/parameter.hpp" +#include "autoware/universe_utils/ros/update_param.hpp" +#include "autoware/universe_utils/system/stop_watch.hpp" +#include "type_alias.hpp" +#include "types.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware::universe_utils::getOrDeclareParameter; + +struct CommonParam +{ + double max_accel{}; + double min_accel{}; + double max_jerk{}; + double min_jerk{}; + double limit_max_accel{}; + double limit_min_accel{}; + double limit_max_jerk{}; + double limit_min_jerk{}; + + CommonParam() = default; + explicit CommonParam(rclcpp::Node & node) + { + max_accel = getOrDeclareParameter(node, "normal.max_acc"); + min_accel = getOrDeclareParameter(node, "normal.min_acc"); + max_jerk = getOrDeclareParameter(node, "normal.max_jerk"); + min_jerk = getOrDeclareParameter(node, "normal.min_jerk"); + limit_max_accel = getOrDeclareParameter(node, "limit.max_acc"); + limit_min_accel = getOrDeclareParameter(node, "limit.min_acc"); + limit_max_jerk = getOrDeclareParameter(node, "limit.max_jerk"); + limit_min_jerk = getOrDeclareParameter(node, "limit.min_jerk"); + } +}; + +struct ObstacleFilteringParam +{ + bool use_pointcloud{}; + std::vector inside_stop_object_types{}; + std::vector outside_stop_object_types{}; + + double obstacle_velocity_threshold_to_stop{}; + double obstacle_velocity_threshold_from_stop{}; + + double max_lat_margin{}; + double max_lat_margin_against_unknown{}; + + double min_velocity_to_reach_collision_point{}; + double stop_obstacle_hold_time_threshold{}; + + double outside_max_lat_time_margin{}; + int outside_num_of_predicted_paths{}; + double outside_pedestrian_deceleration_rate{}; + double outside_bicycle_deceleration_rate{}; + + double crossing_obstacle_collision_time_margin{}; + + ObstacleFilteringParam() = default; + explicit ObstacleFilteringParam(rclcpp::Node & node) + { + inside_stop_object_types = + utils::get_target_object_type(node, "obstacle_stop.obstacle_filtering.object_type.inside."); + outside_stop_object_types = + utils::get_target_object_type(node, "obstacle_stop.obstacle_filtering.object_type.outside."); + use_pointcloud = + getOrDeclareParameter(node, "obstacle_stop.obstacle_filtering.object_type.pointcloud"); + + obstacle_velocity_threshold_to_stop = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.obstacle_velocity_threshold_to_stop"); + obstacle_velocity_threshold_from_stop = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.obstacle_velocity_threshold_from_stop"); + + max_lat_margin = + getOrDeclareParameter(node, "obstacle_stop.obstacle_filtering.max_lat_margin"); + max_lat_margin_against_unknown = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.max_lat_margin_against_unknown"); + + min_velocity_to_reach_collision_point = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.min_velocity_to_reach_collision_point"); + stop_obstacle_hold_time_threshold = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.stop_obstacle_hold_time_threshold"); + + outside_max_lat_time_margin = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.outside_obstacle.max_lateral_time_margin"); + outside_num_of_predicted_paths = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.outside_obstacle.num_of_predicted_paths"); + outside_pedestrian_deceleration_rate = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.outside_obstacle.pedestrian_deceleration_rate"); + outside_bicycle_deceleration_rate = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.outside_obstacle.bicycle_deceleration_rate"); + + crossing_obstacle_collision_time_margin = getOrDeclareParameter( + node, "obstacle_stop.obstacle_filtering.crossing_obstacle.collision_time_margin"); + } +}; + +struct StopPlanningParam +{ + double stop_margin{}; + double terminal_stop_margin{}; + double min_behavior_stop_margin{}; + double hold_stop_velocity_threshold{}; + double hold_stop_distance_threshold{}; + bool enable_approaching_on_curve{}; + double additional_stop_margin_on_curve{}; + double min_stop_margin_on_curve{}; + + struct ObjectTypeSpecificParams + { + double limit_min_acc{}; + double sudden_object_acc_threshold{}; + double sudden_object_dist_threshold{}; + bool abandon_to_stop{}; + }; + std::unordered_map object_types_maps = { + {ObjectClassification::UNKNOWN, "unknown"}, {ObjectClassification::CAR, "car"}, + {ObjectClassification::TRUCK, "truck"}, {ObjectClassification::BUS, "bus"}, + {ObjectClassification::TRAILER, "trailer"}, {ObjectClassification::MOTORCYCLE, "motorcycle"}, + {ObjectClassification::BICYCLE, "bicycle"}, {ObjectClassification::PEDESTRIAN, "pedestrian"}}; + std::unordered_map object_type_specific_param_map; + + StopPlanningParam() = default; + StopPlanningParam(rclcpp::Node & node, const CommonParam & common_param) + { + stop_margin = getOrDeclareParameter(node, "obstacle_stop.stop_planning.stop_margin"); + terminal_stop_margin = + getOrDeclareParameter(node, "obstacle_stop.stop_planning.terminal_stop_margin"); + min_behavior_stop_margin = + getOrDeclareParameter(node, "obstacle_stop.stop_planning.min_behavior_stop_margin"); + hold_stop_velocity_threshold = getOrDeclareParameter( + node, "obstacle_stop.stop_planning.hold_stop_velocity_threshold"); + hold_stop_distance_threshold = getOrDeclareParameter( + node, "obstacle_stop.stop_planning.hold_stop_distance_threshold"); + enable_approaching_on_curve = getOrDeclareParameter( + node, "obstacle_stop.stop_planning.stop_on_curve.enable_approaching"); + additional_stop_margin_on_curve = getOrDeclareParameter( + node, "obstacle_stop.stop_planning.stop_on_curve.additional_stop_margin"); + min_stop_margin_on_curve = getOrDeclareParameter( + node, "obstacle_stop.stop_planning.stop_on_curve.min_stop_margin"); + + const std::string param_prefix = "obstacle_stop.stop_planning.object_type_specified_params."; + const auto object_types = + getOrDeclareParameter>(node, param_prefix + "types"); + + for (const auto & type_str : object_types) { + if (type_str != "default") { + ObjectTypeSpecificParams param{ + getOrDeclareParameter(node, param_prefix + type_str + ".limit_min_acc"), + getOrDeclareParameter( + node, param_prefix + type_str + ".sudden_object_acc_threshold"), + getOrDeclareParameter( + node, param_prefix + type_str + ".sudden_object_dist_threshold"), + getOrDeclareParameter(node, param_prefix + type_str + ".abandon_to_stop")}; + + param.sudden_object_acc_threshold = + std::min(param.sudden_object_acc_threshold, common_param.limit_min_accel); + param.limit_min_acc = std::min(param.limit_min_acc, param.sudden_object_acc_threshold); + + object_type_specific_param_map.emplace(type_str, param); + } + } + } + + std::string get_param_type(const ObjectClassification label) + { + const auto type_str = object_types_maps.at(label.label); + if (object_type_specific_param_map.count(type_str) == 0) { + return "default"; + } + return type_str; + } + ObjectTypeSpecificParams get_param(const ObjectClassification label) + { + return object_type_specific_param_map.at(get_param_type(label)); + } +}; +} // namespace autoware::motion_velocity_planner + +#endif // PARAMETERS_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/stop_planning_debug_info.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/stop_planning_debug_info.hpp new file mode 100644 index 0000000000000..2028a1123e956 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/stop_planning_debug_info.hpp @@ -0,0 +1,90 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef STOP_PLANNING_DEBUG_INFO_HPP_ +#define STOP_PLANNING_DEBUG_INFO_HPP_ + +#include + +#include "autoware_internal_debug_msgs/msg/float32_multi_array_stamped.hpp" + +#include + +namespace autoware::motion_velocity_planner +{ +using autoware_internal_debug_msgs::msg::Float32MultiArrayStamped; + +class StopPlanningDebugInfo +{ +public: + enum class TYPE { + // ego + EGO_VELOCITY = 0, // index: 0 + EGO_ACCELERATION, + EGO_JERK, // no data + + // stop planning + STOP_CURRENT_OBSTACLE_DISTANCE, // index: 3 + STOP_CURRENT_OBSTACLE_VELOCITY, + STOP_TARGET_OBSTACLE_DISTANCE, + STOP_TARGET_VELOCITY, + STOP_TARGET_ACCELERATION, + + SIZE + }; + + /** + * @brief get the index corresponding to the given value TYPE + * @param [in] type the TYPE enum for which to get the index + * @return index of the type + */ + static int getIndex(const TYPE type) { return static_cast(type); } + + /** + * @brief get all the debug values as an std::array + * @return array of all debug values + */ + std::array(TYPE::SIZE)> get() const { return info_; } + + /** + * @brief set the given type to the given value + * @param [in] type TYPE of the value + * @param [in] value value to set + */ + void set(const TYPE type, const double val) { info_.at(static_cast(type)) = val; } + + /** + * @brief set the given type to the given value + * @param [in] type index of the type + * @param [in] value value to set + */ + void set(const int type, const double val) { info_.at(type) = val; } + + void reset() { info_.fill(0.0); } + + Float32MultiArrayStamped convert_to_message(const rclcpp::Time & current_time) const + { + Float32MultiArrayStamped msg{}; + msg.stamp = current_time; + for (const auto & v : get()) { + msg.data.push_back(v); + } + return msg; + } + +private: + std::array(TYPE::SIZE)> info_; +}; +} // namespace autoware::motion_velocity_planner +#endif // STOP_PLANNING_DEBUG_INFO_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/type_alias.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/type_alias.hpp new file mode 100644 index 0000000000000..b3c278fcafa50 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/type_alias.hpp @@ -0,0 +1,63 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TYPE_ALIAS_HPP_ +#define TYPE_ALIAS_HPP_ + +#include "autoware_vehicle_info_utils/vehicle_info_utils.hpp" + +#include "autoware_internal_debug_msgs/msg/float32_stamped.hpp" +#include "autoware_internal_debug_msgs/msg/float64_stamped.hpp" +#include "autoware_perception_msgs/msg/predicted_object.hpp" +#include "autoware_perception_msgs/msg/predicted_objects.hpp" +#include "autoware_planning_msgs/msg/trajectory.hpp" +#include "geometry_msgs/msg/twist.hpp" +#include "nav_msgs/msg/odometry.hpp" +#include "sensor_msgs/msg/point_cloud2.hpp" +#include "visualization_msgs/msg/marker_array.hpp" +#include +#include +#include +#include + +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware::vehicle_info_utils::VehicleInfo; +using autoware_internal_debug_msgs::msg::Float32Stamped; +using autoware_internal_debug_msgs::msg::Float64Stamped; +using autoware_perception_msgs::msg::ObjectClassification; +using autoware_perception_msgs::msg::PredictedObject; +using autoware_perception_msgs::msg::PredictedObjects; +using autoware_perception_msgs::msg::PredictedPath; +using autoware_perception_msgs::msg::Shape; +using autoware_planning_msgs::msg::Trajectory; +using autoware_planning_msgs::msg::TrajectoryPoint; +using geometry_msgs::msg::Twist; +using nav_msgs::msg::Odometry; +using sensor_msgs::msg::PointCloud2; +using visualization_msgs::msg::Marker; +using visualization_msgs::msg::MarkerArray; +namespace bg = boost::geometry; +using autoware::universe_utils::Point2d; +using autoware::universe_utils::Polygon2d; +using Metric = tier4_metric_msgs::msg::Metric; +using MetricArray = tier4_metric_msgs::msg::MetricArray; +using PointCloud = pcl::PointCloud; +using tier4_planning_msgs::msg::PlanningFactor; +using tier4_planning_msgs::msg::SafetyFactorArray; +} // namespace autoware::motion_velocity_planner +#endif // TYPE_ALIAS_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/types.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/types.hpp new file mode 100644 index 0000000000000..23b0cb701afab --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_stop_module/src/types.hpp @@ -0,0 +1,73 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TYPES_HPP_ +#define TYPES_HPP_ + +#include "autoware/motion_utils/marker/marker_helper.hpp" +#include "autoware/motion_utils/resample/resample.hpp" +#include "autoware/motion_utils/trajectory/trajectory.hpp" +#include "type_alias.hpp" + +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +struct StopObstacle +{ + StopObstacle( + const std::string & arg_uuid, const rclcpp::Time & arg_stamp, + const ObjectClassification & object_classification, const geometry_msgs::msg::Pose & arg_pose, + const Shape & arg_shape, const double arg_lon_velocity, + const geometry_msgs::msg::Point arg_collision_point, + const double arg_dist_to_collide_on_decimated_traj) + : uuid(arg_uuid), + stamp(arg_stamp), + pose(arg_pose), + velocity(arg_lon_velocity), + shape(arg_shape), + collision_point(arg_collision_point), + dist_to_collide_on_decimated_traj(arg_dist_to_collide_on_decimated_traj), + classification(object_classification) + { + } + std::string uuid; + rclcpp::Time stamp; + geometry_msgs::msg::Pose pose; // interpolated with the current stamp + double velocity; // longitudinal velocity against ego's trajectory + + Shape shape; + geometry_msgs::msg::Point + collision_point; // TODO(yuki_takagi): this member variable still used in + // calculateMarginFromObstacleOnCurve() and should be removed as it can be + // replaced by ”dist_to_collide_on_decimated_traj” + double dist_to_collide_on_decimated_traj; + ObjectClassification classification; +}; + +struct DebugData +{ + DebugData() = default; + std::vector> intentionally_ignored_obstacles; + std::vector obstacles_to_stop; + std::vector decimated_traj_polys; + MarkerArray stop_wall_marker; +}; + +} // namespace autoware::motion_velocity_planner + +#endif // TYPES_HPP_ From 8c62d21c8a304098c3382260297b68e63ef275f3 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Thu, 30 Jan 2025 09:06:54 +0900 Subject: [PATCH 2/2] feat(motion_velocity_planner): common implementation for motion_velocity_obstacle__module (#10035) * feat(motion_velocity_planner): prepare for motion_velocity__module Signed-off-by: Takayuki Murooka * update launch Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka --- .../motion_planning.launch.xml | 23 ++ .../src/dynamic_obstacle_stop_module.cpp | 10 +- .../src/dynamic_obstacle_stop_module.hpp | 3 +- .../src/object_filtering.cpp | 4 +- .../src/object_filtering.hpp | 2 +- .../src/types.hpp | 22 +- .../test/test_object_filtering.cpp | 2 +- .../src/obstacle_velocity_limiter.cpp | 2 +- .../src/obstacle_velocity_limiter.hpp | 2 +- .../src/obstacle_velocity_limiter_module.cpp | 8 +- .../src/obstacle_velocity_limiter_module.hpp | 3 +- .../src/obstacles.cpp | 5 +- .../src/obstacles.hpp | 3 +- .../test/test_collision_distance.cpp | 6 +- .../src/filter_predicted_objects.cpp | 2 +- .../src/out_of_lane_module.cpp | 23 +- .../src/out_of_lane_module.hpp | 5 +- .../planner_data.hpp | 82 ++++-- .../plugin_module_interface.hpp | 3 +- .../polygon_utils.hpp | 82 ++++++ .../utils.hpp | 134 +++++++++ .../velocity_planning_result.hpp | 5 + .../package.xml | 1 + .../src/planner_data.cpp | 189 ++++++++++++ .../src/polygon_utils.cpp | 276 ++++++++++++++++++ .../src/utils.cpp | 176 +++++++++++ .../config/motion_velocity_planner.param.yaml | 11 + .../motion_velocity_planner.schema.json | 32 ++ .../src/node.cpp | 83 ++++-- .../src/node.hpp | 12 +- .../src/planner_manager.cpp | 6 +- .../src/planner_manager.hpp | 3 +- 32 files changed, 1122 insertions(+), 98 deletions(-) create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/polygon_utils.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/utils.hpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/planner_data.cpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/polygon_utils.cpp create mode 100644 planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/utils.cpp diff --git a/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/motion_planning/motion_planning.launch.xml b/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/motion_planning/motion_planning.launch.xml index 2d5177d4252d8..4e39c8e43d4ab 100644 --- a/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/motion_planning/motion_planning.launch.xml +++ b/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/motion_planning/motion_planning.launch.xml @@ -2,6 +2,9 @@ + + + @@ -9,6 +12,21 @@ + + + + + @@ -141,6 +161,9 @@ + + + diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp index c7a103e0269ca..15fcc52f0fd24 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp @@ -97,19 +97,21 @@ void DynamicObstacleStopModule::update_parameters(const std::vector & ego_trajectory_points, + [[maybe_unused]] const std::vector & + raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data) { VelocityPlanningResult result; debug_data_.reset_data(); - if (ego_trajectory_points.size() < 2) return result; + if (smoothed_trajectory_points.size() < 2) return result; autoware::universe_utils::StopWatch stopwatch; stopwatch.tic(); stopwatch.tic("preprocessing"); dynamic_obstacle_stop::EgoData ego_data; ego_data.pose = planner_data->current_odometry.pose.pose; - ego_data.trajectory = ego_trajectory_points; + ego_data.trajectory = smoothed_trajectory_points; autoware::motion_utils::removeOverlapPoints(ego_data.trajectory); ego_data.first_trajectory_idx = autoware::motion_utils::findNearestSegmentIndex(ego_data.trajectory, ego_data.pose.position); @@ -164,7 +166,7 @@ VelocityPlanningResult DynamicObstacleStopModule::plan( if (stop_pose) { result.stop_points.push_back(stop_pose->position); planning_factor_interface_->add( - ego_trajectory_points, ego_data.pose, *stop_pose, PlanningFactor::STOP, + smoothed_trajectory_points, ego_data.pose, *stop_pose, PlanningFactor::STOP, SafetyFactorArray{}); create_virtual_walls(); } diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.hpp index a678e7657a6c3..aca86a82798ab 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.hpp @@ -36,7 +36,8 @@ class DynamicObstacleStopModule : public PluginModuleInterface void publish_planning_factor() override { planning_factor_interface_->publish(); }; void update_parameters(const std::vector & parameters) override; VelocityPlanningResult plan( - const std::vector & ego_trajectory_points, + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data) override; std::string get_module_name() const override { return module_name_; } diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.cpp index 0726fdba02de0..850255e0c5093 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.cpp @@ -96,12 +96,12 @@ bool is_unavoidable( }; std::vector filter_predicted_objects( - const std::vector & objects, const EgoData & ego_data, + const std::vector> & objects, const EgoData & ego_data, const PlannerParam & params, const double hysteresis) { std::vector filtered_objects; for (const auto & object : objects) { - const auto & predicted_object = object.predicted_object; + const auto & predicted_object = object->predicted_object; const auto is_not_too_slow = predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x >= params.minimum_object_velocity; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.hpp index 33abb19074099..77b3d2b1ead45 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.hpp @@ -76,7 +76,7 @@ bool is_unavoidable( /// @param hysteresis [m] extra distance threshold used for filtering /// @return filtered predicted objects std::vector filter_predicted_objects( - const std::vector & objects, const EgoData & ego_data, + const std::vector> & objects, const EgoData & ego_data, const PlannerParam & params, const double hysteresis); } // namespace autoware::motion_velocity_planner::dynamic_obstacle_stop diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/types.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/types.hpp index 8cf83f63f4d01..2e3af577a83f4 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/types.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/types.hpp @@ -53,23 +53,23 @@ struct PlannerParam struct EgoData { - TrajectoryPoints trajectory; + TrajectoryPoints trajectory{}; size_t first_trajectory_idx{}; - double longitudinal_offset_to_first_trajectory_idx; // [m] - geometry_msgs::msg::Pose pose; - autoware::universe_utils::MultiPolygon2d trajectory_footprints; - Rtree rtree; - std::optional earliest_stop_pose; + double longitudinal_offset_to_first_trajectory_idx{}; // [m] + geometry_msgs::msg::Pose pose{}; + autoware::universe_utils::MultiPolygon2d trajectory_footprints{}; + Rtree rtree{}; + std::optional earliest_stop_pose{}; }; /// @brief debug data struct DebugData { - autoware::universe_utils::MultiPolygon2d obstacle_footprints; + autoware::universe_utils::MultiPolygon2d obstacle_footprints{}; size_t prev_dynamic_obstacles_nb{}; - autoware::universe_utils::MultiPolygon2d ego_footprints; + autoware::universe_utils::MultiPolygon2d ego_footprints{}; size_t prev_ego_footprints_nb{}; - std::optional stop_pose; + std::optional stop_pose{}; size_t prev_collisions_nb{}; double z{}; void reset_data() @@ -82,8 +82,8 @@ struct DebugData struct Collision { - geometry_msgs::msg::Point point; - std::string object_uuid; + geometry_msgs::msg::Point point{}; + std::string object_uuid{}; }; } // namespace autoware::motion_velocity_planner::dynamic_obstacle_stop diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/test/test_object_filtering.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/test/test_object_filtering.cpp index 419b5d9e46bd1..3ff4cf0c9972f 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/test/test_object_filtering.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/test/test_object_filtering.cpp @@ -205,7 +205,7 @@ TEST(TestObjectFiltering, isUnavoidable) TEST(TestObjectFiltering, filterPredictedObjects) { using autoware::motion_velocity_planner::dynamic_obstacle_stop::filter_predicted_objects; - std::vector objects; + std::vector> objects; autoware::motion_velocity_planner::dynamic_obstacle_stop::EgoData ego_data; autoware::motion_velocity_planner::dynamic_obstacle_stop::PlannerParam params; double hysteresis{}; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.cpp index 9be7f52bca99a..1e63713a61a4d 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.cpp @@ -29,7 +29,7 @@ namespace autoware::motion_velocity_planner::obstacle_velocity_limiter { multi_polygon_t createPolygonMasks( - const std::vector & dynamic_obstacles, const double buffer, + const std::vector> & dynamic_obstacles, const double buffer, const double min_vel) { return createObjectPolygons(dynamic_obstacles, buffer, min_vel); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.hpp index ad746fb2a7b7e..d7a944514cd26 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.hpp @@ -56,7 +56,7 @@ void calculateSteeringAngles(TrajectoryPoints & trajectory, const double wheel_b /// @param[in] min_vel minimum velocity for an object to be masked /// @return polygon masks around dynamic objects multi_polygon_t createPolygonMasks( - const std::vector & dynamic_obstacles, const double buffer, + const std::vector> & dynamic_obstacles, const double buffer, const double min_vel); /// @brief create footprint polygons from projection lines diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp index eb89c027a3b48..baa98ea1f79b8 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp @@ -135,7 +135,9 @@ void ObstacleVelocityLimiterModule::update_parameters( } VelocityPlanningResult ObstacleVelocityLimiterModule::plan( - const std::vector & ego_trajectory_points, + [[maybe_unused]] const std::vector & + raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data) { autoware::universe_utils::StopWatch stopwatch; @@ -143,14 +145,14 @@ VelocityPlanningResult ObstacleVelocityLimiterModule::plan( VelocityPlanningResult result; stopwatch.tic("preprocessing"); const auto ego_idx = autoware::motion_utils::findNearestIndex( - ego_trajectory_points, planner_data->current_odometry.pose.pose); + smoothed_trajectory_points, planner_data->current_odometry.pose.pose); if (!ego_idx) { RCLCPP_WARN_THROTTLE( logger_, *clock_, rcutils_duration_value_t(1000), "Cannot calculate ego index on the trajectory"); return result; } - auto original_traj_points = ego_trajectory_points; + auto original_traj_points = smoothed_trajectory_points; if (preprocessing_params_.calculate_steering_angles) obstacle_velocity_limiter::calculateSteeringAngles( original_traj_points, projection_params_.wheel_base); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.hpp index 54f9c5c12e59e..f89a8d43e9e93 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.hpp @@ -49,7 +49,8 @@ class ObstacleVelocityLimiterModule : public PluginModuleInterface void init(rclcpp::Node & node, const std::string & module_name) override; void update_parameters(const std::vector & parameters) override; VelocityPlanningResult plan( - const std::vector & ego_trajectory_points, + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data) override; std::string get_module_name() const override { return module_name_; } diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.cpp index 187f028dc5969..be38ac92f92ec 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.cpp @@ -59,11 +59,12 @@ polygon_t createObjectPolygon( } multi_polygon_t createObjectPolygons( - const std::vector & objects, const double buffer, const double min_velocity) + const std::vector> & objects, const double buffer, + const double min_velocity) { multi_polygon_t polygons; for (const auto & object : objects) { - const auto & predicted_object = object.predicted_object; + const auto & predicted_object = object->predicted_object; const double obj_vel_norm = std::hypot( predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x, predicted_object.kinematics.initial_twist_with_covariance.twist.linear.y); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.hpp index aff99140744e4..ddcb1161b6f59 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.hpp @@ -164,7 +164,8 @@ polygon_t createObjectPolygon( /// @param [in] min_velocity objects with velocity lower will be ignored /// @return polygons of the objects multi_polygon_t createObjectPolygons( - const std::vector & objects, const double buffer, const double min_velocity); + const std::vector> & objects, const double buffer, + const double min_velocity); /// @brief add obstacles obtained from sensors to the given Obstacles object /// @param[out] obstacles Obstacles object in which to add the sensor obstacles diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/test/test_collision_distance.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/test/test_collision_distance.cpp index 926b730dcc3dd..a538c7f6610a0 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/test/test_collision_distance.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/test/test_collision_distance.cpp @@ -394,7 +394,7 @@ TEST(TestCollisionDistance, createObjPolygons) using autoware_perception_msgs::msg::PredictedObject; using autoware_perception_msgs::msg::PredictedObjects; - std::vector objects; + std::vector> objects; auto polygons = createObjectPolygons(objects, 0.0, 0.0); EXPECT_TRUE(polygons.empty()); @@ -407,7 +407,7 @@ TEST(TestCollisionDistance, createObjPolygons) object1.kinematics.initial_twist_with_covariance.twist.linear.x = 0.0; object1.shape.dimensions.x = 1.0; object1.shape.dimensions.y = 1.0; - objects.push_back(PlannerData::Object(object1)); + objects.push_back(std::make_shared(object1)); polygons = createObjectPolygons(objects, 0.0, 1.0); EXPECT_TRUE(polygons.empty()); @@ -434,7 +434,7 @@ TEST(TestCollisionDistance, createObjPolygons) object2.kinematics.initial_twist_with_covariance.twist.linear.x = 2.0; object2.shape.dimensions.x = 2.0; object2.shape.dimensions.y = 1.0; - objects.push_back(PlannerData::Object(object2)); + objects.push_back(std::make_shared(object2)); polygons = createObjectPolygons(objects, 0.0, 2.0); ASSERT_EQ(polygons.size(), 1ul); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp index a6c8368c20571..baf481a56bbff 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp @@ -108,7 +108,7 @@ autoware_perception_msgs::msg::PredictedObjects filter_predicted_objects( autoware_perception_msgs::msg::PredictedObjects filtered_objects; filtered_objects.header = planner_data.predicted_objects_header; for (const auto & object : planner_data.objects) { - const auto & predicted_object = object.predicted_object; + const auto & predicted_object = object->predicted_object; const auto is_pedestrian = std::find_if( predicted_object.classification.begin(), predicted_object.classification.end(), diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp index 814af37aaa800..c215eacfa5c7e 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp @@ -148,22 +148,23 @@ void OutOfLaneModule::update_parameters(const std::vector & p void OutOfLaneModule::limit_trajectory_size( out_of_lane::EgoData & ego_data, - const std::vector & ego_trajectory_points, + const std::vector & smoothed_trajectory_points, const double max_arc_length) { ego_data.first_trajectory_idx = - motion_utils::findNearestSegmentIndex(ego_trajectory_points, ego_data.pose.position); + motion_utils::findNearestSegmentIndex(smoothed_trajectory_points, ego_data.pose.position); ego_data.longitudinal_offset_to_first_trajectory_index = motion_utils::calcLongitudinalOffsetToSegment( - ego_trajectory_points, ego_data.first_trajectory_idx, ego_data.pose.position); + smoothed_trajectory_points, ego_data.first_trajectory_idx, ego_data.pose.position); auto l = -ego_data.longitudinal_offset_to_first_trajectory_index; - ego_data.trajectory_points.push_back(ego_trajectory_points[ego_data.first_trajectory_idx]); - for (auto i = ego_data.first_trajectory_idx + 1; i < ego_trajectory_points.size(); ++i) { - l += universe_utils::calcDistance2d(ego_trajectory_points[i - 1], ego_trajectory_points[i]); + ego_data.trajectory_points.push_back(smoothed_trajectory_points[ego_data.first_trajectory_idx]); + for (auto i = ego_data.first_trajectory_idx + 1; i < smoothed_trajectory_points.size(); ++i) { + l += universe_utils::calcDistance2d( + smoothed_trajectory_points[i - 1], smoothed_trajectory_points[i]); if (l >= max_arc_length) { break; } - ego_data.trajectory_points.push_back(ego_trajectory_points[i]); + ego_data.trajectory_points.push_back(smoothed_trajectory_points[i]); } } @@ -213,7 +214,9 @@ out_of_lane::OutOfLaneData prepare_out_of_lane_data(const out_of_lane::EgoData & } VelocityPlanningResult OutOfLaneModule::plan( - const std::vector & ego_trajectory_points, + [[maybe_unused]] const std::vector & + raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data) { VelocityPlanningResult result; @@ -223,7 +226,7 @@ VelocityPlanningResult OutOfLaneModule::plan( stopwatch.tic("preprocessing"); out_of_lane::EgoData ego_data; ego_data.pose = planner_data->current_odometry.pose.pose; - limit_trajectory_size(ego_data, ego_trajectory_points, params_.max_arc_length); + limit_trajectory_size(ego_data, smoothed_trajectory_points, params_.max_arc_length); out_of_lane::calculate_min_stop_and_slowdown_distances( ego_data, *planner_data, previous_slowdown_pose_); prepare_stop_lines_rtree(ego_data, *planner_data, params_.max_arc_length); @@ -314,7 +317,7 @@ VelocityPlanningResult OutOfLaneModule::plan( } planning_factor_interface_->add( - ego_trajectory_points, ego_data.pose, *slowdown_pose, PlanningFactor::SLOW_DOWN, + smoothed_trajectory_points, ego_data.pose, *slowdown_pose, PlanningFactor::SLOW_DOWN, SafetyFactorArray{}); virtual_wall_marker_creator.add_virtual_walls( out_of_lane::debug::create_virtual_walls(*slowdown_pose, slowdown_velocity == 0.0, params_)); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.hpp index b6eb03f5f0469..1e011022ff99e 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.hpp @@ -41,7 +41,8 @@ class OutOfLaneModule : public PluginModuleInterface void publish_planning_factor() override { planning_factor_interface_->publish(); }; void update_parameters(const std::vector & parameters) override; VelocityPlanningResult plan( - const std::vector & ego_trajectory_points, + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data) override; std::string get_module_name() const override { return module_name_; } @@ -51,7 +52,7 @@ class OutOfLaneModule : public PluginModuleInterface /// given length static void limit_trajectory_size( out_of_lane::EgoData & ego_data, - const std::vector & ego_trajectory_points, + const std::vector & smoothed_trajectory_points, const double max_arc_length); out_of_lane::PlannerParam params_{}; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/planner_data.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/planner_data.hpp index 4d4917f23496c..54af835171d14 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/planner_data.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/planner_data.hpp @@ -16,6 +16,7 @@ #define AUTOWARE__MOTION_VELOCITY_PLANNER_COMMON_UNIVERSE__PLANNER_DATA_HPP_ #include +#include #include #include #include @@ -26,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -43,11 +45,22 @@ namespace autoware::motion_velocity_planner { +using autoware_planning_msgs::msg::TrajectoryPoint; + struct TrafficSignalStamped { builtin_interfaces::msg::Time stamp; autoware_perception_msgs::msg::TrafficLightGroup signal; }; + +struct TrajectoryPolygonCollisionCheck +{ + double decimate_trajectory_step_length; + double goal_extended_trajectory_length; + bool enable_to_consider_current_pose; + double time_to_convergence; +}; + struct PlannerData { explicit PlannerData(rclcpp::Node & node) @@ -65,28 +78,27 @@ struct PlannerData } autoware_perception_msgs::msg::PredictedObject predicted_object; - // double get_lon_vel_relative_to_traj() - // { - // if (!lon_vel_relative_to_traj) { - // lon_vel_relative_to_traj = 0.0; - // } - // return *lon_vel_relative_to_traj; - // } - // double get_lat_vel_relative_to_traj() - // { - // if (!lat_vel_relative_to_traj) { - // lat_vel_relative_to_traj = 0.0; - // } - // return *lat_vel_relative_to_traj; - // } + + double get_dist_to_traj_poly( + const std::vector & decimated_traj_polys) const; + double get_dist_to_traj_lateral(const std::vector & traj_points) const; + double get_dist_from_ego_longitudinal( + const std::vector & traj_points, + const geometry_msgs::msg::Point & ego_pos) const; + double get_lon_vel_relative_to_traj(const std::vector & traj_points) const; + double get_lat_vel_relative_to_traj(const std::vector & traj_points) const; + geometry_msgs::msg::Pose get_predicted_pose( + const rclcpp::Time & current_stamp, const rclcpp::Time & predicted_object_stamp) const; private: - // TODO(murooka) implement the following variables and their functions. - // std::optional dist_to_traj_poly{std::nullopt}; - // std::optional dist_to_traj_lateral{std::nullopt}; - // std::optional dist_from_ego_longitudinal{std::nullopt}; - // std::optional lon_vel_relative_to_traj{std::nullopt}; - // std::optional lat_vel_relative_to_traj{std::nullopt}; + void calc_vel_relative_to_traj(const std::vector & traj_points) const; + + mutable std::optional dist_to_traj_poly{std::nullopt}; + mutable std::optional dist_to_traj_lateral{std::nullopt}; + mutable std::optional dist_from_ego_longitudinal{std::nullopt}; + mutable std::optional lon_vel_relative_to_traj{std::nullopt}; + mutable std::optional lat_vel_relative_to_traj{std::nullopt}; + mutable std::optional predicted_pose; }; struct Pointcloud @@ -105,21 +117,13 @@ struct PlannerData }; void process_predicted_objects( - const autoware_perception_msgs::msg::PredictedObjects & predicted_objects) - { - predicted_objects_header = predicted_objects.header; - - objects.clear(); - for (const auto & predicted_object : predicted_objects.objects) { - objects.push_back(Object(predicted_object)); - } - } + const autoware_perception_msgs::msg::PredictedObjects & predicted_objects); // msgs from callbacks that are used for data-ready nav_msgs::msg::Odometry current_odometry; geometry_msgs::msg::AccelWithCovarianceStamped current_acceleration; std_msgs::msg::Header predicted_objects_header; - std::vector objects; + std::vector> objects; Pointcloud no_ground_pointcloud; nav_msgs::msg::OccupancyGrid occupancy_grid; std::shared_ptr route_handler; @@ -128,6 +132,8 @@ struct PlannerData double ego_nearest_dist_threshold{}; double ego_nearest_yaw_threshold{}; + TrajectoryPolygonCollisionCheck trajectory_polygon_collision_check{}; + // other internal data // traffic_light_id_map_raw is the raw observation, while traffic_light_id_map_keep_last keeps the // last observed infomation for UNKNOWN @@ -139,6 +145,8 @@ struct PlannerData // parameters autoware::vehicle_info_utils::VehicleInfo vehicle_info_; + bool is_driving_forward{true}; + /** *@fn *@brief queries the traffic signal information of given Id. if keep_last_observation = true, @@ -163,6 +171,20 @@ struct PlannerData current_acceleration.accel.accel.linear.x, velocity_smoother_->getMinDecel(), std::abs(velocity_smoother_->getMinJerk()), velocity_smoother_->getMinJerk()); } + + size_t find_index( + const std::vector & traj_points, const geometry_msgs::msg::Pose & pose) const + { + return autoware::motion_utils::findFirstNearestIndexWithSoftConstraints( + traj_points, pose, ego_nearest_dist_threshold, ego_nearest_yaw_threshold); + } + + size_t find_segment_index( + const std::vector & traj_points, const geometry_msgs::msg::Pose & pose) const + { + return autoware::motion_utils::findFirstNearestSegmentIndexWithSoftConstraints( + traj_points, pose, ego_nearest_dist_threshold, ego_nearest_yaw_threshold); + } }; } // namespace autoware::motion_velocity_planner diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/plugin_module_interface.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/plugin_module_interface.hpp index a01b39646e6e2..d8c32f93d7c15 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/plugin_module_interface.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/plugin_module_interface.hpp @@ -42,7 +42,8 @@ class PluginModuleInterface virtual void init(rclcpp::Node & node, const std::string & module_name) = 0; virtual void update_parameters(const std::vector & parameters) = 0; virtual VelocityPlanningResult plan( - const std::vector & ego_trajectory_points, + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data) = 0; virtual std::string get_module_name() const = 0; virtual void publish_planning_factor() {} diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/polygon_utils.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/polygon_utils.hpp new file mode 100644 index 0000000000000..8f7b0920a4372 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/polygon_utils.hpp @@ -0,0 +1,82 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef AUTOWARE__MOTION_VELOCITY_PLANNER_COMMON_UNIVERSE__POLYGON_UTILS_HPP_ +#define AUTOWARE__MOTION_VELOCITY_PLANNER_COMMON_UNIVERSE__POLYGON_UTILS_HPP_ + +#include "autoware/universe_utils/geometry/boost_geometry.hpp" +#include "autoware_vehicle_info_utils/vehicle_info_utils.hpp" + +#include + +#include "autoware_perception_msgs/msg/predicted_path.hpp" +#include "autoware_perception_msgs/msg/shape.hpp" +#include "autoware_planning_msgs/msg/trajectory.hpp" + +#include + +#include +#include + +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +namespace polygon_utils +{ +namespace bg = boost::geometry; +using autoware::universe_utils::Point2d; +using autoware::universe_utils::Polygon2d; + +using autoware_perception_msgs::msg::PredictedPath; +using autoware_perception_msgs::msg::Shape; +using autoware_planning_msgs::msg::Trajectory; +using autoware_planning_msgs::msg::TrajectoryPoint; +namespace bg = boost::geometry; +using autoware::vehicle_info_utils::VehicleInfo; + +struct PointWithStamp +{ + rclcpp::Time stamp; + geometry_msgs::msg::Point point; +}; + +std::optional> get_collision_point( + const std::vector & traj_points, const std::vector & traj_polygons, + const geometry_msgs::msg::Pose obj_pose, const rclcpp::Time obj_stamp, const Shape & obj_shape, + const double dist_to_bumper); + +std::optional> get_collision_point( + const std::vector & traj_points, const size_t collision_idx, + const std::vector & collision_points, const double dist_to_bumper); + +std::vector get_collision_points( + const std::vector & traj_points, const std::vector & traj_polygons, + const rclcpp::Time & obstacle_stamp, const PredictedPath & predicted_path, const Shape & shape, + const rclcpp::Time & current_time, const bool is_driving_forward, + std::vector & collision_index, const double max_dist = std::numeric_limits::max(), + const double max_prediction_time_for_collision_check = std::numeric_limits::max()); + +std::vector create_one_step_polygons( + const std::vector & traj_points, const VehicleInfo & vehicle_info, + const geometry_msgs::msg::Pose & current_ego_pose, const double lat_margin, + const bool enable_to_consider_current_pose, const double time_to_convergence, + const double decimate_trajectory_step_length); +} // namespace polygon_utils +} // namespace autoware::motion_velocity_planner + +#endif // AUTOWARE__MOTION_VELOCITY_PLANNER_COMMON_UNIVERSE__POLYGON_UTILS_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/utils.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/utils.hpp new file mode 100644 index 0000000000000..9f3baf6d0710a --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/utils.hpp @@ -0,0 +1,134 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef AUTOWARE__MOTION_VELOCITY_PLANNER_COMMON_UNIVERSE__UTILS_HPP_ +#define AUTOWARE__MOTION_VELOCITY_PLANNER_COMMON_UNIVERSE__UTILS_HPP_ + +#include "autoware/universe_utils/geometry/geometry.hpp" +#include "autoware_vehicle_info_utils/vehicle_info_utils.hpp" +#include "planner_data.hpp" + +#include + +#include "autoware_planning_msgs/msg/trajectory.hpp" +#include "nav_msgs/msg/odometry.hpp" +#include "visualization_msgs/msg/marker_array.hpp" + +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner::utils +{ +using autoware::universe_utils::Polygon2d; +using autoware::vehicle_info_utils::VehicleInfo; +using autoware_perception_msgs::msg::ObjectClassification; +using autoware_perception_msgs::msg::Shape; +using autoware_planning_msgs::msg::Trajectory; +using autoware_planning_msgs::msg::TrajectoryPoint; +using nav_msgs::msg::Odometry; +using visualization_msgs::msg::Marker; +using visualization_msgs::msg::MarkerArray; + +std::vector decimate_trajectory_points_from_ego( + const std::vector & traj_points, const geometry_msgs::msg::Pose & current_pose, + const double ego_nearest_dist_threshold, const double ego_nearest_yaw_threshold, + const double decimate_trajectory_step_length, const double goal_extended_trajectory_length); + +template +std::optional get_obstacle_from_uuid( + const std::vector & obstacles, const std::string & target_uuid) +{ + const auto itr = std::find_if(obstacles.begin(), obstacles.end(), [&](const auto & obstacle) { + return obstacle.uuid == target_uuid; + }); + + if (itr == obstacles.end()) { + return std::nullopt; + } + return *itr; +} + +std::vector get_target_object_type(rclcpp::Node & node, const std::string & param_prefix); + +double calc_object_possible_max_dist_from_center(const Shape & shape); + +Marker get_object_marker( + const geometry_msgs::msg::Pose & obj_pose, size_t idx, const std::string & ns, const double r, + const double g, const double b); + +template +size_t get_index_with_longitudinal_offset( + const T & points, const double longitudinal_offset, std::optional start_idx) +{ + if (points.empty()) { + throw std::logic_error("points is empty."); + } + + if (start_idx) { + if (/*start_idx.get() < 0 || */ points.size() <= *start_idx) { + throw std::out_of_range("start_idx is out of range."); + } + } else { + if (longitudinal_offset > 0) { + start_idx = 0; + } else { + start_idx = points.size() - 1; + } + } + + double sum_length = 0.0; + if (longitudinal_offset > 0) { + for (size_t i = *start_idx; i < points.size() - 1; ++i) { + const double segment_length = + autoware::universe_utils::calcDistance2d(points.at(i), points.at(i + 1)); + sum_length += segment_length; + if (sum_length >= longitudinal_offset) { + const double back_length = sum_length - longitudinal_offset; + const double front_length = segment_length - back_length; + if (front_length < back_length) { + return i; + } else { + return i + 1; + } + } + } + return points.size() - 1; + } + + for (size_t i = *start_idx; 0 < i; --i) { + const double segment_length = + autoware::universe_utils::calcDistance2d(points.at(i - 1), points.at(i)); + sum_length += segment_length; + if (sum_length >= -longitudinal_offset) { + const double back_length = sum_length + longitudinal_offset; + const double front_length = segment_length - back_length; + if (front_length < back_length) { + return i; + } else { + return i - 1; + } + } + } + return 0; +} + +double calc_possible_min_dist_from_obj_to_traj_poly( + const std::shared_ptr object, + const std::vector & traj_points, const VehicleInfo & vehicle_info); +} // namespace autoware::motion_velocity_planner::utils + +#endif // AUTOWARE__MOTION_VELOCITY_PLANNER_COMMON_UNIVERSE__UTILS_HPP_ diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/velocity_planning_result.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/velocity_planning_result.hpp index d3dfa7a270a16..4faeb698e2bcd 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/velocity_planning_result.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/include/autoware/motion_velocity_planner_common_universe/velocity_planning_result.hpp @@ -18,6 +18,8 @@ #include #include +#include +#include #include #include @@ -42,6 +44,9 @@ struct VelocityPlanningResult { std::vector stop_points{}; std::vector slowdown_intervals{}; + std::optional velocity_limit{std::nullopt}; + std::optional velocity_limit_clear_command{ + std::nullopt}; }; } // namespace autoware::motion_velocity_planner diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/package.xml b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/package.xml index 91d569dc3f8cc..8c33cfc862271 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/package.xml +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/package.xml @@ -19,6 +19,7 @@ autoware_behavior_velocity_planner_common autoware_internal_debug_msgs autoware_motion_utils + autoware_object_recognition_utils autoware_perception_msgs autoware_planning_msgs autoware_route_handler diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/planner_data.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/planner_data.cpp new file mode 100644 index 0000000000000..a83c9d51aab96 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/planner_data.cpp @@ -0,0 +1,189 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "autoware/motion_velocity_planner_common_universe/planner_data.hpp" + +#include "autoware/motion_velocity_planner_common_universe/polygon_utils.hpp" +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" +#include "autoware/object_recognition_utils/predicted_path_utils.hpp" +#include "autoware/universe_utils/geometry/boost_polygon_utils.hpp" + +#include "autoware_perception_msgs/msg/predicted_path.hpp" + +#include + +#include +#include +#include + +namespace autoware::motion_velocity_planner +{ +using autoware_perception_msgs::msg::PredictedPath; +namespace bg = boost::geometry; + +namespace +{ +std::optional get_predicted_object_pose_from_predicted_path( + const PredictedPath & predicted_path, const rclcpp::Time & obj_stamp, + const rclcpp::Time & current_stamp) +{ + const double rel_time = (current_stamp - obj_stamp).seconds(); + if (rel_time < 0.0) { + return std::nullopt; + } + + const auto pose = + autoware::object_recognition_utils::calcInterpolatedPose(predicted_path, rel_time); + if (!pose) { + return std::nullopt; + } + return pose.get(); +} + +std::optional get_predicted_object_pose_from_predicted_paths( + const std::vector & predicted_paths, const rclcpp::Time & obj_stamp, + const rclcpp::Time & current_stamp) +{ + if (predicted_paths.empty()) { + return std::nullopt; + } + + // Get the most reliable path + const auto predicted_path = std::max_element( + predicted_paths.begin(), predicted_paths.end(), + [](const PredictedPath & a, const PredictedPath & b) { return a.confidence < b.confidence; }); + + return get_predicted_object_pose_from_predicted_path(*predicted_path, obj_stamp, current_stamp); +} +} // namespace + +double PlannerData::Object::get_dist_to_traj_poly( + const std::vector & decimated_traj_polys) const +{ + if (!dist_to_traj_poly) { + const auto & obj_pose = predicted_object.kinematics.initial_pose_with_covariance.pose; + const auto obj_poly = autoware::universe_utils::toPolygon2d(obj_pose, predicted_object.shape); + dist_to_traj_poly = std::numeric_limits::max(); + for (const auto & traj_poly : decimated_traj_polys) { + const double current_dist_to_traj_poly = bg::distance(traj_poly, obj_poly); + dist_to_traj_poly = std::min(*dist_to_traj_poly, current_dist_to_traj_poly); + } + } + return *dist_to_traj_poly; +} + +double PlannerData::Object::get_dist_to_traj_lateral( + const std::vector & traj_points) const +{ + if (!dist_to_traj_lateral) { + const auto & obj_pos = predicted_object.kinematics.initial_pose_with_covariance.pose.position; + dist_to_traj_lateral = autoware::motion_utils::calcLateralOffset(traj_points, obj_pos); + } + return *dist_to_traj_lateral; +} + +double PlannerData::Object::get_dist_from_ego_longitudinal( + const std::vector & traj_points, const geometry_msgs::msg::Point & ego_pos) const +{ + if (!dist_from_ego_longitudinal) { + const auto & obj_pos = predicted_object.kinematics.initial_pose_with_covariance.pose.position; + dist_from_ego_longitudinal = + autoware::motion_utils::calcSignedArcLength(traj_points, ego_pos, obj_pos); + } + return *dist_from_ego_longitudinal; +} + +double PlannerData::Object::get_lon_vel_relative_to_traj( + const std::vector & traj_points) const +{ + if (!lon_vel_relative_to_traj) { + calc_vel_relative_to_traj(traj_points); + } + return *lon_vel_relative_to_traj; +} + +double PlannerData::Object::get_lat_vel_relative_to_traj( + const std::vector & traj_points) const +{ + if (!lat_vel_relative_to_traj) { + calc_vel_relative_to_traj(traj_points); + } + return *lat_vel_relative_to_traj; +} + +void PlannerData::Object::calc_vel_relative_to_traj( + const std::vector & traj_points) const +{ + const auto & obj_pose = predicted_object.kinematics.initial_pose_with_covariance.pose; + const auto & obj_twist = predicted_object.kinematics.initial_twist_with_covariance.twist; + + const size_t object_idx = + autoware::motion_utils::findNearestIndex(traj_points, obj_pose.position); + const auto & nearest_traj_point = traj_points.at(object_idx); + + const double traj_yaw = tf2::getYaw(nearest_traj_point.pose.orientation); + const double obj_yaw = tf2::getYaw(obj_pose.orientation); + const Eigen::Rotation2Dd R_ego_to_obstacle( + autoware::universe_utils::normalizeRadian(obj_yaw - traj_yaw)); + + // Calculate the trajectory direction and the vector from the trajectory to the obstacle + const Eigen::Vector2d traj_direction(std::cos(traj_yaw), std::sin(traj_yaw)); + const Eigen::Vector2d traj_to_obstacle( + obj_pose.position.x - nearest_traj_point.pose.position.x, + obj_pose.position.y - nearest_traj_point.pose.position.y); + + // Determine if the obstacle is to the left or right of the trajectory using the cross product + const double cross_product = + traj_direction.x() * traj_to_obstacle.y() - traj_direction.y() * traj_to_obstacle.x(); + const int sign = (cross_product > 0) ? -1 : 1; + + const Eigen::Vector2d obstacle_velocity(obj_twist.linear.x, obj_twist.linear.y); + const Eigen::Vector2d projected_velocity = R_ego_to_obstacle * obstacle_velocity; + + lon_vel_relative_to_traj = projected_velocity[0]; + lat_vel_relative_to_traj = sign * projected_velocity[1]; +} + +geometry_msgs::msg::Pose PlannerData::Object::get_predicted_pose( + const rclcpp::Time & current_stamp, const rclcpp::Time & predicted_objects_stamp) const +{ + if (!predicted_pose) { + const auto obj_stamp = predicted_objects_stamp; + const auto predicted_pose_opt = get_predicted_object_pose_from_predicted_paths( + predicted_object.kinematics.predicted_paths, obj_stamp, current_stamp); + + if (predicted_pose_opt) { + predicted_pose = *predicted_pose_opt; + } else { + predicted_pose = predicted_object.kinematics.initial_pose_with_covariance.pose; + RCLCPP_WARN( + rclcpp::get_logger("motion_velocity_planner_common"), + "Failed to calculate the predicted object pose."); + } + } + + return *predicted_pose; +} + +void PlannerData::process_predicted_objects( + const autoware_perception_msgs::msg::PredictedObjects & predicted_objects) +{ + predicted_objects_header = predicted_objects.header; + + objects.clear(); + for (const auto & predicted_object : predicted_objects.objects) { + objects.push_back(std::make_shared(predicted_object)); + } +} +} // namespace autoware::motion_velocity_planner diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/polygon_utils.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/polygon_utils.cpp new file mode 100644 index 0000000000000..21deaec2c0c02 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/polygon_utils.cpp @@ -0,0 +1,276 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "autoware/motion_velocity_planner_common_universe/polygon_utils.hpp" + +#include "autoware/motion_utils/trajectory/trajectory.hpp" +#include "autoware/universe_utils/geometry/boost_polygon_utils.hpp" +#include "autoware/universe_utils/geometry/geometry.hpp" + +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner::polygon_utils +{ +namespace +{ +PointWithStamp calc_nearest_collision_point( + const size_t first_within_idx, const std::vector & collision_points, + const std::vector & decimated_traj_points, const bool is_driving_forward) +{ + const size_t prev_idx = first_within_idx == 0 ? first_within_idx : first_within_idx - 1; + const size_t next_idx = first_within_idx == 0 ? first_within_idx + 1 : first_within_idx; + + std::vector segment_points{ + decimated_traj_points.at(prev_idx).pose, decimated_traj_points.at(next_idx).pose}; + if (!is_driving_forward) { + std::reverse(segment_points.begin(), segment_points.end()); + } + + std::vector dist_vec; + for (const auto & collision_point : collision_points) { + const double dist = autoware::motion_utils::calcLongitudinalOffsetToSegment( + segment_points, 0, collision_point.point); + dist_vec.push_back(dist); + } + + const size_t min_idx = std::min_element(dist_vec.begin(), dist_vec.end()) - dist_vec.begin(); + return collision_points.at(min_idx); +} + +// NOTE: max_dist is used for efficient calculation to suppress boost::geometry's polygon +// calculation. +std::optional>> get_collision_index( + const std::vector & traj_points, const std::vector & traj_polygons, + const geometry_msgs::msg::Pose & object_pose, const rclcpp::Time & object_time, + const Shape & object_shape, const double max_dist = std::numeric_limits::max()) +{ + const auto obj_polygon = autoware::universe_utils::toPolygon2d(object_pose, object_shape); + for (size_t i = 0; i < traj_polygons.size(); ++i) { + const double approximated_dist = + autoware::universe_utils::calcDistance2d(traj_points.at(i).pose, object_pose); + if (approximated_dist > max_dist) { + continue; + } + + std::vector collision_polygons; + boost::geometry::intersection(traj_polygons.at(i), obj_polygon, collision_polygons); + + std::vector collision_geom_points; + bool has_collision = false; + for (const auto & collision_polygon : collision_polygons) { + if (boost::geometry::area(collision_polygon) > 0.0) { + has_collision = true; + + for (const auto & collision_point : collision_polygon.outer()) { + PointWithStamp collision_geom_point; + collision_geom_point.stamp = object_time; + collision_geom_point.point.x = collision_point.x(); + collision_geom_point.point.y = collision_point.y(); + collision_geom_point.point.z = traj_points.at(i).pose.position.z; + collision_geom_points.push_back(collision_geom_point); + } + } + } + + if (has_collision) { + const auto collision_info = + std::pair>{i, collision_geom_points}; + return collision_info; + } + } + + return std::nullopt; +} +} // namespace + +std::optional> get_collision_point( + const std::vector & traj_points, const std::vector & traj_polygons, + const geometry_msgs::msg::Pose obj_pose, const rclcpp::Time obj_stamp, const Shape & obj_shape, + const double dist_to_bumper) +{ + const auto collision_info = + get_collision_index(traj_points, traj_polygons, obj_pose, obj_stamp, obj_shape); + if (!collision_info) { + return std::nullopt; + } + + const auto bumper_pose = autoware::universe_utils::calcOffsetPose( + traj_points.at(collision_info->first).pose, dist_to_bumper, 0.0, 0.0); + + std::optional max_collision_length = std::nullopt; + std::optional max_collision_point = std::nullopt; + for (const auto & poly_vertex : collision_info->second) { + const double dist_from_bumper = + std::abs(autoware::universe_utils::inverseTransformPoint(poly_vertex.point, bumper_pose).x); + + if (!max_collision_length.has_value() || dist_from_bumper > *max_collision_length) { + max_collision_length = dist_from_bumper; + max_collision_point = poly_vertex.point; + } + } + return std::make_pair( + *max_collision_point, + autoware::motion_utils::calcSignedArcLength(traj_points, 0, collision_info->first) - + *max_collision_length); +} + +std::optional> get_collision_point( + const std::vector & traj_points, const size_t collision_idx, + const std::vector & collision_points, const double dist_to_bumper) +{ + std::pair> collision_info; + collision_info.first = collision_idx; + collision_info.second = collision_points; + + const auto bumper_pose = autoware::universe_utils::calcOffsetPose( + traj_points.at(collision_info.first).pose, dist_to_bumper, 0.0, 0.0); + + std::optional max_collision_length = std::nullopt; + std::optional max_collision_point = std::nullopt; + for (const auto & poly_vertex : collision_info.second) { + const double dist_from_bumper = + std::abs(autoware::universe_utils::inverseTransformPoint(poly_vertex.point, bumper_pose).x); + + if (!max_collision_length.has_value() || dist_from_bumper > *max_collision_length) { + max_collision_length = dist_from_bumper; + max_collision_point = poly_vertex.point; + } + } + return std::make_pair( + *max_collision_point, + autoware::motion_utils::calcSignedArcLength(traj_points, 0, collision_info.first) - + *max_collision_length); +} + +// NOTE: max_lat_dist is used for efficient calculation to suppress boost::geometry's polygon +// calculation. +std::vector get_collision_points( + const std::vector & traj_points, const std::vector & traj_polygons, + const rclcpp::Time & obstacle_stamp, const PredictedPath & predicted_path, const Shape & shape, + const rclcpp::Time & current_time, const bool is_driving_forward, + std::vector & collision_index, const double max_lat_dist, + const double max_prediction_time_for_collision_check) +{ + std::vector collision_points; + for (size_t i = 0; i < predicted_path.path.size(); ++i) { + if ( + max_prediction_time_for_collision_check < + rclcpp::Duration(predicted_path.time_step).seconds() * static_cast(i)) { + break; + } + + const auto object_time = + rclcpp::Time(obstacle_stamp) + rclcpp::Duration(predicted_path.time_step) * i; + // Ignore past position + if ((object_time - current_time).seconds() < 0.0) { + continue; + } + + const auto collision_info = get_collision_index( + traj_points, traj_polygons, predicted_path.path.at(i), object_time, shape, max_lat_dist); + if (collision_info) { + const auto nearest_collision_point = calc_nearest_collision_point( + collision_info->first, collision_info->second, traj_points, is_driving_forward); + collision_points.push_back(nearest_collision_point); + collision_index.push_back(collision_info->first); + } + } + + return collision_points; +} + +std::vector create_one_step_polygons( + const std::vector & traj_points, const VehicleInfo & vehicle_info, + const geometry_msgs::msg::Pose & current_ego_pose, const double lat_margin, + const bool enable_to_consider_current_pose, const double time_to_convergence, + const double decimate_trajectory_step_length) +{ + const double front_length = vehicle_info.max_longitudinal_offset_m; + const double rear_length = vehicle_info.rear_overhang_m; + const double vehicle_width = vehicle_info.vehicle_width_m; + + const size_t nearest_idx = + autoware::motion_utils::findNearestSegmentIndex(traj_points, current_ego_pose.position); + const auto nearest_pose = traj_points.at(nearest_idx).pose; + const auto current_ego_pose_error = + autoware::universe_utils::inverseTransformPose(current_ego_pose, nearest_pose); + const double current_ego_lat_error = current_ego_pose_error.position.y; + const double current_ego_yaw_error = tf2::getYaw(current_ego_pose_error.orientation); + double time_elapsed{0.0}; + + std::vector output_polygons; + Polygon2d tmp_polys{}; + for (size_t i = 0; i < traj_points.size(); ++i) { + std::vector current_poses = {traj_points.at(i).pose}; + + // estimate the future ego pose with assuming that the pose error against the reference path + // will decrease to zero by the time_to_convergence + if (enable_to_consider_current_pose && time_elapsed < time_to_convergence) { + const double rem_ratio = (time_to_convergence - time_elapsed) / time_to_convergence; + geometry_msgs::msg::Pose indexed_pose_err; + indexed_pose_err.set__orientation( + autoware::universe_utils::createQuaternionFromYaw(current_ego_yaw_error * rem_ratio)); + indexed_pose_err.set__position( + autoware::universe_utils::createPoint(0.0, current_ego_lat_error * rem_ratio, 0.0)); + current_poses.push_back( + autoware::universe_utils::transformPose(indexed_pose_err, traj_points.at(i).pose)); + if (traj_points.at(i).longitudinal_velocity_mps != 0.0) { + time_elapsed += + decimate_trajectory_step_length / std::abs(traj_points.at(i).longitudinal_velocity_mps); + } else { + time_elapsed = std::numeric_limits::max(); + } + } + + Polygon2d idx_poly{}; + for (const auto & pose : current_poses) { + if (i == 0 && traj_points.at(i).longitudinal_velocity_mps > 1e-3) { + boost::geometry::append( + idx_poly, + autoware::universe_utils::toFootprint(pose, front_length, rear_length, vehicle_width) + .outer()); + boost::geometry::append( + idx_poly, autoware::universe_utils::fromMsg( + autoware::universe_utils::calcOffsetPose( + pose, front_length, vehicle_width * 0.5 + lat_margin, 0.0) + .position) + .to_2d()); + boost::geometry::append( + idx_poly, autoware::universe_utils::fromMsg( + autoware::universe_utils::calcOffsetPose( + pose, front_length, -vehicle_width * 0.5 - lat_margin, 0.0) + .position) + .to_2d()); + } else { + boost::geometry::append( + idx_poly, autoware::universe_utils::toFootprint( + pose, front_length, rear_length, vehicle_width + lat_margin * 2.0) + .outer()); + } + } + + boost::geometry::append(tmp_polys, idx_poly.outer()); + Polygon2d hull_polygon; + boost::geometry::convex_hull(tmp_polys, hull_polygon); + boost::geometry::correct(hull_polygon); + + output_polygons.push_back(hull_polygon); + tmp_polys = std::move(idx_poly); + } + return output_polygons; +} +} // namespace autoware::motion_velocity_planner::polygon_utils diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/utils.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/utils.cpp new file mode 100644 index 0000000000000..de86f64fa7965 --- /dev/null +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common_universe/src/utils.cpp @@ -0,0 +1,176 @@ +// Copyright 2025 TIER IV, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "autoware/motion_velocity_planner_common_universe/utils.hpp" + +#include "autoware/motion_utils/resample/resample.hpp" +#include "autoware/motion_utils/trajectory/conversion.hpp" +#include "autoware/motion_utils/trajectory/trajectory.hpp" +#include "autoware/motion_velocity_planner_common_universe/planner_data.hpp" +#include "autoware/universe_utils/ros/marker_helper.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +namespace autoware::motion_velocity_planner::utils +{ +namespace +{ +TrajectoryPoint extend_trajectory_point( + const double extend_distance, const TrajectoryPoint & goal_point, const bool is_driving_forward) +{ + TrajectoryPoint extended_trajectory_point; + extended_trajectory_point.pose = autoware::universe_utils::calcOffsetPose( + goal_point.pose, extend_distance * (is_driving_forward ? 1.0 : -1.0), 0.0, 0.0); + extended_trajectory_point.longitudinal_velocity_mps = goal_point.longitudinal_velocity_mps; + extended_trajectory_point.lateral_velocity_mps = goal_point.lateral_velocity_mps; + extended_trajectory_point.acceleration_mps2 = goal_point.acceleration_mps2; + return extended_trajectory_point; +} + +std::vector get_extended_trajectory_points( + const std::vector & input_points, const double extend_distance, + const double step_length) +{ + auto output_points = input_points; + const auto is_driving_forward_opt = + autoware::motion_utils::isDrivingForwardWithTwist(input_points); + const bool is_driving_forward = is_driving_forward_opt ? *is_driving_forward_opt : true; + + if (extend_distance < std::numeric_limits::epsilon()) { + return output_points; + } + + const auto goal_point = input_points.back(); + + double extend_sum = 0.0; + while (extend_sum <= (extend_distance - step_length)) { + const auto extended_trajectory_point = + extend_trajectory_point(extend_sum, goal_point, is_driving_forward); + output_points.push_back(extended_trajectory_point); + extend_sum += step_length; + } + const auto extended_trajectory_point = + extend_trajectory_point(extend_distance, goal_point, is_driving_forward); + output_points.push_back(extended_trajectory_point); + + return output_points; +} + +std::vector resample_trajectory_points( + const std::vector & traj_points, const double interval) +{ + const auto traj = autoware::motion_utils::convertToTrajectory(traj_points); + const auto resampled_traj = autoware::motion_utils::resampleTrajectory(traj, interval); + return autoware::motion_utils::convertToTrajectoryPointArray(resampled_traj); +} + +} // namespace + +std::vector decimate_trajectory_points_from_ego( + const std::vector & traj_points, const geometry_msgs::msg::Pose & current_pose, + const double ego_nearest_dist_threshold, const double ego_nearest_yaw_threshold, + const double decimate_trajectory_step_length, const double goal_extended_trajectory_length) +{ + // trim trajectory points from ego pose + const size_t traj_ego_seg_idx = + autoware::motion_utils::findFirstNearestSegmentIndexWithSoftConstraints( + traj_points, current_pose, ego_nearest_dist_threshold, ego_nearest_yaw_threshold); + const auto traj_points_from_ego = + std::vector(traj_points.begin() + traj_ego_seg_idx, traj_points.end()); + + // decimate trajectory + const auto decimated_traj_points_from_ego = + resample_trajectory_points(traj_points_from_ego, decimate_trajectory_step_length); + + // extend trajectory + const auto extended_traj_points_from_ego = get_extended_trajectory_points( + decimated_traj_points_from_ego, goal_extended_trajectory_length, + decimate_trajectory_step_length); + if (extended_traj_points_from_ego.size() < 2) { + return traj_points; + } + return extended_traj_points_from_ego; +} + +std::vector get_target_object_type(rclcpp::Node & node, const std::string & param_prefix) +{ + std::unordered_map types_map{ + {"unknown", ObjectClassification::UNKNOWN}, {"car", ObjectClassification::CAR}, + {"truck", ObjectClassification::TRUCK}, {"bus", ObjectClassification::BUS}, + {"trailer", ObjectClassification::TRAILER}, {"motorcycle", ObjectClassification::MOTORCYCLE}, + {"bicycle", ObjectClassification::BICYCLE}, {"pedestrian", ObjectClassification::PEDESTRIAN}}; + + std::vector types; + for (const auto & type : types_map) { + if (node.declare_parameter(param_prefix + type.first)) { + types.push_back(type.second); + } + } + return types; +} + +double calc_object_possible_max_dist_from_center(const Shape & shape) +{ + if (shape.type == Shape::BOUNDING_BOX) { + return std::hypot(shape.dimensions.x / 2.0, shape.dimensions.y / 2.0); + } else if (shape.type == Shape::CYLINDER) { + return shape.dimensions.x / 2.0; + } else if (shape.type == Shape::POLYGON) { + double max_length_to_point = 0.0; + for (const auto rel_point : shape.footprint.points) { + const double length_to_point = std::hypot(rel_point.x, rel_point.y); + if (max_length_to_point < length_to_point) { + max_length_to_point = length_to_point; + } + } + return max_length_to_point; + } + + throw std::logic_error("The shape type is not supported in motion_velocity_planner_common."); +} +visualization_msgs::msg::Marker get_object_marker( + const geometry_msgs::msg::Pose & obj_pose, size_t idx, const std::string & ns, const double r, + const double g, const double b) +{ + const auto current_time = rclcpp::Clock().now(); + + auto marker = autoware::universe_utils::createDefaultMarker( + "map", current_time, ns, idx, visualization_msgs::msg::Marker::SPHERE, + autoware::universe_utils::createMarkerScale(2.0, 2.0, 2.0), + autoware::universe_utils::createMarkerColor(r, g, b, 0.8)); + + marker.pose = obj_pose; + + return marker; +} + +double calc_possible_min_dist_from_obj_to_traj_poly( + const std::shared_ptr object, + const std::vector & traj_points, const VehicleInfo & vehicle_info) +{ + const double object_possible_max_dist = + calc_object_possible_max_dist_from_center(object->predicted_object.shape); + const double possible_min_dist_to_traj_poly = + std::abs(object->get_dist_to_traj_lateral(traj_points)) - vehicle_info.vehicle_width_m - + object_possible_max_dist; + return possible_min_dist_to_traj_poly; +} +} // namespace autoware::motion_velocity_planner::utils diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/config/motion_velocity_planner.param.yaml b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/config/motion_velocity_planner.param.yaml index 5b2fea537d4f7..4d5409cef23c2 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/config/motion_velocity_planner.param.yaml +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/config/motion_velocity_planner.param.yaml @@ -1,3 +1,14 @@ /**: ros__parameters: smooth_velocity_before_planning: true # [-] if true, smooth the velocity profile of the input trajectory before planning + + trajectory_polygon_collision_check: + decimate_trajectory_step_length : 2.0 # longitudinal step length to calculate trajectory polygon for collision checking + goal_extended_trajectory_length: 6.0 + + # consider the current ego pose (it is not the nearest pose on the reference trajectory) + # Both the lateral error and the yaw error are assumed to decrease to zero by the time duration "time_to_convergence" + # The both errors decrease with constant rates against the time. + consider_current_pose: + enable_to_consider_current_pose: true + time_to_convergence: 1.5 #[s] diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/schema/motion_velocity_planner.schema.json b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/schema/motion_velocity_planner.schema.json index 7db22e5e39d17..9b5fcf0c91eb1 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/schema/motion_velocity_planner.schema.json +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/schema/motion_velocity_planner.schema.json @@ -10,6 +10,38 @@ "type": "boolean", "default": true, "description": "if true, smooth the velocity profile of the input trajectory before planning" + }, + "trajectory_polygon_collision_check": { + "type": "object", + "properties": { + "decimate_trajectory_step_length": { + "type": "number", + "default": 2.0, + "description": "trajectory's step length to decimate for the polygon-based collision check" + }, + "goal_extended_trajectory_length": { + "type": "number", + "default": 6.0, + "description": "trajectory's extended length on the goal for the polygon-based collision check" + }, + "consider_current_pose": { + "type": "object", + "properties": { + "enable_to_consider_current_pose": { + "type": "boolean", + "default": true, + "description": "whether to consider the current pose to create the trajectory polygon for the polygon-based collision check" + }, + "time_to_convergence": { + "type": "number", + "default": 1.5, + "description": "time for the ego to converge to the trajectory for the polygon-based collision check" + } + }, + "required": ["enable_to_consider_current_pose", "time_to_convergence"] + } + }, + "required": ["decimate_trajectory_step_length", "goal_extended_trajectory_length"] } }, "required": ["smooth_velocity_before_planning"], diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/node.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/node.cpp index 8f5aa761573b7..32c7877b1dccd 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/node.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/node.cpp @@ -82,6 +82,10 @@ MotionVelocityPlannerNode::MotionVelocityPlannerNode(const rclcpp::NodeOptions & // Publishers trajectory_pub_ = this->create_publisher("~/output/trajectory", 1); + velocity_limit_pub_ = this->create_publisher( + "~/output/velocity_limit", rclcpp::QoS{1}.transient_local()); + clear_velocity_limit_pub_ = this->create_publisher( + "~/output/clear_velocity_limit", rclcpp::QoS{1}.transient_local()); processing_time_publisher_ = this->create_publisher( "~/debug/processing_time_ms", 1); @@ -95,6 +99,17 @@ MotionVelocityPlannerNode::MotionVelocityPlannerNode(const rclcpp::NodeOptions & planner_data_.ego_nearest_dist_threshold = declare_parameter("ego_nearest_dist_threshold"); planner_data_.ego_nearest_yaw_threshold = declare_parameter("ego_nearest_yaw_threshold"); + + planner_data_.trajectory_polygon_collision_check.decimate_trajectory_step_length = + declare_parameter("trajectory_polygon_collision_check.decimate_trajectory_step_length"); + planner_data_.trajectory_polygon_collision_check.goal_extended_trajectory_length = + declare_parameter("trajectory_polygon_collision_check.goal_extended_trajectory_length"); + planner_data_.trajectory_polygon_collision_check.enable_to_consider_current_pose = + declare_parameter( + "trajectory_polygon_collision_check.consider_current_pose.enable_to_consider_current_pose"); + planner_data_.trajectory_polygon_collision_check.time_to_convergence = declare_parameter( + "trajectory_polygon_collision_check.consider_current_pose.time_to_convergence"); + // set velocity smoother param set_velocity_smoother_params(); @@ -131,7 +146,8 @@ void MotionVelocityPlannerNode::on_unload_plugin( // NOTE: argument planner_data must not be referenced for multithreading bool MotionVelocityPlannerNode::update_planner_data( - std::map & processing_times) + std::map & processing_times, + const std::vector & input_traj_points) { auto clock = *get_clock(); auto is_ready = true; @@ -181,6 +197,14 @@ bool MotionVelocityPlannerNode::update_planner_data( planner_data_.velocity_smoother_, "Waiting for the initialization of the velocity smoother"); processing_times["update_planner_data.smoother"] = sw.toc(true); + // is driving forward + const auto is_driving_forward = + autoware::motion_utils::isDrivingForwardWithTwist(input_traj_points); + if (is_driving_forward) { + planner_data_.is_driving_forward = is_driving_forward.value(); + } + processing_times["update_planner_data.is_driving_forward"] = sw.toc(true); + // optional data const auto traffic_signals_ptr = sub_traffic_signals_.takeData(); if (traffic_signals_ptr) process_traffic_signals(traffic_signals_ptr); @@ -269,7 +293,7 @@ void MotionVelocityPlannerNode::on_trajectory( std::map processing_times; stop_watch.tic("Total"); - if (!update_planner_data(processing_times)) { + if (!update_planner_data(processing_times, input_trajectory_msg->points)) { return; } processing_times["update_planner_data"] = stop_watch.toc(true); @@ -383,40 +407,46 @@ autoware::motion_velocity_planner::TrajectoryPoints MotionVelocityPlannerNode::s } autoware_planning_msgs::msg::Trajectory MotionVelocityPlannerNode::generate_trajectory( - autoware::motion_velocity_planner::TrajectoryPoints input_trajectory_points, + const autoware::motion_velocity_planner::TrajectoryPoints & input_trajectory_points, std::map & processing_times) { universe_utils::StopWatch stop_watch; autoware_planning_msgs::msg::Trajectory output_trajectory_msg; output_trajectory_msg.points = {input_trajectory_points.begin(), input_trajectory_points.end()}; - if (smooth_velocity_before_planning_) { - stop_watch.tic("smooth"); - input_trajectory_points = smooth_trajectory(input_trajectory_points, planner_data_); - processing_times["velocity_smoothing"] = stop_watch.toc("smooth"); - } + + stop_watch.tic("smooth"); + const auto smoothed_trajectory_points = [&]() { + if (smooth_velocity_before_planning_) { + return smooth_trajectory(input_trajectory_points, planner_data_); + } + return input_trajectory_points; + }(); + processing_times["velocity_smoothing"] = stop_watch.toc("smooth"); + stop_watch.tic("resample"); - TrajectoryPoints resampled_trajectory; + TrajectoryPoints resampled_smoothed_trajectory_points; // skip points that are too close together to make computation easier - if (!input_trajectory_points.empty()) { - resampled_trajectory.push_back(input_trajectory_points.front()); + if (!smoothed_trajectory_points.empty()) { + resampled_smoothed_trajectory_points.push_back(smoothed_trajectory_points.front()); constexpr auto min_interval_squared = 0.5 * 0.5; // TODO(Maxime): change to a parameter - for (auto i = 1UL; i < input_trajectory_points.size(); ++i) { - const auto & p = input_trajectory_points[i]; + for (auto i = 1UL; i < smoothed_trajectory_points.size(); ++i) { + const auto & p = smoothed_trajectory_points[i]; const auto dist_to_prev_point = - universe_utils::calcSquaredDistance2d(resampled_trajectory.back(), p); + universe_utils::calcSquaredDistance2d(resampled_smoothed_trajectory_points.back(), p); if (dist_to_prev_point > min_interval_squared) { - resampled_trajectory.push_back(p); + resampled_smoothed_trajectory_points.push_back(p); } } } processing_times["resample"] = stop_watch.toc("resample"); stop_watch.tic("calculate_time_from_start"); motion_utils::calculate_time_from_start( - resampled_trajectory, planner_data_.current_odometry.pose.pose.position); + resampled_smoothed_trajectory_points, planner_data_.current_odometry.pose.pose.position); processing_times["calculate_time_from_start"] = stop_watch.toc("calculate_time_from_start"); stop_watch.tic("plan_velocities"); const auto planning_results = planner_manager_.plan_velocities( - resampled_trajectory, std::make_shared(planner_data_)); + input_trajectory_points, resampled_smoothed_trajectory_points, + std::make_shared(planner_data_)); processing_times["plan_velocities"] = stop_watch.toc("plan_velocities"); for (const auto & planning_result : planning_results) { @@ -424,6 +454,12 @@ autoware_planning_msgs::msg::Trajectory MotionVelocityPlannerNode::generate_traj insert_stop(output_trajectory_msg, stop_point); for (const auto & slowdown_interval : planning_result.slowdown_intervals) insert_slowdown(output_trajectory_msg, slowdown_interval); + if (planning_result.velocity_limit) { + velocity_limit_pub_->publish(*planning_result.velocity_limit); + } + if (planning_result.velocity_limit_clear_command) { + clear_velocity_limit_pub_->publish(*planning_result.velocity_limit_clear_command); + } } return output_trajectory_msg; @@ -442,6 +478,19 @@ rcl_interfaces::msg::SetParametersResult MotionVelocityPlannerNode::on_set_param updateParam(parameters, "smooth_velocity_before_planning", smooth_velocity_before_planning_); updateParam(parameters, "ego_nearest_dist_threshold", planner_data_.ego_nearest_dist_threshold); updateParam(parameters, "ego_nearest_yaw_threshold", planner_data_.ego_nearest_yaw_threshold); + updateParam( + parameters, "trajectory_polygon_collision_check.decimate_trajectory_step_length", + planner_data_.trajectory_polygon_collision_check.decimate_trajectory_step_length); + updateParam( + parameters, "trajectory_polygon_collision_check.goal_extended_trajectory_length", + planner_data_.trajectory_polygon_collision_check.goal_extended_trajectory_length); + updateParam( + parameters, + "trajectory_polygon_collision_check.consider_current_pose.enable_to_consider_current_pose", + planner_data_.trajectory_polygon_collision_check.enable_to_consider_current_pose); + updateParam( + parameters, "trajectory_polygon_collision_check.consider_current_pose.time_to_convergence", + planner_data_.trajectory_polygon_collision_check.time_to_convergence); // set_velocity_smoother_params(); TODO(Maxime): fix update parameters of the velocity smoother diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/node.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/node.hpp index 826c740d85b76..dee10e94ee64f 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/node.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/node.hpp @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include #include @@ -50,6 +52,8 @@ using autoware_map_msgs::msg::LaneletMapBin; using autoware_motion_velocity_planner_node_universe::srv::LoadPlugin; using autoware_motion_velocity_planner_node_universe::srv::UnloadPlugin; using autoware_planning_msgs::msg::Trajectory; +using tier4_planning_msgs::msg::VelocityLimit; +using tier4_planning_msgs::msg::VelocityLimitClearCommand; using TrajectoryPoints = std::vector; class MotionVelocityPlannerNode : public rclcpp::Node @@ -92,6 +96,8 @@ class MotionVelocityPlannerNode : public rclcpp::Node // publishers rclcpp::Publisher::SharedPtr trajectory_pub_; + rclcpp::Publisher::SharedPtr velocity_limit_pub_; + rclcpp::Publisher::SharedPtr clear_velocity_limit_pub_; rclcpp::Publisher::SharedPtr debug_viz_pub_; autoware::universe_utils::ProcessingTimePublisher processing_diag_publisher_{ this, "~/debug/processing_time_ms_diag"}; @@ -128,7 +134,9 @@ class MotionVelocityPlannerNode : public rclcpp::Node // function /// @brief update the PlannerData instance with the latest messages received /// @return false if some data is not available - bool update_planner_data(std::map & processing_times); + bool update_planner_data( + std::map & processing_times, + const std::vector & input_traj_points); void insert_stop( autoware_planning_msgs::msg::Trajectory & trajectory, const geometry_msgs::msg::Point & stop_point) const; @@ -139,7 +147,7 @@ class MotionVelocityPlannerNode : public rclcpp::Node const autoware::motion_velocity_planner::TrajectoryPoints & trajectory_points, const autoware::motion_velocity_planner::PlannerData & planner_data) const; autoware_planning_msgs::msg::Trajectory generate_trajectory( - autoware::motion_velocity_planner::TrajectoryPoints input_trajectory_points, + const autoware::motion_velocity_planner::TrajectoryPoints & input_trajectory_points, std::map & processing_times); std::unique_ptr logger_configure_; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/planner_manager.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/planner_manager.cpp index 6d889343641a9..d6b7e5760dccb 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/planner_manager.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/planner_manager.cpp @@ -94,12 +94,14 @@ std::shared_ptr MotionVelocityPlannerManager::get_metrics( } std::vector MotionVelocityPlannerManager::plan_velocities( - const std::vector & ego_trajectory_points, + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data) { std::vector results; for (auto & plugin : loaded_plugins_) { - VelocityPlanningResult res = plugin->plan(ego_trajectory_points, planner_data); + VelocityPlanningResult res = + plugin->plan(raw_trajectory_points, smoothed_trajectory_points, planner_data); results.push_back(res); plugin->publish_planning_factor(); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/planner_manager.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/planner_manager.hpp index 48f6a246c6456..3e1cb429992c6 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/planner_manager.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node_universe/src/planner_manager.hpp @@ -49,7 +49,8 @@ class MotionVelocityPlannerManager void unload_module_plugin(rclcpp::Node & node, const std::string & name); void update_module_parameters(const std::vector & parameters); std::vector plan_velocities( - const std::vector & ego_trajectory_points, + const std::vector & raw_trajectory_points, + const std::vector & smoothed_trajectory_points, const std::shared_ptr planner_data); // Metrics