Carma-platform v4.2.0
CARMA Platform is built on robot operating system (ROS) and utilizes open source software (OSS) that enables Cooperative Driving Automation (CDA) features to allow Automated Driving Systems to interact and cooperate with infrastructure and other vehicles through communication.
light_controlled_intersection_tactical_plugin_node.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022 LEIDOS.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License.
15 */
17
19{
20 namespace std_ph = std::placeholders;
21
23 : carma_guidance_plugins::TacticalPlugin(options)
24 {
25 // Create initial config
26 config_ = Config();
27
28 // Declare parameters
29 config_.centerline_sampling_spacing = declare_parameter<double>("centerline_sampling_spacing", config_.centerline_sampling_spacing);
30 config_.trajectory_time_length = declare_parameter<double>("trajectory_time_length", config_.trajectory_time_length);
31 config_.default_downsample_ratio = declare_parameter<int>("default_downsample_ratio", config_.default_downsample_ratio);
32 config_.turn_downsample_ratio = declare_parameter<int>("turn_downsample_ratio", config_.turn_downsample_ratio);
33 config_.curve_resample_step_size = declare_parameter<double>("curve_resample_step_size", config_.curve_resample_step_size);
34 config_.curvature_moving_average_window_size = declare_parameter<int>("curvature_moving_average_window_size", config_.curvature_moving_average_window_size);
35 config_.speed_moving_average_window_size = declare_parameter<int>("speed_moving_average_window_size", config_.speed_moving_average_window_size);
36 config_.back_distance = declare_parameter<double>("back_distance", config_.back_distance);
37 config_.buffer_ending_downtrack = declare_parameter<double>("buffer_ending_downtrack", config_.buffer_ending_downtrack);
38 config_.vehicle_decel_limit_multiplier = declare_parameter<double>("vehicle_decel_limit_multiplier", config_.vehicle_decel_limit_multiplier);
39 config_.vehicle_accel_limit_multiplier = declare_parameter<double>("vehicle_accel_limit_multiplier", config_.vehicle_accel_limit_multiplier);
40 config_.lat_accel_multiplier = declare_parameter<double>("lat_accel_multiplier", config_.lat_accel_multiplier);
41 config_.vehicle_response_lag = declare_parameter<double>("vehicle_response_lag", config_.vehicle_response_lag);
42 config_.stop_line_buffer = declare_parameter<double>("stop_line_buffer", config_.stop_line_buffer);
43 config_.minimum_speed = declare_parameter<double>("minimum_speed", config_.minimum_speed);
44 config_.dist_before_intersection_to_force_last_traj = declare_parameter<double>("dist_before_intersection_to_force_last_traj", config_.dist_before_intersection_to_force_last_traj);
45 config_.period_before_intersection_to_force_last_traj = declare_parameter<double>("period_before_intersection_to_force_last_traj", config_.period_before_intersection_to_force_last_traj);
46
47 config_.lateral_accel_limit = declare_parameter<double>("vehicle_lateral_accel_limit", config_.lateral_accel_limit);
48 config_.vehicle_accel_limit = declare_parameter<double>("vehicle_acceleration_limit", config_.vehicle_accel_limit);
49 config_.vehicle_decel_limit = declare_parameter<double>("vehicle_deceleration_limit", config_.vehicle_decel_limit);
50 config_.tactical_plugin_service_call_timeout = declare_parameter<int>("tactical_plugin_service_call_timeout", config_.tactical_plugin_service_call_timeout);
51 config_.enable_object_avoidance = declare_parameter<bool>("enable_object_avoidance", config_.enable_object_avoidance);
52
53 }
54
55 rcl_interfaces::msg::SetParametersResult LightControlledIntersectionTransitPluginNode::parameter_update_callback(const std::vector<rclcpp::Parameter> &parameters)
56 {
57 auto error = update_params<double>(
58 {{"centerline_sampling_spacing", config_.centerline_sampling_spacing},
59 {"trajectory_time_length", config_.trajectory_time_length},
60 {"curve_resample_step_size", config_.curve_resample_step_size},
61 {"back_distance", config_.back_distance},
62 {"buffer_ending_downtrack", config_.buffer_ending_downtrack},
63 {"vehicle_decel_limit_multiplier", config_.vehicle_decel_limit_multiplier},
64 {"vehicle_accel_limit_multiplier", config_.vehicle_accel_limit_multiplier},
65 {"vehicle_response_lag", config_.vehicle_response_lag},
66 {"lat_accel_multiplier", config_.lat_accel_multiplier},
67 {"stop_line_buffer", config_.stop_line_buffer},
68 {"minimum_speed", config_.minimum_speed},
69 {"dist_before_intersection_to_force_last_traj", config_.dist_before_intersection_to_force_last_traj},
70 {"period_before_intersection_to_force_last_traj", config_.period_before_intersection_to_force_last_traj}}, parameters); // Global acceleration limits not allowed to dynamically update
71 auto error_2 = update_params<int>(
72 {{"default_downsample_ratio", config_.default_downsample_ratio},
73 {"turn_downsample_ratio", config_.turn_downsample_ratio},
74 {"curvature_moving_average_window_size", config_.curvature_moving_average_window_size},
75 {"speed_moving_average_window_size", config_.speed_moving_average_window_size}}, parameters);
76
77 if (worker_)
78 {
79 worker_->setConfig(config_);
80 }
81
82 rcl_interfaces::msg::SetParametersResult result;
83
84 result.successful = !error && !error_2;
85
86 return result;
87 }
88
90 {
91 RCLCPP_INFO_STREAM(rclcpp::get_logger("light_controlled_intersection_tactical_plugin"), "LightControlledIntersectionTransitPluginNode trying to configure");
92 trajectory_debug_pub_ = create_publisher<carma_debug_ros2_msgs::msg::TrajectoryCurvatureSpeeds>("debug/trajectory_planning", 1);
93
94 // Reset config
95 config_ = Config();
96
97 // Load parameters
98 get_parameter<double>("centerline_sampling_spacing", config_.centerline_sampling_spacing);
99 get_parameter<double>("trajectory_time_length", config_.trajectory_time_length);
100 get_parameter<int>("default_downsample_ratio", config_.default_downsample_ratio);
101 get_parameter<int>("turn_downsample_ratio", config_.turn_downsample_ratio);
102 get_parameter<double>("curve_resample_step_size", config_.curve_resample_step_size);
103 get_parameter<int>("curvature_moving_average_window_size", config_.curvature_moving_average_window_size);
104 get_parameter<int>("speed_moving_average_window_size", config_.speed_moving_average_window_size);
105 get_parameter<double>("back_distance", config_.back_distance);
106 get_parameter<double>("buffer_ending_downtrack", config_.buffer_ending_downtrack);
107 get_parameter<double>("vehicle_decel_limit_multiplier", config_.vehicle_decel_limit_multiplier);
108 get_parameter<double>("vehicle_accel_limit_multiplier", config_.vehicle_accel_limit_multiplier);
109 get_parameter<double>("vehicle_response_lag", config_.vehicle_response_lag);
110 get_parameter<double>("lat_accel_multiplier", config_.lat_accel_multiplier);
111 get_parameter<double>("stop_line_buffer", config_.stop_line_buffer);
112 get_parameter<double>("minimum_speed", config_.minimum_speed);
113 get_parameter<double>("dist_before_intersection_to_force_last_traj", config_.dist_before_intersection_to_force_last_traj);
114 get_parameter<double>("period_before_intersection_to_force_last_traj", config_.period_before_intersection_to_force_last_traj);
115 get_parameter<double>("vehicle_lateral_accel_limit", config_.lateral_accel_limit);
116 get_parameter<double>("vehicle_acceleration_limit", config_.vehicle_accel_limit);
117 get_parameter<double>("vehicle_deceleration_limit", config_.vehicle_decel_limit);
118 get_parameter<int>("tactical_plugin_service_call_timeout", config_.tactical_plugin_service_call_timeout);
119 get_parameter<bool>("enable_object_avoidance", config_.enable_object_avoidance);
120
121 // Use the configured multipliers to update the accel limits
125
126 // Register runtime parameter update callback
127 add_on_set_parameters_callback(std::bind(&LightControlledIntersectionTransitPluginNode::parameter_update_callback, this, std_ph::_1));
128
129 RCLCPP_INFO_STREAM(rclcpp::get_logger("light_controlled_intersection_tactical_plugin"), "Loaded params: " << config_);
130
131 // Initialize worker object
132 worker_ = std::make_shared<LightControlledIntersectionTacticalPlugin>(
134 config_,
135 [this](const carma_debug_ros2_msgs::msg::TrajectoryCurvatureSpeeds& msg)
136 { trajectory_debug_pub_->publish(msg); },
138 shared_from_this());
139
140 yield_client_ = create_client<carma_planning_msgs::srv::PlanTrajectory>("yield_plugin/plan_trajectory");
141 worker_->set_yield_client(yield_client_);
142 RCLCPP_INFO(rclcpp::get_logger("light_controlled_intersection_tactical_plugin"), "Yield Client Set");
143
144 // Return success if everything initialized successfully
145 return CallbackReturn::SUCCESS;
146 }
147
149 return true;
150 }
151
153 return "v4.0"; // Version ID matches the value set in this package's package.xml
154 }
155
157 std::shared_ptr<rmw_request_id_t>,
158 carma_planning_msgs::srv::PlanTrajectory::Request::SharedPtr req,
159 carma_planning_msgs::srv::PlanTrajectory::Response::SharedPtr resp)
160 {
161 worker_->planTrajectoryCB(req, resp);
162 }
163
164} // light_controlled_intersection_tactical_plugin
165
166#include "rclcpp_components/register_node_macro.hpp"
167
168// Register the component with class_loader
std::string get_plugin_name() const
Return the name of this plugin.
virtual carma_wm::WorldModelConstPtr get_world_model() final
Method to return the default world model provided as a convience by this base class If this method or...
LightControlledIntersectionTransitPluginNode(const rclcpp::NodeOptions &)
LightControlledIntersectionTransitPluginNode constructor.
rcl_interfaces::msg::SetParametersResult parameter_update_callback(const std::vector< rclcpp::Parameter > &parameters)
Callback for dynamic parameter updates.
bool get_availability() override
Get the availability status of this plugin based on the current operating environment....
void plan_trajectory_callback(std::shared_ptr< rmw_request_id_t >, carma_planning_msgs::srv::PlanTrajectory::Request::SharedPtr req, carma_planning_msgs::srv::PlanTrajectory::Response::SharedPtr resp) override
Extending class provided callback which should return a planned trajectory based on the provided traj...
carma_ros2_utils::PubPtr< carma_debug_ros2_msgs::msg::TrajectoryCurvatureSpeeds > trajectory_debug_pub_
carma_ros2_utils::CallbackReturn on_configure_plugin() override
This method should be used to load parameters and will be called on the configure state transition.
Stuct containing the algorithm configuration values for light_controlled_intersection_tactical_plugin...