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::PlatooningControlPlugin Class Reference

This class includes node-level logic for Platooning Control such as its publishers, subscribers, and their callback functions. Platooning Control is used for generating control commands to maintain the gap in platoon as well as generating longitudinal and lateral control commands to follow the trajectory. More...

#include <platooning_control.hpp>

Inheritance diagram for platooning_control::PlatooningControlPlugin:
Inheritance graph
Collaboration diagram for platooning_control::PlatooningControlPlugin:
Collaboration graph

Public Member Functions

 PlatooningControlPlugin (const rclcpp::NodeOptions &options)
 PlatooningControlPlugin constructor. More...
 
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. More...
 
geometry_msgs::msg::TwistStamped compose_twist_cmd (double linear_vel, double angular_vel)
 Compose twist message from linear and angular velocity commands. More...
 
motion::motion_common::State convert_state (const geometry_msgs::msg::PoseStamped &pose, const geometry_msgs::msg::TwistStamped &twist) const
 
rcl_interfaces::msg::SetParametersResult parameter_update_callback (const std::vector< rclcpp::Parameter > &parameters)
 Callback for dynamic parameter updates. More...
 
void current_trajectory_callback (const carma_planning_msgs::msg::TrajectoryPlan::UniquePtr tp)
 callback function for trajectory plan More...
 
autoware_msgs::msg::ControlCommandStamped compose_ctrl_cmd (double linear_vel, double steering_angle)
 Compose control message from speed and steering commands. More...
 
bool get_availability () override
 Returns availability of plugin. Always true. More...
 
std::string get_version_id () override
 Returns version id of plugn. More...
 
autoware_msgs::msg::ControlCommandStamped generate_command () override
 Extending class provided method which should generate a command message which will be published to the required topic by the base class. More...
 
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. More...
 
- Public Member Functions inherited from carma_guidance_plugins::ControlPlugin
 ControlPlugin (const rclcpp::NodeOptions &)
 ControlPlugin constructor. More...
 
virtual ~ControlPlugin ()=default
 Virtual destructor for safe deletion. More...
 
virtual autoware_msgs::msg::ControlCommandStamped generate_command ()=0
 Extending class provided method which should generate a command message which will be published to the required topic by the base class. More...
 
std::string get_capability () override
 Get the capability string representing this plugins capabilities Method must be overriden by extending classes. Expectation is that abstract plugin type parent classes will provide a default implementation. More...
 
uint8_t get_type () override final
 Returns the type of this plugin according to the carma_planning_msgs::Plugin type enum. Extending classes for the specific type should override this method. More...
 
carma_ros2_utils::CallbackReturn handle_on_configure (const rclcpp_lifecycle::State &) override final
 
carma_ros2_utils::CallbackReturn handle_on_activate (const rclcpp_lifecycle::State &) override final
 
carma_ros2_utils::CallbackReturn handle_on_deactivate (const rclcpp_lifecycle::State &) override final
 
carma_ros2_utils::CallbackReturn handle_on_cleanup (const rclcpp_lifecycle::State &) override final
 
carma_ros2_utils::CallbackReturn handle_on_shutdown (const rclcpp_lifecycle::State &) override final
 
carma_ros2_utils::CallbackReturn handle_on_error (const rclcpp_lifecycle::State &, const std::string &exception_string) override final
 
- Public Member Functions inherited from carma_guidance_plugins::PluginBaseNode
 PluginBaseNode (const rclcpp::NodeOptions &)
 PluginBaseNode constructor. More...
 
virtual ~PluginBaseNode ()=default
 Virtual destructor for safe deletion. More...
 
virtual std::shared_ptr< carma_wm::WMListenerget_world_model_listener () final
 Method to return the default world model listener provided as a convience by this base class If this method or get_world_model() are not called then the world model remains uninitialized and will not create unnecessary subscriptions. More...
 
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 get_world_model_listener() are not called then the world model remains uninitialized and will not create unnecessary subscriptions. More...
 
virtual bool get_activation_status () final
 Returns the activation status of this plugin. The plugins API callbacks will only be triggered when this method returns true. More...
 
