17#include <rclcpp/rclcpp.hpp>
21#include <boost/uuid/uuid_generators.hpp>
22#include <boost/uuid/uuid_io.hpp>
23#include <lanelet2_core/geometry/Point.h>
24#include <trajectory_utils/trajectory_utils.hpp>
25#include <trajectory_utils/conversions/conversions.hpp>
28#include <Eigen/Geometry>
31#include <unordered_set>
33#include <carma_planning_msgs/msg/stop_and_wait_maneuver.hpp>
34#include <lanelet2_core/primitives/Lanelet.h>
35#include <lanelet2_core/geometry/LineString.h>
38#include <carma_planning_msgs/msg/trajectory_plan_point.hpp>
39#include <carma_planning_msgs/msg/trajectory_plan.hpp>
41#include <std_msgs/msg/float64.hpp>
44using oss = std::ostringstream;
49namespace std_ph = std::placeholders;
67 auto error_double = update_params<double>({
75 auto error_int = update_params<int>({
80 rcl_interfaces::msg::SetParametersResult result;
82 result.successful = !error_double && !error_int;
103 RCLCPP_INFO_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Done loading parameters: " <<
config_);
109 return CallbackReturn::SUCCESS;
113 std::shared_ptr<rmw_request_id_t> srv_header,
114 carma_planning_msgs::srv::PlanTrajectory::Request::SharedPtr req,
115 carma_planning_msgs::srv::PlanTrajectory::Response::SharedPtr resp)
117 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Starting stop controlled intersection trajectory planning");
119 if(req->maneuver_index_to_plan >= req->maneuver_plan.maneuvers.size())
121 throw std::invalid_argument(
122 "Stop Control Intersection Plugin asked to plan invalid maneuver index: " +
std::to_string(req->maneuver_index_to_plan) +
123 " for plan of size: " +
std::to_string(req->maneuver_plan.maneuvers.size()));
125 std::vector<carma_planning_msgs::msg::Maneuver> maneuver_plan;
126 for(
size_t i = req->maneuver_index_to_plan; i < req->maneuver_plan.maneuvers.size();
i++){
128 if((req->maneuver_plan.maneuvers[
i].type == carma_planning_msgs::msg::Maneuver::LANE_FOLLOWING || req->maneuver_plan.maneuvers[
i].type == carma_planning_msgs::msg::Maneuver::INTERSECTION_TRANSIT_STRAIGHT
129 || req->maneuver_plan.maneuvers[
i].type == carma_planning_msgs::msg::Maneuver::INTERSECTION_TRANSIT_LEFT_TURN || req->maneuver_plan.maneuvers[
i].type ==carma_planning_msgs::msg::Maneuver::INTERSECTION_TRANSIT_RIGHT_TURN)
132 maneuver_plan.push_back(req->maneuver_plan.maneuvers[
i]);
133 resp->related_maneuvers.push_back(req->maneuver_plan.maneuvers[
i].type);
141 lanelet::BasicPoint2d veh_pos(req->vehicle_state.x_pos_global, req->vehicle_state.y_pos_global);
142 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Planning state x:"<<req->vehicle_state.x_pos_global <<
" , y: " << req->vehicle_state.y_pos_global);
144 double current_downtrack =
wm_->routeTrackPos(veh_pos).downtrack;
145 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Current_downtrack"<< current_downtrack);
147 std::vector<PointSpeedPair> points_and_target_speeds =
maneuvers_to_points( maneuver_plan,
wm_, req->vehicle_state);
148 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Maneuver to points size:"<< points_and_target_speeds.size());
151 carma_planning_msgs::msg::TrajectoryPlan trajectory;
152 trajectory.header.frame_id =
"map";
153 trajectory.header.stamp = req->header.stamp;
158 trajectory.initial_longitudinal_velocity = req->vehicle_state.longitudinal_vel;
161 for (
auto& p : trajectory.trajectory_points) {
166 resp->trajectory_plan = trajectory;
168 resp->maneuver_status.push_back(carma_planning_msgs::srv::PlanTrajectory::Response::MANEUVER_IN_PROGRESS);
174 std::vector<PointSpeedPair> points_and_target_speeds;
175 std::unordered_set<lanelet::Id> visited_lanelets;
177 lanelet::BasicPoint2d veh_pos(state.x_pos_global, state.y_pos_global);
178 double max_starting_downtrack =
wm_->routeTrackPos(veh_pos).downtrack;
179 double starting_speed = state.longitudinal_vel;
182 double starting_downtrack;
183 for (
const auto& maneuver : maneuvers)
185 if(maneuver.type != carma_planning_msgs::msg::Maneuver::LANE_FOLLOWING && maneuver.type != carma_planning_msgs::msg::Maneuver::INTERSECTION_TRANSIT_STRAIGHT && maneuver.type != carma_planning_msgs::msg::Maneuver::INTERSECTION_TRANSIT_LEFT_TURN
186 && maneuver.type !=carma_planning_msgs::msg::Maneuver::INTERSECTION_TRANSIT_RIGHT_TURN ){
187 throw std::invalid_argument(
"Stop Controlled Intersection Tactical Plugin does not support this maneuver type");
193 if (starting_downtrack > max_starting_downtrack)
195 starting_downtrack = max_starting_downtrack;
203 std::vector<lanelet::BasicPoint2d> route_points = wm->sampleRoutePoints(
207 route_points.insert(route_points.begin(), veh_pos);
208 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Route geometery points size: "<<route_points.size());
211 throw std::invalid_argument(
"No case number specified for stop controlled intersection maneuver");
218 else if(case_num == 2){
221 else if(case_num == 3)
226 throw std::invalid_argument(
"The stop controlled intersection tactical plugin doesn't handle the case number requested");
230 return points_and_target_speeds;
234const carma_planning_msgs::msg::Maneuver& maneuver, std::vector<lanelet::BasicPoint2d>& route_geometry_points,
double starting_speed,
const carma_planning_msgs::msg::VehicleState& state){
236 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Planning for Case One");
243 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"a_acc received: "<< a_acc);
244 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"a_dec received: "<< a_dec);
245 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"t_acc received: "<< t_acc);
246 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"t_dec received: "<< t_dec);
247 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"speed before decel received: "<< speed_before_decel);
253 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Maneuver starting downtrack: "<< start_dist);
254 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Maneuver ending downtrack: "<< end_dist);
256 lanelet::BasicPoint2d state_point(state.x_pos_global, state.y_pos_global);
257 double route_starting_downtrack = wm->routeTrackPos(state_point).downtrack;
260 if(route_starting_downtrack < start_dist){
263 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Starting distance is less than maneuver start, updating parameters");
264 double dist_decel = pow(speed_before_decel, 2)/(2*std::abs(a_dec));
266 dist_acc = end_dist - dist_decel;
267 a_acc = (pow(speed_before_decel, 2) - pow(starting_speed,2))/(2*dist_acc);
268 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Updated a_acc: "<< a_acc);
272 dist_acc = (pow(speed_before_decel, 2) - pow(starting_speed, 2))/(2*a_acc);
275 std::vector<PointSpeedPair> points_and_target_speeds;
281 lanelet::BasicPoint2d prev_point = state_point;
282 double total_dist_covered = 0;
284 for(
size_t i = 1;
i < route_geometry_points.size();
i++){
285 lanelet::BasicPoint2d current_point = route_geometry_points[
i];
286 double delta_d = lanelet::geometry::distance2d(prev_point, current_point);
287 total_dist_covered += delta_d;
290 if(total_dist_covered <= dist_acc){
292 speed_i = sqrt(pow(starting_speed,2) + 2*a_acc*total_dist_covered);
296 speed_i = sqrt(std::max(pow(speed_before_decel,2) + 2*a_dec*(total_dist_covered - dist_acc),0.0));
304 p.
point = prev_point;
308 p.
point = route_geometry_points[
i];
310 prev_point = current_point;
312 points_and_target_speeds.push_back(p);
316 return points_and_target_speeds;
321const carma_planning_msgs::msg::Maneuver& maneuver, std::vector<lanelet::BasicPoint2d>& route_geometry_points,
double starting_speed){
322 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Planning for Case Two");
334 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Maneuver starting downtrack: "<< start_dist);
335 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Maneuver ending downtrack: "<< end_dist);
338 double route_starting_downtrack = wm->routeTrackPos(route_geometry_points[0]).downtrack;
343 if(route_starting_downtrack < start_dist){
346 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Starting distance is less than maneuver start, updating parameters");
347 dist_acc = starting_speed*t_acc + 0.5 * a_acc * pow(t_acc,2);
348 dist_decel = speed_before_decel*t_dec + 0.5 * a_dec * pow(t_dec,2);
349 dist_cruise = end_dist - route_starting_downtrack - (dist_acc + dist_decel);
353 dist_acc = starting_speed*t_acc + 0.5 * a_acc * pow(t_acc,2);
354 dist_cruise = speed_before_decel*t_cruise;
355 dist_decel = speed_before_decel*t_dec + 0.5 * a_dec * pow(t_dec,2);
359 double total_distance_needed = dist_acc + dist_cruise + dist_decel;
360 if(total_distance_needed - (end_dist - start_dist) >
epsilon_ ){
363 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Updating maneuver to meet start and end dist req.");
364 double delta_total_dist = total_distance_needed - (end_dist - start_dist);
365 dist_cruise -= delta_total_dist;
367 dist_acc += dist_cruise;
373 std::vector<PointSpeedPair> points_and_target_speeds;
379 lanelet::BasicPoint2d prev_point = route_geometry_points.front();
380 double total_dist_planned = 0;
381 double prev_speed = starting_speed;
382 for(
auto route_point : route_geometry_points){
383 lanelet::BasicPoint2d current_point = route_point;
384 double delta_d = lanelet::geometry::distance2d(prev_point, current_point);
385 total_dist_planned += delta_d;
389 if(total_dist_planned < dist_acc){
391 speed_i = sqrt(pow(starting_speed,2) + 2*a_acc*total_dist_planned);
393 else if(dist_cruise > 0 && total_dist_planned >= dist_acc && total_dist_planned <= (dist_acc + dist_cruise)){
395 speed_i = prev_speed;
399 speed_i = sqrt(std::max(pow(speed_before_decel,2) + 2*a_dec*(total_dist_planned - dist_acc - dist_cruise),0.0));
404 p.
point = prev_point;
408 p.
point = route_point;
409 p.
speed = std::min(speed_i,speed_before_decel);
410 prev_point = current_point;
412 points_and_target_speeds.push_back(p);
414 prev_speed = speed_i;
417 return points_and_target_speeds;
422const carma_planning_msgs::msg::Maneuver& maneuver, std::vector<lanelet::BasicPoint2d>& route_geometry_points,
double starting_speed){
423 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Planning for Case three");
430 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Maneuver starting downtrack: "<< start_dist);
431 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Maneuver ending downtrack: "<< end_dist);
434 double route_starting_downtrack = wm->routeTrackPos(route_geometry_points[0]).downtrack;
436 if(route_starting_downtrack < start_dist){
438 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Starting distance is less than maneuver start, updating parameters");
439 a_dec = pow(starting_speed, 2)/(2*(end_dist - route_starting_downtrack));
442 std::vector<PointSpeedPair> points_and_target_speeds;
448 lanelet::BasicPoint2d prev_point = route_geometry_points[0];
449 double total_dist_covered = 0;
451 for(
size_t i = 0;
i < route_geometry_points.size();
i++){
452 lanelet::BasicPoint2d current_point = route_geometry_points[
i];
453 double delta_d = lanelet::geometry::distance2d(prev_point, current_point);
454 total_dist_covered +=delta_d;
456 double speed_i = sqrt(std::max(pow(starting_speed,2) + 2 * a_dec * total_dist_covered, 0.0));
461 p.
point = prev_point;
465 p.
point = route_geometry_points[
i];
467 prev_point = current_point;
470 points_and_target_speeds.push_back(p);
475 return points_and_target_speeds;
479 const std::vector<PointSpeedPair>& points,
const carma_planning_msgs::msg::VehicleState& state,
const rclcpp::Time& state_time){
481 std::vector<carma_planning_msgs::msg::TrajectoryPlanPoint> trajectory;
482 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"VehicleState: "
483 <<
" x: " << state.x_pos_global <<
" y: " << state.y_pos_global <<
" yaw: " << state.orientation
484 <<
" speed: " << state.longitudinal_vel);
487 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Nearest pt index: "<<nearest_pt_index);
488 std::vector<PointSpeedPair> future_points(points.begin() + nearest_pt_index + 1, points.end());
489 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Future points size: "<<future_points.size());
491 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Got time bound points with size:" << time_bound_points.size());
495 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Got back_and_future points with size: "<<back_and_future.size());
497 std::vector<double> speed_limits;
498 std::vector<lanelet::BasicPoint2d> curve_points;
504 throw std::invalid_argument(
"Could not fit a spline curve along the trajectory!");
507 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Got fit");
508 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Speed_limits.size(): "<<speed_limits.size());
510 std::vector<lanelet::BasicPoint2d> all_sampling_points;
511 all_sampling_points.reserve(1 + curve_points.size() * 2);
513 std::vector<double> distributed_speed_limits;
514 distributed_speed_limits.reserve(1+ curve_points.size() * 2);
522 int current_speed_index = 0;
523 size_t total_point_size = curve_points.size();
525 double step_threshold_for_next_speed = (double)total_step_along_curve / (
double)total_point_size;
526 double scaled_steps_along_curve = 0.0;
527 std::vector<double> better_curvature;
528 better_curvature.reserve(1 + curve_points.size() * 2);
530 for (
size_t steps_along_curve = 0; steps_along_curve < total_step_along_curve; steps_along_curve++)
532 lanelet::BasicPoint2d p = (*fit_curve)(scaled_steps_along_curve);
533 all_sampling_points.push_back(p);
535 better_curvature.push_back(
c);
537 if((
double) steps_along_curve > step_threshold_for_next_speed)
539 step_threshold_for_next_speed += (double)total_step_along_curve / (
double)total_point_size;
540 current_speed_index++;
542 distributed_speed_limits.push_back(speed_limits[current_speed_index]);
543 scaled_steps_along_curve += 1.0 / total_step_along_curve;
546 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Got sampled points with size:" << all_sampling_points.size());
551 std::vector<double> ideal_speeds =
555 RCLCPP_DEBUG_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"Processed all points in computed fit");
556 std::vector<double> final_actual_speeds = constrained_speed_limits;
558 if (all_sampling_points.empty())
560 RCLCPP_WARN_STREAM(
rclcpp::get_logger(
"stop_controlled_intersection_tactical_plugin"),
"No trajectory points could be generated");
566 std::vector<lanelet::BasicPoint2d> future_basic_points(all_sampling_points.begin() + nearest_pt_index + 1,
567 all_sampling_points.end());
568 std::vector<double> future_speeds(final_actual_speeds.begin() + nearest_pt_index + 1,
569 final_actual_speeds.end());
570 std::vector<double> future_yaw(final_yaw_values.begin() + nearest_pt_index + 1,
571 final_yaw_values.end());
574 lanelet::BasicPoint2d cur_veh_point(state.x_pos_global, state.y_pos_global);
576 future_basic_points.insert(future_basic_points.begin(),
578 future_speeds.insert(future_speeds.begin(), state.longitudinal_vel);
579 future_yaw.insert(future_yaw.begin(), state.orientation);
587 std::vector<double> times;
590 if(lanelet::geometry::distance2d(future_basic_points.back(), points.back().point) <
epsilon_){
591 final_actual_speeds.back() = 0.0;
594 trajectory_utils::conversions::speed_to_time(downtracks, final_actual_speeds, ×);
597 std::vector<carma_planning_msgs::msg::TrajectoryPlanPoint> traj_points =
615#include "rclcpp_components/register_node_macro.hpp"
#define GET_MANEUVER_PROPERTY(mvr, property)
Macro definition to enable easier access to fields shared across the maneuver types.
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...
Class containing primary business logic for the Stop Controlled Intersection Tactical Plugin.
rcl_interfaces::msg::SetParametersResult parameter_update_callback(const std::vector< rclcpp::Parameter > ¶meters)
std::string stop_controlled_intersection_strategy_
bool get_availability()
Get the availability status of this plugin based on the current operating environment....
carma_wm::WorldModelConstPtr wm_
StopControlledIntersectionTacticalPlugin(const rclcpp::NodeOptions &options)
StopControlledIntersectionTacticalPluginConfig config_
std::vector< PointSpeedPair > maneuvers_to_points(const std::vector< carma_planning_msgs::msg::Maneuver > &maneuvers, const carma_wm::WorldModelConstPtr &wm, const carma_planning_msgs::msg::VehicleState &state)
Converts a set of requested stop controlled intersection maneuvers to point speed limit pairs.
std::vector< PointSpeedPair > create_case_two_speed_profile(const carma_wm::WorldModelConstPtr &wm, const carma_planning_msgs::msg::Maneuver &maneuver, std::vector< lanelet::BasicPoint2d > &route_geometry_points, double starting_speed)
Creates a speed profile according to case two of the stop controlled intersection,...
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::CallbackReturn on_configure_plugin() override
Method which is triggered when this plugin is moved from the UNCONFIGURED to INACTIVE states....
std::string get_version_id()
Returns the version id of this plugin.
std::vector< carma_planning_msgs::msg::TrajectoryPlanPoint > compose_trajectory_from_centerline(const std::vector< PointSpeedPair > &points, const carma_planning_msgs::msg::VehicleState &state, const rclcpp::Time &state_time)
Method converts a list of lanelet centerline points and current vehicle state into a usable list of t...
std::vector< PointSpeedPair > create_case_one_speed_profile(const carma_wm::WorldModelConstPtr &wm, const carma_planning_msgs::msg::Maneuver &maneuver, std::vector< lanelet::BasicPoint2d > &route_geometry_points, double starting_speed, const carma_planning_msgs::msg::VehicleState &states)
Creates a speed profile according to case one of the stop controlled intersection,...
std::vector< PointSpeedPair > create_case_three_speed_profile(const carma_wm::WorldModelConstPtr &wm, const carma_planning_msgs::msg::Maneuver &maneuver, std::vector< lanelet::BasicPoint2d > &route_geometry_points, double starting_speed)
Creates a speed profile according to case three of the stop controlled intersection,...
std::vector< double > moving_average_filter(const std::vector< double > input, int window_size, bool ignore_first_point=true)
Extremely simplie moving average filter.
void split_point_speed_pairs(const std::vector< PointSpeedPair > &points, std::vector< lanelet::BasicPoint2d > *basic_points, std::vector< double > *speeds)
Helper method to split a list of PointSpeedPair into separate point and speed lists.
int get_nearest_point_index(const std::vector< lanelet::BasicPoint2d > &points, const carma_planning_msgs::msg::VehicleState &state)
Returns the nearest point (in terms of cartesian 2d distance) to the provided vehicle pose in the pro...
std::unique_ptr< basic_autonomy::smoothing::SplineI > compute_fit(const std::vector< lanelet::BasicPoint2d > &basic_points)
Computes a spline based on the provided points.
int get_nearest_index_by_downtrack(const std::vector< lanelet::BasicPoint2d > &points, const carma_wm::WorldModelConstPtr &wm, double target_downtrack)
Returns the nearest "less than" point to the provided vehicle pose in the provided list by utilizing ...
std::vector< double > apply_speed_limits(const std::vector< double > speeds, const std::vector< double > speed_limits)
Applies the provided speed limits to the provided speeds such that each element is capped at its corr...
std::vector< carma_planning_msgs::msg::TrajectoryPlanPoint > trajectory_from_points_times_orientations(const std::vector< lanelet::BasicPoint2d > &points, const std::vector< double > ×, const std::vector< double > &yaws, rclcpp::Time startTime, const std::string &desired_controller_plugin)
Method combines input points, times, orientations, and an absolute start time to form a valid carma p...
double compute_curvature_at(const basic_autonomy::smoothing::SplineI &fit_curve, double step_along_the_curve)
Given the curvature fit, computes the curvature at the given step along the curve.
std::vector< PointSpeedPair > constrain_to_time_boundary(const std::vector< PointSpeedPair > &points, double time_span)
Reduces the input points to only those points that fit within the provided time boundary.
std::vector< PointSpeedPair > attach_past_points(const std::vector< PointSpeedPair > &points_set, std::vector< PointSpeedPair > future_points, const int nearest_pt_index, double back_distance)
Attaches back_distance length of points behind the future points.
void set_logger(rclcpp::Logger logger)
Replace the module-level logger used by all basic_autonomy functions.
rclcpp::Logger get_logger()
Return the module-level logger used by all basic_autonomy functions.
auto to_string(const UtmZone &zone) -> std::string
std::vector< double > compute_tangent_orientations(const lanelet::BasicLineString2d ¢erline)
Compute an approximate orientation for the vehicle at each point along the provided centerline.
std::vector< double > compute_arc_lengths(const std::vector< lanelet::BasicPoint2d > &data)
Compute the arc length at each point around the curve.
std::shared_ptr< const WorldModel > WorldModelConstPtr
lanelet::BasicPoint2d point
Stuct containing the algorithm configuration values for the StopControlledIntersectionTacticalPlugin.
double trajectory_time_length
int curvature_moving_average_window_size
double lateral_accel_limit
double curve_resample_step_size
double centerline_sampling_spacing
int speed_moving_average_window_size