15 #ifndef TRAFFIC_SIMULATOR__BEHAVIOR__FOLLOW_WAYPOINT_CONTROLLER_HPP_
16 #define TRAFFIC_SIMULATOR__BEHAVIOR__FOLLOW_WAYPOINT_CONTROLLER_HPP_
26 #include <traffic_simulator_msgs/msg/behavior_parameter.hpp>
27 #include <traffic_simulator_msgs/msg/entity_status.hpp>
28 #include <traffic_simulator_msgs/msg/polyline_trajectory.hpp>
32 namespace follow_trajectory
36 template <
typename... Ts>
39 "An error occurred in the internal controller operation in the FollowTrajectoryAction. ",
40 "Please report the following information to the developer: ",
41 std::forward<decltype(
xs)>(
xs)...))
81 template <
typename UpdateEntityStatusFunc,
typename DistanceA
longLaneletFunc>
83 const double step_acceleration,
const double step_time,
84 const UpdateEntityStatusFunc & update_entity_status,
85 const DistanceAlongLaneletFunc & distance_along_lanelet) ->
void
87 const auto current_speed = entity_status_.action_status.twist.linear.x;
88 const auto desired_speed = current_speed + step_acceleration * step_time;
91 const auto desired_velocity = [&]() {
95 return geometry_msgs::build<geometry_msgs::msg::Vector3>()
96 .x(std::cos(-euler.y) * std::cos(euler.z) * desired_speed)
97 .y(std::cos(-euler.y) * std::sin(euler.z) * desired_speed)
98 .z(std::sin(-euler.y) * desired_speed);
100 const auto position_before_update = entity_status_.pose.position;
101 entity_status_ = update_entity_status(entity_status_, desired_velocity);
103 distance_along_lanelet(position_before_update, entity_status_.pose.position);
105 entity_status_.action_status.twist.linear.x = desired_speed;
106 entity_status_.action_status.accel.linear.x = (desired_speed - current_speed) / step_time;
114 return entity_status_;
116 auto getSpeed() const ->
double {
return entity_status_.action_status.twist.linear.x; }
117 auto getAcceleration() const ->
double {
return entity_status_.action_status.accel.linear.x; }
121 return std::abs(entity_status_.action_status.twist.linear.x) < tolerance &&
122 std::abs(entity_status_.action_status.accel.linear.x) < tolerance;
131 const double step_time;
132 const bool with_braking;
134 const double max_speed;
135 const double max_acceleration;
136 const double max_acceleration_rate;
137 const double max_deceleration;
138 const double max_deceleration_rate;
140 const double target_speed;
149 static constexpr
double step_time_tolerance = 1e-6;
159 static constexpr
double predicted_distance_tolerance = 1.0;
168 static constexpr std::size_t number_of_acceleration_candidates = 30;
173 template <
typename StreamType>
176 stream << std::setprecision(16) << std::fixed;
177 stream <<
"FollowWaypointController: step_time: " << c.step_time
178 <<
", with_braking: " << c.with_braking <<
", max_speed: " << c.max_speed
179 <<
", max_acceleration: " << c.max_acceleration
180 <<
", max_deceleration: " << c.max_deceleration
181 <<
", max_acceleration_rate: " << c.max_acceleration_rate
182 <<
", max_deceleration_rate: " << c.max_deceleration_rate
183 <<
", target_speed: " << c.target_speed <<
". ";
219 auto getAnalyticalAccelerationForLastSteps(
220 const double remaining_time,
const double remaining_distance,
const double acceleration,
221 const double speed)
const -> double;
229 auto roundTimeToFullStepsWithTolerance(
230 const double remaining_time_source,
const double time_tolerance)
const -> double;
238 auto getTimeRequiredForNonAcceleration(
const double acceleration)
const -> double;
264 auto getAccelerationLimits(
const double acceleration,
const double speed)
const
265 -> std::pair<double, double>;
267 auto clampAcceleration(
268 const double candidate_acceleration,
const double acceleration,
const double speed)
const
271 auto getPredictedStopEntityStatusWithoutConsideringTime(
272 const double step_acceleration,
const double remaining_distance,
276 update_entity_status,
279 distance_along_lanelet)
const -> std::optional<PredictedEntityStatus>;
301 const traffic_simulator_msgs::msg::BehaviorParameter & behavior_parameter,
302 const double step_time,
const bool with_braking,
303 const std::optional<double> & target_speed = std::nullopt)
304 : step_time{step_time},
305 with_braking{with_braking},
306 max_speed{behavior_parameter.dynamic_constraints.max_speed},
307 max_acceleration{behavior_parameter.dynamic_constraints.max_acceleration},
308 max_acceleration_rate{behavior_parameter.dynamic_constraints.max_acceleration_rate},
309 max_deceleration{behavior_parameter.dynamic_constraints.max_deceleration},
310 max_deceleration_rate{behavior_parameter.dynamic_constraints.max_deceleration_rate},
311 target_speed{(target_speed) ? target_speed.value() : max_speed}
409 const double current_speed,
const double target_speed,
const double acceleration_rate)
const
416 const traffic_simulator_msgs::msg::PolylineTrajectory & polyline_trajectory)
const
419 if (
const auto & vertices = polyline_trajectory.shape.vertices; !vertices.empty()) {
420 std::stringstream waypoint_details;
421 waypoint_details <<
"Currently followed waypoint: ";
422 if (
const auto first_waypoint_with_arrival_time_specified = std::find_if(
423 vertices.begin(), vertices.end(),
424 [](
const auto & vertex) { return std::isfinite(vertex.time); });
425 first_waypoint_with_arrival_time_specified !=
426 std::end(polyline_trajectory.shape.vertices)) {
427 waypoint_details <<
"[" << first_waypoint_with_arrival_time_specified->position.position.x
428 <<
", " << first_waypoint_with_arrival_time_specified->position.position.y
429 <<
"] with specified time equal to "
430 << first_waypoint_with_arrival_time_specified->time <<
"s. ";
432 waypoint_details <<
"[" << vertices.back().position.position.x <<
", "
433 << vertices.back().position.position.y <<
"] without specified time. ";
435 return waypoint_details.str();
437 return "No followed waypoint - trajectory is empty.";
446 const double step_acceleration,
const double remaining_time,
const double remaining_distance,
450 update_entity_status,
453 distance_along_lanelet)
const -> std::optional<PredictedEntityStatus>;
460 const double remaining_distance,
464 update_entity_status,
467 distance_along_lanelet)
const -> double;
474 const double remaining_time_source,
const double remaining_distance,
478 update_entity_status,
481 distance_along_lanelet)
const -> double;
484 const double acceleration,
const double speed,
const double distance)
const ->
double
Definition: follow_waypoint_controller.hpp:130
auto accelerationWithJerkConstraint(const double current_speed, const double target_speed, const double acceleration_rate) const -> double
Calculate the optimal acceleration for a single discrete step to reach a desired target speed while r...
Definition: follow_waypoint_controller.cpp:129
friend auto operator<<(StreamType &stream, const FollowWaypointController &c) -> StreamType &
Definition: follow_waypoint_controller.hpp:174
auto getAcceleration(const double remaining_distance, const traffic_simulator_msgs::msg::EntityStatus &entity_status, const std::function< traffic_simulator_msgs::msg::EntityStatus(const traffic_simulator_msgs::msg::EntityStatus &, const geometry_msgs::msg::Vector3 &)> &update_entity_status, const std::function< double(const geometry_msgs::msg::Point &, const geometry_msgs::msg::Point &)> &distance_along_lanelet) const -> double
Definition: follow_waypoint_controller.cpp:350
static constexpr double local_epsilon
Definition: follow_waypoint_controller.hpp:298
static constexpr double remaining_distance_tolerance
Definition: follow_waypoint_controller.hpp:289
auto getFollowedWaypointDetails(const traffic_simulator_msgs::msg::PolylineTrajectory &polyline_trajectory) const -> std::string
Definition: follow_waypoint_controller.hpp:415
auto areConditionsOfArrivalMet(const double acceleration, const double speed, const double distance) const -> double
Definition: follow_waypoint_controller.hpp:483
constexpr FollowWaypointController(const traffic_simulator_msgs::msg::BehaviorParameter &behavior_parameter, const double step_time, const bool with_braking, const std::optional< double > &target_speed=std::nullopt)
Definition: follow_waypoint_controller.hpp:300
auto getPredictedWaypointArrivalState(const double step_acceleration, const double remaining_time, const double remaining_distance, const traffic_simulator_msgs::msg::EntityStatus &entity_status, const std::function< traffic_simulator_msgs::msg::EntityStatus(const traffic_simulator_msgs::msg::EntityStatus &, const geometry_msgs::msg::Vector3 &)> &update_entity_status, const std::function< double(const geometry_msgs::msg::Point &, const geometry_msgs::msg::Point &)> &distance_along_lanelet) const -> std::optional< PredictedEntityStatus >
Definition: follow_waypoint_controller.cpp:238
auto concatenate
Definition: concatenate.hpp:27
Definition: concatenate.hpp:24
auto convertQuaternionToEulerAngle(const T &q)
Definition: quaternion_to_euler.hpp:30
auto distance(const geometry_msgs::Pose &pose1, const geometry_msgs::Pose &pose2)
Definition: detection_sensor.cpp:45
Definition: lanelet_wrapper.hpp:40
geometry_msgs::msg::Point Point
Definition: lanelet_wrapper.hpp:65
geometry_msgs::msg::Vector3 Vector3
Definition: lanelet_wrapper.hpp:70
Definition: operators.hpp:25
traffic_simulator_msgs::msg::EntityStatus EntityStatus
Definition: entity_status.hpp:25
Definition: junit5.hpp:25
std::string string
Definition: junit5.hpp:26
traffic_simulator_msgs::EntityStatus EntityStatus
Definition: helper_functions.hpp:32
Definition: exception.hpp:27
Definition: follow_waypoint_controller.hpp:35
ControllerError(Ts &&... xs)
Definition: follow_waypoint_controller.hpp:37
Definition: follow_waypoint_controller.hpp:47
auto getSpeed() const -> double
Definition: follow_waypoint_controller.hpp:116
double travel_time
Definition: follow_waypoint_controller.hpp:53
auto getAcceleration() const -> double
Definition: follow_waypoint_controller.hpp:117
double traveled_distance
Definition: follow_waypoint_controller.hpp:52
PredictedEntityStatus(const traffic_simulator_msgs::msg::EntityStatus &status, const double traveled_distance, const double travel_time)
Definition: follow_waypoint_controller.hpp:60
auto step(const double step_acceleration, const double step_time, const UpdateEntityStatusFunc &update_entity_status, const DistanceAlongLaneletFunc &distance_along_lanelet) -> void
Advance simulation by one time step with given acceleration.
Definition: follow_waypoint_controller.hpp:82
auto isImmobile(const double tolerance) const -> bool
Definition: follow_waypoint_controller.hpp:119
static constexpr bool use_distance_along_lanelet
Definition: follow_waypoint_controller.hpp:50
auto getEntityStatus() const -> const traffic_simulator_msgs::msg::EntityStatus &
Definition: follow_waypoint_controller.hpp:112
PredictedEntityStatus(const traffic_simulator_msgs::msg::EntityStatus &status)
Definition: follow_waypoint_controller.hpp:55