virtual uint8_t get_type ()
 Returns the type of this plugin according to the carma_planning_msgs::Plugin type enum. Extending classes for the specific type should override this method. More...
 
std::string get_plugin_name_and_ns () const
 Return the name of this plugin with namespace. NOTE: If only the name of the plugin is required, use get_plugin_name() More...
 
std::string get_plugin_name () const
 Return the name of this plugin. More...
 
virtual bool get_availability ()=0
 Get the availability status of this plugin based on the current operating environment. Method must be overriden by extending classes. More...
 
virtual std::string get_capability ()=0
 Get the capability string representing this plugins capabilities Method must be overriden by extending classes. Expectation is that abstract plugin type parent classes will provide a default implementation. More...
 
virtual std::string get_version_id ()=0
 Returns the version id of this plugin. More...
 
virtual carma_ros2_utils::CallbackReturn on_configure_plugin ()=0
 Method which is triggered when this plugin is moved from the UNCONFIGURED to INACTIVE states. This method should be used to load parameters and is required to be implemented. More...
 
virtual carma_ros2_utils::CallbackReturn on_activate_plugin ()
 Method which is triggered when this plugin is moved from the INACTIVE to ACTIVE states. This method should be used to prepare for future callbacks for plugin's capabilites. More...
 
virtual carma_ros2_utils::CallbackReturn on_deactivate_plugin ()
 Method which is triggered when this plugin is moved from the ACTIVE to INACTIVE states. This method should be used to disable any functionality which should cease execution when plugin is inactive. More...
 
virtual carma_ros2_utils::CallbackReturn on_cleanup_plugin ()
 Method which is triggered when this plugin is moved from the INACTIVE to UNCONFIGURED states. This method should be used to fully reset the plugin such that a future call to on_configure_plugin would leave the plugin in a fresh state as though just launched. More...
 
virtual carma_ros2_utils::CallbackReturn on_shutdown_plugin ()
 Method which is triggered when this plugin is moved from any state to FINALIZED This method should be used to generate any shutdown logs or final cleanup. More...
 
virtual carma_ros2_utils::CallbackReturn on_error_plugin (const std::string &exception_string)
 Method which is triggered when an unhandled exception occurs in this plugin This method should be used to cleanup such that the plugin could be moved to UNCONFIGURED state if possible. More...
 
carma_ros2_utils::CallbackReturn handle_on_configure (const rclcpp_lifecycle::State &) override
 
carma_ros2_utils::CallbackReturn handle_on_activate (const rclcpp_lifecycle::State &) override
 
carma_ros2_utils::CallbackReturn handle_on_deactivate (const rclcpp_lifecycle::State &) override
 
carma_ros2_utils::CallbackReturn handle_on_cleanup (const rclcpp_lifecycle::State &) override
 
carma_ros2_utils::CallbackReturn handle_on_shutdown (const rclcpp_lifecycle::State &) override
 
carma_ros2_utils::CallbackReturn handle_on_error (const rclcpp_lifecycle::State &, const std::string &exception_string) override
 
 FRIEND_TEST (carma_guidance_plugins_test, connections_test)
 

Public Attributes

double trajectory_speed_ = 0.0
 
std::shared_ptr< pure_pursuit::PurePursuit > pp_
 

Private Member Functions

void platoon_info_cb (const carma_planning_msgs::msg::PlatooningInfo::SharedPtr msg)
 callback function for platoon info More...
 
double get_trajectory_speed (const std::vector< carma_planning_msgs::msg::TrajectoryPlanPoint > &trajectory_points)
 calculate average speed of a set of trajectory points More...
 
 FRIEND_TEST (PlatooningControlPluginTest, test_platoon_info_cb)
 
 FRIEND_TEST (PlatooningControlPluginTest, test_get_trajectory_speed)
 
 FRIEND_TEST (PlatooningControlPluginTest, test_generate_controls)
 
 FRIEND_TEST (PlatooningControlPluginTest, test_current_trajectory_callback)
 

Private Attributes

PlatooningControlPluginConfig config_
 
PlatooningControlWorker pcw_
 
PlatoonLeaderInfo platoon_leader_
 
double prev_input_time_ms_ = 0
 
long consecutive_input_counter_ = 0
 
