Carma-platform v4.2.0
CARMA Platform is built on robot operating system (ROS) and utilizes open source software (OSS) that enables Cooperative Driving Automation (CDA) features to allow Automated Driving Systems to interact and cooperate with infrastructure and other vehicles through communication.
platooning_tactical_plugin.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018-2022 LEIDOS.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 * License for the specific language governing permissions and limitations under
13 * the License.
14 */
15
17
18#include <string>
19#include <algorithm>
20#include <memory>
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>
26#include <sstream>
27#include <chrono>
28#include <carma_ros2_utils/containers/containers.hpp>
29#include <Eigen/Core>
30#include <Eigen/Geometry>
31#include <Eigen/LU>
32#include <Eigen/SVD>
33#include <unordered_set>
34
35using oss = std::ostringstream;
36
38{
40 std::shared_ptr<carma_ros2_utils::timers::TimerFactory> timer_factory)
41 : wm_(wm), config_(config), timer_factory_(timer_factory)
42{}
43
44bool PlatooningTacticalPlugin::plan_trajectory_cb(carma_planning_msgs::srv::PlanTrajectory::Request& req,
45 carma_planning_msgs::srv::PlanTrajectory::Response& resp)
46{
47 auto start_time = std::chrono::high_resolution_clock::now(); // Start timing the execution time for planning so it can be logged
48
49 lanelet::BasicPoint2d veh_pos(req.vehicle_state.x_pos_global, req.vehicle_state.y_pos_global);
50 double current_downtrack = wm_->routeTrackPos(veh_pos).downtrack;
51
52 // Only plan the trajectory for the initial LANE_FOLLOWING maneuver and any immediately sequential maneuvers of the same type
53 std::vector<carma_planning_msgs::msg::Maneuver> maneuver_plan;
54 for(size_t i = req.maneuver_index_to_plan; i < req.maneuver_plan.maneuvers.size(); i++)
55 {
56 if(req.maneuver_plan.maneuvers[i].type == carma_planning_msgs::msg::Maneuver::LANE_FOLLOWING)
57 {
58 if (req.maneuver_plan.maneuvers[i].lane_following_maneuver.parameters.negotiation_type != carma_planning_msgs::msg::ManeuverParameters::NO_NEGOTIATION)
59 {
60 maneuver_plan.push_back(req.maneuver_plan.maneuvers[i]);
61 resp.related_maneuvers.push_back(i);
62 }
63 }
64 else
65 {
66 break;
67 }
68 }
69
72
76
85
86 auto points_and_target_speeds = basic_autonomy::waypoint_generation::create_geometry_profile(maneuver_plan, std::max((double)0, current_downtrack - config_.back_distance),
87 wm_, ending_state_before_buffer_, req.vehicle_state, wpg_general_config, wpg_detail_config);
88
89 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_tactical_plugin"), "points_and_target_speeds: " << points_and_target_speeds.size());
90
91 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_tactical_plugin"), "PlanTrajectory");
92
93 carma_planning_msgs::msg::TrajectoryPlan original_trajectory;
94 original_trajectory.header.frame_id = "map";
95 original_trajectory.header.stamp = timer_factory_->now();
96 original_trajectory.trajectory_id = boost::uuids::to_string(boost::uuids::random_generator()());
97 original_trajectory.trajectory_points = basic_autonomy:: waypoint_generation::compose_lanefollow_trajectory_from_path(points_and_target_speeds,
98 req.vehicle_state, req.header.stamp, wm_, ending_state_before_buffer_, debug_msg_,
99 wpg_detail_config); // Compute the trajectory
100 original_trajectory.initial_longitudinal_velocity = std::max(req.vehicle_state.longitudinal_vel, config_.minimum_speed);
101
102 resp.trajectory_plan = original_trajectory;
103
104 if (config_.publish_debug) { // Publish the debug message if in debug logging mode
105 debug_msg_.trajectory_plan = resp.trajectory_plan;
107 }
108
109 resp.maneuver_status.push_back(carma_planning_msgs::srv::PlanTrajectory::Response::MANEUVER_IN_PROGRESS);
110
111 auto end_time = std::chrono::high_resolution_clock::now(); // Planning complete
112
113 auto nano_s = std::chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time);
114 RCLCPP_DEBUG_STREAM(rclcpp::get_logger("platooning_tactical_plugin"), "ExecutionTime: " << ((double)nano_s.count() * 1e9));
115
116 return true;
117
118}
119
121{
122 config_ = config;
123}
124
125} // namespace platooning_tactical_plugin
carma_planning_msgs::msg::VehicleState ending_state_before_buffer_
carma_debug_ros2_msgs::msg::TrajectoryCurvatureSpeeds debug_msg_
std::shared_ptr< carma_ros2_utils::timers::TimerFactory > timer_factory_
PlatooningTacticalPlugin(carma_wm::WorldModelConstPtr wm, PlatooningTacticalPluginConfig config, std::shared_ptr< carma_ros2_utils::timers::TimerFactory > timer_factory)
Constructor.
void set_config(PlatooningTacticalPluginConfig config)
Set the current config.
bool plan_trajectory_cb(carma_planning_msgs::srv::PlanTrajectory::Request &req, carma_planning_msgs::srv::PlanTrajectory::Response &resp)
Service callback for trajectory planning.
std::ostringstream oss
GeneralTrajConfig compose_general_trajectory_config(const std::string &trajectory_type, int default_downsample_ratio, int turn_downsample_ratio)
DetailedTrajConfig compose_detailed_trajectory_config(double trajectory_time_length, double curve_resample_step_size, double minimum_speed, double max_accel, double lateral_accel_limit, int speed_moving_average_window_size, int curvature_moving_average_window_size, double back_distance, double buffer_ending_downtrack, std::string desired_controller_plugin="default")
std::vector< PointSpeedPair > create_geometry_profile(const std::vector< carma_planning_msgs::msg::Maneuver > &maneuvers, double max_starting_downtrack, const carma_wm::WorldModelConstPtr &wm, carma_planning_msgs::msg::VehicleState &ending_state_before_buffer, const carma_planning_msgs::msg::VehicleState &state, const GeneralTrajConfig &general_config, const DetailedTrajConfig &detailed_config)
Creates geometry profile to return a point speed pair struct for LANE FOLLOW and LANE CHANGE maneuver...
std::vector< carma_planning_msgs::msg::TrajectoryPlanPoint > compose_lanefollow_trajectory_from_path(const std::vector< PointSpeedPair > &points, const carma_planning_msgs::msg::VehicleState &state, const rclcpp::Time &state_time, const carma_wm::WorldModelConstPtr &wm, const carma_planning_msgs::msg::VehicleState &ending_state_before_buffer, carma_debug_ros2_msgs::msg::TrajectoryCurvatureSpeeds &debug_msg, const DetailedTrajConfig &detailed_config)
Method converts a list of lanelet centerline points and current vehicle state into a usable list of t...
auto to_string(const UtmZone &zone) -> std::string
Definition: utm_zone.cpp:21
std::shared_ptr< const WorldModel > WorldModelConstPtr
Definition: WorldModel.hpp:452
Stuct containing the algorithm configuration values for the PlatooningTacticalPlugin.