Carma-platform v4.11.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.
platooning_control.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024 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 */
18
19namespace platooning_control
20{
21 namespace std_ph = std::placeholders;
22
23 PlatooningControlPlugin::PlatooningControlPlugin(const rclcpp::NodeOptions &options)
24 : carma_guidance_plugins::ControlPlugin(options), config_(PlatooningControlPluginConfig()), pcw_(PlatooningControlWorker())
25 {
26 basic_autonomy::set_logger(get_logger().get_child("basic_autonomy"));
27
28 // Declare parameters
29 config_.stand_still_headway_m = declare_parameter<double>("stand_still_headway_m", config_.stand_still_headway_m);
30 config_.max_accel_mps2 = declare_parameter<double>("max_accel_mps2", config_.max_accel_mps2);
31 config_.kp = declare_parameter<double>("kp", config_.kp);
32 config_.kd = declare_parameter<double>("kd", config_.kd);
33 config_.ki = declare_parameter<double>("ki", config_.ki);
34 config_.max_delta_speed_per_timestep = declare_parameter<double>("max_delta_speed_per_timestep", config_.max_delta_speed_per_timestep);
35 config_.min_delta_speed_per_timestep = declare_parameter<double>("min_delta_speed_per_timestep", config_.min_delta_speed_per_timestep);
36 config_.adjustment_cap_mps = declare_parameter<double>("adjustment_cap_mps", config_.adjustment_cap_mps);
37 config_.cmd_timestamp_ms = declare_parameter<int>("cmd_timestamp_ms", config_.cmd_timestamp_ms);
38 config_.integrator_max = declare_parameter<double>("integrator_max", config_.integrator_max);
39 config_.integrator_min = declare_parameter<double>("integrator_min", config_.integrator_min);
40
41 config_.vehicle_response_lag = declare_parameter<double>("vehicle_response_lag", config_.vehicle_response_lag);
42 config_.max_lookahead_dist = declare_parameter<double>("maximum_lookahead_distance", config_.max_lookahead_dist);
43 config_.min_lookahead_dist = declare_parameter<double>("minimum_lookahead_distance", config_.min_lookahead_dist);
44 config_.speed_to_lookahead_ratio = declare_parameter<double>("speed_to_lookahead_ratio", config_.speed_to_lookahead_ratio);
45 config_.is_interpolate_lookahead_point = declare_parameter<bool>("is_interpolate_lookahead_point", config_.is_interpolate_lookahead_point);
46 config_.is_delay_compensation = declare_parameter<bool>("is_delay_compensation", config_.is_delay_compensation);
47 config_.emergency_stop_distance = declare_parameter<double>("emergency_stop_distance", config_.emergency_stop_distance);
48 config_.speed_thres_traveling_direction = declare_parameter<double>("speed_thres_traveling_direction", config_.speed_thres_traveling_direction);
49 config_.dist_front_rear_wheels = declare_parameter<double>("dist_front_rear_wheels", config_.dist_front_rear_wheels);
50
51 config_.dt = declare_parameter<double>("dt", config_.dt);
52 config_.integrator_max_pp = declare_parameter<double>("integrator_max_pp", config_.integrator_max_pp);
53 config_.integrator_min_pp = declare_parameter<double>("integrator_min_pp", config_.integrator_min_pp);
54 config_.ki_pp = declare_parameter<double>("Ki_pp", config_.ki_pp);
55 config_.is_integrator_enabled = declare_parameter<bool>("is_integrator_enabled", config_.is_integrator_enabled);
56 config_.enable_max_adjustment_filter = declare_parameter<bool>("enable_max_adjustment_filter", config_.enable_max_adjustment_filter);
57 config_.enable_max_accel_filter = declare_parameter<bool>("enable_max_accel_filter", config_.enable_max_accel_filter);
58
59 //Global params (from vehicle config)
60 config_.vehicle_id = declare_parameter<std::string>("vehicle_id", config_.vehicle_id);
61 config_.shutdown_timeout = declare_parameter<int>("control_plugin_shutdown_timeout", config_.shutdown_timeout);
62 config_.ignore_initial_inputs = declare_parameter<int>("control_plugin_ignore_initial_inputs", config_.ignore_initial_inputs);
63
64 pcw_.ctrl_config_ = std::make_shared<PlatooningControlPluginConfig>(config_);
65
66 }
67
68 rcl_interfaces::msg::SetParametersResult PlatooningControlPlugin::parameter_update_callback(const std::vector<rclcpp::Parameter> &parameters)
69 {
70 auto error_double = update_params<double>({
71 {"stand_still_headway_m", config_.stand_still_headway_m},
72 {"max_accel_mps2", config_.max_accel_mps2},
73 {"kp", config_.kp},
74 {"kd", config_.kd},
75 {"ki", config_.ki},
76 {"max_delta_speed_per_timestep", config_.max_delta_speed_per_timestep},
77 {"min_delta_speed_per_timestep", config_.min_delta_speed_per_timestep},
78 {"adjustment_cap_mps", config_.adjustment_cap_mps},
79 {"integrator_max", config_.integrator_max},
80 {"integrator_min", config_.integrator_min},
81
82 {"vehicle_response_lag", config_.vehicle_response_lag},
83 {"max_lookahead_dist", config_.max_lookahead_dist},
84 {"min_lookahead_dist", config_.min_lookahead_dist},
85 {"speed_to_lookahead_ratio", config_.speed_to_lookahead_ratio},
86 {"emergency_stop_distance",config_.emergency_stop_distance},
87 {"speed_thres_traveling_direction", config_.speed_thres_traveling_direction},
88 {"dist_front_rear_wheels", config_.dist_front_rear_wheels},
89 {"dt", config_.dt},
90 {"integrator_max_pp", config_.integrator_max_pp},
91 {"integrator_min_pp", config_.integrator_min_pp},
92 {"Ki_pp", config_.ki_pp},
93 }, parameters);
94
95 auto error_int = update_params<int>({
96 {"cmd_timestamp_ms", config_.cmd_timestamp_ms},
97 }, parameters);
98
99 auto error_bool = update_params<bool>({
100 {"is_interpolate_lookahead_point", config_.is_interpolate_lookahead_point},
101 {"is_delay_compensation",config_.is_delay_compensation},
102 {"is_integrator_enabled", config_.is_integrator_enabled},
103 {"enable_max_adjustment_filter", config_.enable_max_adjustment_filter},
104 {"enable_max_accel_filter", config_.enable_max_accel_filter},
105 }, parameters);
106
107 // vehicle_id, control_plugin_shutdown_timeout and control_plugin_ignore_initial_inputs are not updated as they are global params
108 rcl_interfaces::msg::SetParametersResult result;
109
110 result.successful = !error_double && !error_int && !error_bool;
111
112 return result;
113
114 }
115
116 carma_ros2_utils::CallbackReturn PlatooningControlPlugin::on_configure_plugin()
117 {
118 // Reset config
120
121 // Load parameters
122 get_parameter<double>("stand_still_headway_m", config_.stand_still_headway_m);
123 get_parameter<double>("max_accel_mps2", config_.max_accel_mps2);
124 get_parameter<double>("kp", config_.kp);
125 get_parameter<double>("kd", config_.kd);
126 get_parameter<double>("ki", config_.ki);
127 get_parameter<double>("max_delta_speed_per_timestep", config_.max_delta_speed_per_timestep);
128 get_parameter<double>("min_delta_speed_per_timestep", config_.min_delta_speed_per_timestep);
129 get_parameter<double>("adjustment_cap_mps", config_.adjustment_cap_mps);
130 get_parameter<int>("cmd_timestamp_ms", config_.cmd_timestamp_ms);
131 get_parameter<double>("integrator_max", config_.integrator_max);
132 get_parameter<double>("integrator_min", config_.integrator_min);
133
134 get_parameter<std::string>("vehicle_id", config_.vehicle_id);
135 get_parameter<int>("control_plugin_shutdown_timeout", config_.shutdown_timeout);
136 get_parameter<int>("control_plugin_ignore_initial_inputs", config_.ignore_initial_inputs);
137 get_parameter<bool>("enable_max_adjustment_filter", config_.enable_max_adjustment_filter);
138 get_parameter<bool>("enable_max_accel_filter", config_.enable_max_accel_filter);
139
140 //Pure Pursuit params
141 get_parameter<double>("vehicle_response_lag", config_.vehicle_response_lag);
142 get_parameter<double>("maximum_lookahead_distance", config_.max_lookahead_dist);
143 get_parameter<double>("minimum_lookahead_distance", config_.min_lookahead_dist);
144 get_parameter<double>("speed_to_lookahead_ratio", config_.speed_to_lookahead_ratio);
145 get_parameter<bool>("is_interpolate_lookahead_point", config_.is_interpolate_lookahead_point);
146 get_parameter<bool>("is_delay_compensation", config_.is_delay_compensation);
147 get_parameter<double>("emergency_stop_distance", config_.emergency_stop_distance);
148 get_parameter<double>("speed_thres_traveling_direction", config_.speed_thres_traveling_direction);
149 get_parameter<double>("dist_front_rear_wheels", config_.dist_front_rear_wheels);
150
151 get_parameter<double>("dt", config_.dt);
152 get_parameter<double>("integrator_max_pp", config_.integrator_max_pp);
153 get_parameter<double>("integrator_min_pp", config_.integrator_min_pp);
154 get_parameter<double>("Ki_pp", config_.ki_pp);
155 get_parameter<bool>("is_integrator_enabled", config_.is_integrator_enabled);
156
157
158 RCLCPP_INFO_STREAM(rclcpp::get_logger("platooning_control"), "Loaded Params: " << config_);
159
160 // create config for pure_pursuit worker
161 pure_pursuit::Config cfg{
170 };
171
172 pure_pursuit::IntegratorConfig i_cfg;
173 i_cfg.dt = config_.dt;
174 i_cfg.integrator_max_pp = config_.integrator_max_pp;
175 i_cfg.integrator_min_pp = config_.integrator_min_pp;
176 i_cfg.Ki_pp = config_.ki_pp;
177 i_cfg.integral = 0.0; // accumulator of integral starts from 0
178 i_cfg.is_integrator_enabled = config_.is_integrator_enabled;
179
180 pp_ = std::make_shared<pure_pursuit::PurePursuit>(cfg, i_cfg);
181
182 // Register runtime parameter update callback
183 add_on_set_parameters_callback(std::bind(&PlatooningControlPlugin::parameter_update_callback, this, std_ph::_1));
184
185
186 // Trajectory Plan Subscriber
187 trajectory_plan_sub_ = create_subscription<carma_planning_msgs::msg::TrajectoryPlan>("platooning_control/plan_trajectory", 1,
188 std::bind(&PlatooningControlPlugin::current_trajectory_callback, this, std_ph::_1));
189
190 // Platoon Info Subscriber
191 platoon_info_sub_ = create_subscription<carma_planning_msgs::msg::PlatooningInfo>("platoon_info", 1, std::bind(&PlatooningControlPlugin::platoon_info_cb, this, std_ph::_1));
192
193
194 //Control Publishers
195 platoon_info_pub_ = create_publisher<carma_planning_msgs::msg::PlatooningInfo>("platooning_info", 1);
196
197
198 // Return success if everthing initialized successfully
199 return CallbackReturn::SUCCESS;
200 }
201
202
203 autoware_msgs::msg::ControlCommandStamped PlatooningControlPlugin::generate_command()
204 {
205
206 autoware_msgs::msg::ControlCommandStamped ctrl_msg;
208 return ctrl_msg;
209
210 // If it has been a long time since input data has arrived then reset the input counter and return
211 // Note: this quiets the controller after its input stream stops, which is necessary to allow
212 // the replacement controller to publish on the same output topic after this one is done.
213 double current_time_ms = this->now().nanoseconds() / 1e6;
214 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "current_time_ms = " << current_time_ms << ", prev_input_time_ms_ = " << prev_input_time_ms_ << ", input counter = " << consecutive_input_counter_);
215
216 if(current_time_ms - prev_input_time_ms_ > config_.shutdown_timeout)
217 {
218 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "returning due to timeout.");
220 return ctrl_msg;
221 }
222
223 // If there have not been enough consecutive timely inputs then return (waiting for
224 // previous control plugin to time out and stop publishing, since it uses same output topic)
226 {
227 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "returning due to first data input");
228 return ctrl_msg;
229 }
230
231 carma_planning_msgs::msg::TrajectoryPlanPoint second_trajectory_point = current_trajectory_.get().trajectory_points[1];
232
234
235 ctrl_msg = generate_control_signals(second_trajectory_point, current_pose_.get(), current_twist_.get());
236
237 return ctrl_msg;
238
239 }
240
241 void PlatooningControlPlugin::platoon_info_cb(const carma_planning_msgs::msg::PlatooningInfo::SharedPtr msg)
242 {
243
244 platoon_leader_.staticId = msg->leader_id;
245 platoon_leader_.vehiclePosition = msg->leader_downtrack_distance;
246 platoon_leader_.commandSpeed = msg->leader_cmd_speed;
247 // TODO: index is 0 temp to test the leader state
248 platoon_leader_.NumberOfVehicleInFront = msg->host_platoon_position;
250
251 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "Platoon leader leader id: " << platoon_leader_.staticId);
252 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "Platoon leader leader pose: " << platoon_leader_.vehiclePosition);
253 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "Platoon leader leader cmd speed: " << platoon_leader_.commandSpeed);
254
255 carma_planning_msgs::msg::PlatooningInfo platooning_info_msg = *msg;
256
257 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "platooning_info_msg.actual_gap: " << platooning_info_msg.actual_gap);
258
259 if (platooning_info_msg.actual_gap > 5.0)
260 {
261 platooning_info_msg.actual_gap -= 5.0; // TODO: temporary: should be vehicle length
262 }
263
264 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "platooning_info_msg.actual_gap: " << platooning_info_msg.actual_gap);
265 // platooing_info_msg.desired_gap = pcw_.desired_gap_;
266 // platooing_info_msg.actual_gap = pcw_.actual_gap_;
267 pcw_.actual_gap_ = platooning_info_msg.actual_gap;
268 pcw_.desired_gap_ = platooning_info_msg.desired_gap;
269
270 platooning_info_msg.host_cmd_speed = pcw_.speedCmd_;
271 platoon_info_pub_->publish(platooning_info_msg);
272 }
273
274 autoware_msgs::msg::ControlCommandStamped PlatooningControlPlugin::generate_control_signals(const carma_planning_msgs::msg::TrajectoryPlanPoint& first_trajectory_point, const geometry_msgs::msg::PoseStamped& current_pose, const geometry_msgs::msg::TwistStamped& current_twist)
275 {
276 pcw_.set_current_speed(trajectory_speed_); //TODO why this and not the actual vehicle speed? Method name suggests different use than this.
277 // pcw_.set_current_speed(current_twist_.get());
279 pcw_.generate_speed(first_trajectory_point);
280
281 motion::control::controller_common::State state_tf = convert_state(current_pose, current_twist);
282 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "Forced from frame_id: " << state_tf.header.frame_id << ", into: " << current_trajectory_.get().header.frame_id);
283
284 current_trajectory_.get().header.frame_id = state_tf.header.frame_id;
285
287
288 pp_->set_trajectory(autoware_traj_plan);
289 const auto cmd{pp_->compute_command(state_tf)};
290
291 auto steer_cmd = cmd.front_wheel_angle_rad; //autoware sets the front wheel angle as the calculated steer. https://github.com/usdot-fhwa-stol/autoware.auto/blob/3450f94fa694f51b00de272d412722d65a2c2d3e/AutowareAuto/src/control/pure_pursuit/src/pure_pursuit.cpp#L88
292
293 autoware_msgs::msg::ControlCommandStamped ctrl_msg = compose_ctrl_cmd(pcw_.speedCmd_, steer_cmd);
294
295 return ctrl_msg;
296 }
297
298 motion::motion_common::State PlatooningControlPlugin::convert_state(const geometry_msgs::msg::PoseStamped& pose, const geometry_msgs::msg::TwistStamped& twist) const
299 {
300 motion::motion_common::State state;
301 state.header = pose.header;
302 state.state.x = pose.pose.position.x;
303 state.state.y = pose.pose.position.y;
304 state.state.z = pose.pose.position.z;
305 state.state.heading.real = pose.pose.orientation.w;
306 state.state.heading.imag = pose.pose.orientation.z;
307
308 state.state.longitudinal_velocity_mps = twist.twist.linear.x;
309 return state;
310 }
311
312 void PlatooningControlPlugin::current_trajectory_callback(const carma_planning_msgs::msg::TrajectoryPlan::UniquePtr tp)
313 {
314 if (tp->trajectory_points.size() < 2) {
315 RCLCPP_WARN_STREAM(rclcpp::get_logger("platooning_control"), "PlatooningControlPlugin cannot execute trajectory as only 1 point was provided");
316 return;
317 }
318
320 prev_input_time_ms_ = this->now().nanoseconds() / 1000000;
322 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "New trajectory plan #" << consecutive_input_counter_ << " at time " << prev_input_time_ms_);
323 rclcpp::Time tp_time(tp->header.stamp);
324 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "tp header time = " << tp_time.nanoseconds() / 1000000);
325 }
326
327 geometry_msgs::msg::TwistStamped PlatooningControlPlugin::compose_twist_cmd(double linear_vel, double angular_vel)
328 {
329 geometry_msgs::msg::TwistStamped cmd_twist;
330 cmd_twist.twist.linear.x = linear_vel;
331 cmd_twist.twist.angular.z = angular_vel;
332 cmd_twist.header.stamp = this->now();
333 return cmd_twist;
334 }
335
336 autoware_msgs::msg::ControlCommandStamped PlatooningControlPlugin::compose_ctrl_cmd(double linear_vel, double steering_angle)
337 {
338 autoware_msgs::msg::ControlCommandStamped cmd_ctrl;
339 cmd_ctrl.header.stamp = this->now();
340 cmd_ctrl.cmd.linear_velocity = linear_vel;
341 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "ctrl command speed " << cmd_ctrl.cmd.linear_velocity);
342 cmd_ctrl.cmd.steering_angle = steering_angle;
343 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "ctrl command steering " << cmd_ctrl.cmd.steering_angle);
344
345 return cmd_ctrl;
346 }
347
349 return true; // TODO for user implement actual check on availability if applicable to plugin
350 }
351
353 return "v1.0";
354 }
355
356 // extract maximum speed of trajectory
357 double PlatooningControlPlugin::get_trajectory_speed(const std::vector<carma_planning_msgs::msg::TrajectoryPlanPoint>& trajectory_points)
358 {
359 double trajectory_speed = 0;
360
361 double dx1 = trajectory_points[trajectory_points.size()-1].x - trajectory_points[0].x;
362 double dy1 = trajectory_points[trajectory_points.size()-1].y - trajectory_points[0].y;
363 double d1 = sqrt(dx1*dx1 + dy1*dy1);
364 double t1 = (rclcpp::Time((trajectory_points[trajectory_points.size()-1].target_time)).nanoseconds() - rclcpp::Time(trajectory_points[0].target_time).nanoseconds())/1e9;
365
366 double avg_speed = d1/t1;
367 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "trajectory_points size = " << trajectory_points.size() << ", d1 = " << d1 << ", t1 = " << t1 << ", avg_speed = " << avg_speed);
368
369 for(size_t i = 0; i < trajectory_points.size() - 2; i++ )
370 {
371 double dx = trajectory_points[i + 1].x - trajectory_points[i].x;
372 double dy = trajectory_points[i + 1].y - trajectory_points[i].y;
373 double d = sqrt(dx*dx + dy*dy);
374 double t = rclcpp::Time((trajectory_points[i + 1].target_time)).seconds() - rclcpp::Time(trajectory_points[i].target_time).seconds();
375 double v = d/t;
376 if(v > trajectory_speed)
377 {
378 trajectory_speed = v;
379 }
380 }
381
382 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "trajectory speed: " << trajectory_speed);
383 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_control"), "avg trajectory speed: " << avg_speed);
384
385 return avg_speed; //TODO: why are 2 speeds being calculated? Which should be returned?
386
387 }
388
389
390} // platooning_control
391
392#include "rclcpp_components/register_node_macro.hpp"
393
394// Register the component with class_loader
395RCLCPP_COMPONENTS_REGISTER_NODE(platooning_control::PlatooningControlPlugin)
boost::optional< geometry_msgs::msg::TwistStamped > current_twist_
The most recent velocity message received by this node.
boost::optional< carma_planning_msgs::msg::TrajectoryPlan > current_trajectory_
The most recent trajectory received by this plugin.
boost::optional< geometry_msgs::msg::PoseStamped > current_pose_
The most recent pose message received by this node.
This class includes node-level logic for Platooning Control such as its publishers,...
motion::motion_common::State convert_state(const geometry_msgs::msg::PoseStamped &pose, const geometry_msgs::msg::TwistStamped &twist) const
void platoon_info_cb(const carma_planning_msgs::msg::PlatooningInfo::SharedPtr msg)
callback function for platoon info
bool get_availability() override
Returns availability of plugin. Always true.
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.
void current_trajectory_callback(const carma_planning_msgs::msg::TrajectoryPlan::UniquePtr tp)
callback function for trajectory plan
double get_trajectory_speed(const std::vector< carma_planning_msgs::msg::TrajectoryPlanPoint > &trajectory_points)
calculate average speed of a set of trajectory points
geometry_msgs::msg::TwistStamped compose_twist_cmd(double linear_vel, double angular_vel)
Compose twist message from linear and angular velocity commands.
rcl_interfaces::msg::SetParametersResult parameter_update_callback(const std::vector< rclcpp::Parameter > &parameters)
Callback for dynamic parameter updates.
std::string get_version_id() override
Returns version id of plugn.
autoware_msgs::msg::ControlCommandStamped compose_ctrl_cmd(double linear_vel, double steering_angle)
Compose control message from speed and steering commands.
carma_ros2_utils::SubPtr< carma_planning_msgs::msg::PlatooningInfo > platoon_info_sub_
autoware_msgs::msg::ControlCommandStamped generate_control_signals(const carma_planning_msgs::msg::TrajectoryPlanPoint &first_trajectory_point, const geometry_msgs::msg::PoseStamped &current_pose, const geometry_msgs::msg::TwistStamped &current_twist)
generate control signal by calculating speed and steering commands.
autoware_msgs::msg::ControlCommandStamped generate_command() override
Extending class provided method which should generate a command message which will be published to th...
std::shared_ptr< pure_pursuit::PurePursuit > pp_
carma_ros2_utils::PubPtr< carma_planning_msgs::msg::PlatooningInfo > platoon_info_pub_
PlatooningControlPlugin(const rclcpp::NodeOptions &options)
PlatooningControlPlugin constructor.
carma_ros2_utils::SubPtr< carma_planning_msgs::msg::TrajectoryPlan > trajectory_plan_sub_
This is the worker class for platoon controller. It is responsible for generating and smoothing the s...
void set_leader(const PlatoonLeaderInfo &leader)
Sets the platoon leader object using info from msg.
void set_current_speed(double speed)
set current speed
std::shared_ptr< PlatooningControlPluginConfig > ctrl_config_
void generate_speed(const carma_planning_msgs::msg::TrajectoryPlanPoint &point)
Generates speed commands (in m/s) based on the trajectory point.
autoware_auto_msgs::msg::Trajectory process_trajectory_plan(const carma_planning_msgs::msg::TrajectoryPlan &tp, double vehicle_response_lag)
Given a carma type of trajectory_plan, generate autoware type of trajectory accounting for speed_lag ...
void set_logger(rclcpp::Logger logger)
Replace the module-level logger used by all basic_autonomy functions.
Definition: log.cpp:33
rclcpp::Logger get_logger()
Return the module-level logger used by all basic_autonomy functions.
Definition: log.cpp:32
Stuct containing the algorithm configuration values for the PlatooningControlPlugin.