carma_ros2_utils::SubPtr< carma_planning_msgs::msg::TrajectoryPlan > trajectory_plan_sub_
 
carma_ros2_utils::SubPtr< carma_planning_msgs::msg::PlatooningInfo > platoon_info_sub_
 
carma_ros2_utils::PubPtr< carma_planning_msgs::msg::PlatooningInfo > platoon_info_pub_
 

Additional Inherited Members

- Protected Member Functions inherited from carma_guidance_plugins::ControlPlugin
void current_pose_callback (geometry_msgs::msg::PoseStamped::UniquePtr msg)
 
void current_twist_callback (geometry_msgs::msg::TwistStamped::UniquePtr msg)
 
virtual void current_trajectory_callback (carma_planning_msgs::msg::TrajectoryPlan::UniquePtr msg)
 Extending class provided method which can optionally handle trajectory plan callbacks. More...
 
- Protected Attributes inherited from carma_guidance_plugins::ControlPlugin
boost::optional< geometry_msgs::msg::PoseStamped > current_pose_
 The most recent pose message received by this node. More...
 
boost::optional< geometry_msgs::msg::TwistStamped > current_twist_
 The most recent velocity message received by this node. More...
 
boost::optional< carma_planning_msgs::msg::TrajectoryPlan > current_trajectory_
 The most recent trajectory received by this plugin. More...
 

Detailed Description

This class includes node-level logic for Platooning Control such as its publishers, subscribers, and their callback functions. Platooning Control is used for generating control commands to maintain the gap in platoon as well as generating longitudinal and lateral control commands to follow the trajectory.

Definition at line 41 of file platooning_control.hpp.

Constructor & Destructor Documentation

◆ PlatooningControlPlugin()

platooning_control::PlatooningControlPlugin::PlatooningControlPlugin ( const rclcpp::NodeOptions &  options)
explicit

PlatooningControlPlugin constructor.

Definition at line 23 of file platooning_control.cpp.

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 }
ControlPlugin base class which can be extended by user provided plugins which wish to implement the C...
std::shared_ptr< PlatooningControlPluginConfig > ctrl_config_
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

References platooning_control::PlatooningControlPluginConfig::adjustment_cap_mps, platooning_control::PlatooningControlPluginConfig::cmd_timestamp_ms, config_, platooning_control::PlatooningControlWorker::ctrl_config_, platooning_control::PlatooningControlPluginConfig::dist_front_rear_wheels, platooning_control::PlatooningControlPluginConfig::dt, platooning_control::PlatooningControlPluginConfig::emergency_stop_distance, platooning_control::PlatooningControlPluginConfig::enable_max_accel_filter, platooning_control::PlatooningControlPluginConfig::enable_max_adjustment_filter, basic_autonomy::get_logger(), platooning_control::PlatooningControlPluginConfig::ignore_initial_inputs, platooning_control::PlatooningControlPluginConfig::integrator_max, platooning_control::PlatooningControlPluginConfig::integrator_max_pp, platooning_control::PlatooningControlPluginConfig::integrator_min, platooning_control::PlatooningControlPluginConfig::integrator_min_pp, platooning_control::PlatooningControlPluginConfig::is_delay_compensation, platooning_control::PlatooningControlPluginConfig::is_integrator_enabled, platooning_control::PlatooningControlPluginConfig::is_interpolate_lookahead_point, platooning_control::PlatooningControlPluginConfig::kd, platooning_control::PlatooningControlPluginConfig::ki, platooning_control::PlatooningControlPluginConfig::ki_pp, platooning_control::PlatooningControlPluginConfig::kp, platooning_control::PlatooningControlPluginConfig::max_accel_mps2, platooning_control::PlatooningControlPluginConfig::max_delta_speed_per_timestep, platooning_control::PlatooningControlPluginConfig::max_lookahead_dist, platooning_control::PlatooningControlPluginConfig::min_delta_speed_per_timestep, platooning_control::PlatooningControlPluginConfig::min_lookahead_dist, pcw_, basic_autonomy::set_logger(), platooning_control::PlatooningControlPluginConfig::shutdown_timeout, platooning_control::PlatooningControlPluginConfig::speed_thres_traveling_direction, platooning_control::PlatooningControlPluginConfig::speed_to_lookahead_ratio, platooning_control::PlatooningControlPluginConfig::stand_still_headway_m, platooning_control::PlatooningControlPluginConfig::vehicle_id, and platooning_control::PlatooningControlPluginConfig::vehicle_response_lag.

Here is the call graph for this function:

Member Function Documentation

◆ compose_ctrl_cmd()

autoware_msgs::msg::ControlCommandStamped platooning_control::PlatooningControlPlugin::compose_ctrl_cmd ( double  linear_vel,
double  steering_angle 
)

Compose control message from speed and steering commands.

Parameters
linear_vellinear velocity in m/s
steering_anglesteering angle in rad
Returns
control command

Definition at line 336 of file platooning_control.cpp.

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 }

References basic_autonomy::get_logger().

Referenced by generate_control_signals().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ compose_twist_cmd()

geometry_msgs::msg::TwistStamped platooning_control::PlatooningControlPlugin::compose_twist_cmd ( double  linear_vel,
double  angular_vel 
)

Compose twist message from linear and angular velocity commands.

Parameters
linear_vellinear velocity in m/s
angular_velangular velocity in rad/s
Returns
twist message

Definition at line 327 of file platooning_control.cpp.

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 }

◆ convert_state()

motion::motion_common::State platooning_control::PlatooningControlPlugin::convert_state ( const geometry_msgs::msg::PoseStamped &  pose,
const geometry_msgs::msg::TwistStamped &  twist 
) const

Definition at line 298 of file platooning_control.cpp.

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 }

Referenced by generate_control_signals().

Here is the caller graph for this function:

◆ current_trajectory_callback()

void platooning_control::PlatooningControlPlugin::current_trajectory_callback ( const carma_planning_msgs::msg::TrajectoryPlan::UniquePtr  tp)
virtual

callback function for trajectory plan

Parameters
msgtrajectory plan msg

Reimplemented from carma_guidance_plugins::ControlPlugin.

Definition at line 312 of file platooning_control.cpp.

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 }
boost::optional< carma_planning_msgs::msg::TrajectoryPlan > current_trajectory_
The most recent trajectory received by this plugin.

References consecutive_input_counter_, carma_guidance_plugins::ControlPlugin::current_trajectory_, basic_autonomy::get_logger(), and prev_input_time_ms_.

Referenced by on_configure_plugin().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FRIEND_TEST() [1/4]

platooning_control::PlatooningControlPlugin::FRIEND_TEST ( PlatooningControlPluginTest  ,
test_current_trajectory_callback   
)
private

◆ FRIEND_TEST() [2/4]

platooning_control::PlatooningControlPlugin::FRIEND_TEST ( PlatooningControlPluginTest  ,
test_generate_controls   
)
private

◆ FRIEND_TEST() [3/4]

platooning_control::PlatooningControlPlugin::FRIEND_TEST ( PlatooningControlPluginTest  ,
test_get_trajectory_speed   
)
private

◆ FRIEND_TEST() [4/4]

platooning_control::PlatooningControlPlugin::FRIEND_TEST ( PlatooningControlPluginTest  ,
test_platoon_info_cb   
)
private

◆ generate_command()

autoware_msgs::msg::ControlCommandStamped platooning_control::PlatooningControlPlugin::generate_command ( )
overridevirtual

Extending class provided method which should generate a command message which will be published to the required topic by the base class.

NOTE: Implementer can determine if trajectory has changed based on current_trajectory_->trajectory_id

Returns
The command message to publish

Implements carma_guidance_plugins::ControlPlugin.

Definition at line 203 of file platooning_control.cpp.

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 }
boost::optional< geometry_msgs::msg::TwistStamped > current_twist_
The most recent velocity message received by this node.
boost::optional< geometry_msgs::msg::PoseStamped > current_pose_
The most recent pose message received by this node.
double get_trajectory_speed(const std::vector< carma_planning_msgs::msg::TrajectoryPlanPoint > &trajectory_points)
calculate average speed of a set of trajectory points
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.

References config_, consecutive_input_counter_, carma_guidance_plugins::ControlPlugin::current_pose_, carma_guidance_plugins::ControlPlugin::current_trajectory_, carma_guidance_plugins::ControlPlugin::current_twist_, generate_control_signals(), basic_autonomy::get_logger(), get_trajectory_speed(), platooning_control::PlatooningControlPluginConfig::ignore_initial_inputs, prev_input_time_ms_, platooning_control::PlatooningControlPluginConfig::shutdown_timeout, and trajectory_speed_.

Here is the call graph for this function:

◆ generate_control_signals()

autoware_msgs::msg::ControlCommandStamped platooning_control::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 
)

generate control signal by calculating speed and steering commands.

Parameters
point0start point of control window
point_endend point of control wondow

Definition at line 274 of file platooning_control.cpp.

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 }
motion::motion_common::State convert_state(const geometry_msgs::msg::PoseStamped &pose, const geometry_msgs::msg::TwistStamped &twist) const
autoware_msgs::msg::ControlCommandStamped compose_ctrl_cmd(double linear_vel, double steering_angle)
Compose control message from speed and steering commands.
std::shared_ptr< pure_pursuit::PurePursuit > pp_
void set_leader(const PlatoonLeaderInfo &leader)
Sets the platoon leader object using info from msg.
void set_current_speed(double speed)
set current speed
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 ...

References compose_ctrl_cmd(), config_, convert_state(), carma_guidance_plugins::ControlPlugin::current_trajectory_, platooning_control::PlatooningControlWorker::generate_speed(), basic_autonomy::get_logger(), pcw_, platoon_leader_, pp_, basic_autonomy::waypoint_generation::process_trajectory_plan(), platooning_control::PlatooningControlWorker::set_current_speed(), platooning_control::PlatooningControlWorker::set_leader(), platooning_control::PlatooningControlWorker::speedCmd_, trajectory_speed_, and platooning_control::PlatooningControlPluginConfig::vehicle_response_lag.

Referenced by generate_command().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_availability()

bool platooning_control::PlatooningControlPlugin::get_availability ( )
overridevirtual

Returns availability of plugin. Always true.

Implements carma_guidance_plugins::PluginBaseNode.

Definition at line 348 of file platooning_control.cpp.

348 {
349 return true; // TODO for user implement actual check on availability if applicable to plugin
350 }

◆ get_trajectory_speed()

double platooning_control::PlatooningControlPlugin::get_trajectory_speed ( const std::vector< carma_planning_msgs::msg::TrajectoryPlanPoint > &  trajectory_points)
private

calculate average speed of a set of trajectory points

Parameters
trajectory_pointsset of trajectory points
Returns
trajectory speed

Definition at line 357 of file platooning_control.cpp.

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 }

References visualize_xodr::dx, visualize_xodr::dy, basic_autonomy::get_logger(), and process_bag::i.

Referenced by generate_command().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_version_id()

std::string platooning_control::PlatooningControlPlugin::get_version_id ( )
overridevirtual

Returns version id of plugn.

Implements carma_guidance_plugins::PluginBaseNode.

Definition at line 352 of file platooning_control.cpp.

352 {
353 return "v1.0";
354 }

◆ on_configure_plugin()

carma_ros2_utils::CallbackReturn platooning_control::PlatooningControlPlugin::on_configure_plugin ( )
overridevirtual

This method should be used to load parameters and will be called on the configure state transition.

Implements carma_guidance_plugins::PluginBaseNode.

Definition at line 116 of file platooning_control.cpp.

117 {
118 // Reset config
119 config_ = PlatooningControlPluginConfig();
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 }
void platoon_info_cb(const carma_planning_msgs::msg::PlatooningInfo::SharedPtr msg)
callback function for platoon info
void current_trajectory_callback(const carma_planning_msgs::msg::TrajectoryPlan::UniquePtr tp)
callback function for trajectory plan
rcl_interfaces::msg::SetParametersResult parameter_update_callback(const std::vector< rclcpp::Parameter > &parameters)
Callback for dynamic parameter updates.
carma_ros2_utils::SubPtr< carma_planning_msgs::msg::PlatooningInfo > platoon_info_sub_
carma_ros2_utils::PubPtr< carma_planning_msgs::msg::PlatooningInfo > platoon_info_pub_
carma_ros2_utils::SubPtr< carma_planning_msgs::msg::TrajectoryPlan > trajectory_plan_sub_

References platooning_control::PlatooningControlPluginConfig::adjustment_cap_mps, platooning_control::PlatooningControlPluginConfig::cmd_timestamp_ms, config_, current_trajectory_callback(), platooning_control::PlatooningControlPluginConfig::dist_front_rear_wheels, platooning_control::PlatooningControlPluginConfig::dt, platooning_control::PlatooningControlPluginConfig::emergency_stop_distance, platooning_control::PlatooningControlPluginConfig::enable_max_accel_filter, platooning_control::PlatooningControlPluginConfig::enable_max_adjustment_filter, basic_autonomy::get_logger(), platooning_control::PlatooningControlPluginConfig::ignore_initial_inputs, platooning_control::PlatooningControlPluginConfig::integrator_max, platooning_control::PlatooningControlPluginConfig::integrator_max_pp, platooning_control::PlatooningControlPluginConfig::integrator_min, platooning_control::PlatooningControlPluginConfig::integrator_min_pp, platooning_control::PlatooningControlPluginConfig::is_delay_compensation, platooning_control::PlatooningControlPluginConfig::is_integrator_enabled, platooning_control::PlatooningControlPluginConfig::is_interpolate_lookahead_point, platooning_control::PlatooningControlPluginConfig::kd, platooning_control::PlatooningControlPluginConfig::ki, platooning_control::PlatooningControlPluginConfig::ki_pp, platooning_control::PlatooningControlPluginConfig::kp, platooning_control::PlatooningControlPluginConfig::max_accel_mps2, platooning_control::PlatooningControlPluginConfig::max_delta_speed_per_timestep, platooning_control::PlatooningControlPluginConfig::max_lookahead_dist, platooning_control::PlatooningControlPluginConfig::min_delta_speed_per_timestep, platooning_control::PlatooningControlPluginConfig::min_lookahead_dist, parameter_update_callback(), platoon_info_cb(), platoon_info_pub_, platoon_info_sub_, pp_, platooning_control::PlatooningControlPluginConfig::shutdown_timeout, platooning_control::PlatooningControlPluginConfig::speed_thres_traveling_direction, platooning_control::PlatooningControlPluginConfig::speed_to_lookahead_ratio, platooning_control::PlatooningControlPluginConfig::stand_still_headway_m, trajectory_plan_sub_, platooning_control::PlatooningControlPluginConfig::vehicle_id, and platooning_control::PlatooningControlPluginConfig::vehicle_response_lag.

Here is the call graph for this function:

◆ parameter_update_callback()

rcl_interfaces::msg::SetParametersResult platooning_control::PlatooningControlPlugin::parameter_update_callback ( const std::vector< rclcpp::Parameter > &  parameters)

Callback for dynamic parameter updates.

Definition at line 68 of file platooning_control.cpp.

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 }

References platooning_control::PlatooningControlPluginConfig::adjustment_cap_mps, platooning_control::PlatooningControlPluginConfig::cmd_timestamp_ms, config_, platooning_control::PlatooningControlPluginConfig::dist_front_rear_wheels, platooning_control::PlatooningControlPluginConfig::dt, platooning_control::PlatooningControlPluginConfig::emergency_stop_distance, platooning_control::PlatooningControlPluginConfig::enable_max_accel_filter, platooning_control::PlatooningControlPluginConfig::enable_max_adjustment_filter, platooning_control::PlatooningControlPluginConfig::integrator_max, platooning_control::PlatooningControlPluginConfig::integrator_max_pp, platooning_control::PlatooningControlPluginConfig::integrator_min, platooning_control::PlatooningControlPluginConfig::integrator_min_pp, platooning_control::PlatooningControlPluginConfig::is_delay_compensation, platooning_control::PlatooningControlPluginConfig::is_integrator_enabled, platooning_control::PlatooningControlPluginConfig::is_interpolate_lookahead_point, platooning_control::PlatooningControlPluginConfig::kd, platooning_control::PlatooningControlPluginConfig::ki, platooning_control::PlatooningControlPluginConfig::ki_pp, platooning_control::PlatooningControlPluginConfig::kp, platooning_control::PlatooningControlPluginConfig::max_accel_mps2, platooning_control::PlatooningControlPluginConfig::max_delta_speed_per_timestep, platooning_control::PlatooningControlPluginConfig::max_lookahead_dist, platooning_control::PlatooningControlPluginConfig::min_delta_speed_per_timestep, platooning_control::PlatooningControlPluginConfig::min_lookahead_dist, platooning_control::PlatooningControlPluginConfig::speed_thres_traveling_direction, platooning_control::PlatooningControlPluginConfig::speed_to_lookahead_ratio, platooning_control::PlatooningControlPluginConfig::stand_still_headway_m, and platooning_control::PlatooningControlPluginConfig::vehicle_response_lag.

Referenced by on_configure_plugin().

Here is the caller graph for this function:

◆ platoon_info_cb()

void platooning_control::PlatooningControlPlugin::platoon_info_cb ( const carma_planning_msgs::msg::PlatooningInfo::SharedPtr  msg)
private

callback function for platoon info

Parameters
msgplatoon info msg

Definition at line 241 of file platooning_control.cpp.

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 }

References platooning_control::PlatooningControlWorker::actual_gap_, platooning_control::PlatoonLeaderInfo::commandSpeed, platooning_control::PlatooningControlWorker::desired_gap_, basic_autonomy::get_logger(), platooning_control::PlatoonLeaderInfo::leaderIndex, platooning_control::PlatoonLeaderInfo::NumberOfVehicleInFront, pcw_, platoon_info_pub_, platoon_leader_, platooning_control::PlatooningControlWorker::speedCmd_, platooning_control::PlatoonLeaderInfo::staticId, and platooning_control::PlatoonLeaderInfo::vehiclePosition.

Referenced by on_configure_plugin().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ config_

PlatooningControlPluginConfig platooning_control::PlatooningControlPlugin::config_
private

◆ consecutive_input_counter_

long platooning_control::PlatooningControlPlugin::consecutive_input_counter_ = 0
private

Definition at line 123 of file platooning_control.hpp.

Referenced by current_trajectory_callback(), and generate_command().

◆ pcw_

PlatooningControlWorker platooning_control::PlatooningControlPlugin::pcw_
private

◆ platoon_info_pub_

carma_ros2_utils::PubPtr<carma_planning_msgs::msg::PlatooningInfo> platooning_control::PlatooningControlPlugin::platoon_info_pub_
private

Definition at line 144 of file platooning_control.hpp.

Referenced by on_configure_plugin(), and platoon_info_cb().

◆ platoon_info_sub_

carma_ros2_utils::SubPtr<carma_planning_msgs::msg::PlatooningInfo> platooning_control::PlatooningControlPlugin::platoon_info_sub_
private

Definition at line 141 of file platooning_control.hpp.

Referenced by on_configure_plugin().

◆ platoon_leader_

PlatoonLeaderInfo platooning_control::PlatooningControlPlugin::platoon_leader_
private

Definition at line 121 of file platooning_control.hpp.

Referenced by generate_control_signals(), and platoon_info_cb().

◆ pp_

std::shared_ptr<pure_pursuit::PurePursuit> platooning_control::PlatooningControlPlugin::pp_

Definition at line 109 of file platooning_control.hpp.

Referenced by generate_control_signals(), and on_configure_plugin().

◆ prev_input_time_ms_

double platooning_control::PlatooningControlPlugin::prev_input_time_ms_ = 0
private

Definition at line 122 of file platooning_control.hpp.

Referenced by current_trajectory_callback(), and generate_command().

◆ trajectory_plan_sub_

carma_ros2_utils::SubPtr<carma_planning_msgs::msg::TrajectoryPlan> platooning_control::PlatooningControlPlugin::trajectory_plan_sub_
private

Definition at line 140 of file platooning_control.hpp.

Referenced by on_configure_plugin().

◆ trajectory_speed_

double platooning_control::PlatooningControlPlugin::trajectory_speed_ = 0.0

Definition at line 67 of file platooning_control.hpp.

Referenced by generate_command(), and generate_control_signals().


The documentation for this class was generated from the following files: