15 #ifndef NAV2_REGULATED_PURE_PURSUIT_CONTROLLER__REGULATION_FUNCTIONS_HPP_
16 #define NAV2_REGULATED_PURE_PURSUIT_CONTROLLER__REGULATION_FUNCTIONS_HPP_
24 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
25 #include "nav2_util/geometry_utils.hpp"
26 #include "nav2_regulated_pure_pursuit_controller/parameter_handler.hpp"
28 namespace nav2_regulated_pure_pursuit_controller
41 inline double curvatureConstraint(
42 const double raw_linear_vel,
const double curvature,
const double min_radius)
44 const double radius = fabs(1.0 / curvature);
45 if (radius < min_radius) {
46 return raw_linear_vel * (1.0 - (fabs(radius - min_radius) / min_radius));
48 return raw_linear_vel;
60 inline double costConstraint(
61 const double raw_linear_vel,
62 const double pose_cost,
63 std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros,
68 if (pose_cost !=
static_cast<double>(NO_INFORMATION) &&
69 pose_cost !=
static_cast<double>(FREE_SPACE))
71 const double & inscribed_radius = costmap_ros->getLayeredCostmap()->getInscribedRadius();
73 const double min_distance_to_obstacle =
74 (params->inflation_cost_scaling_factor * inscribed_radius - log(pose_cost) + log(253.0f)) /
75 params->inflation_cost_scaling_factor;
77 if (min_distance_to_obstacle < params->cost_scaling_dist) {
78 return raw_linear_vel *
79 (params->cost_scaling_gain * min_distance_to_obstacle / params->cost_scaling_dist);
83 return raw_linear_vel;
92 inline double approachVelocityScalingFactor(
93 const nav_msgs::msg::Path & transformed_path,
94 const double approach_velocity_scaling_dist)
96 using namespace nav2_util::geometry_utils;
100 const double remaining_distance = calculate_path_length(transformed_path);
101 if (remaining_distance < approach_velocity_scaling_dist) {
102 auto & last = transformed_path.poses.back();
105 return std::hypot(last.pose.position.x, last.pose.position.y) / approach_velocity_scaling_dist;
119 inline double approachVelocityConstraint(
120 const double constrained_linear_vel,
121 const nav_msgs::msg::Path & path,
122 const double min_approach_velocity,
123 const double approach_velocity_scaling_dist)
125 double velocity_scaling = approachVelocityScalingFactor(path, approach_velocity_scaling_dist);
126 double approach_vel = constrained_linear_vel * velocity_scaling;
128 if (approach_vel < min_approach_velocity) {
129 approach_vel = min_approach_velocity;
132 return std::min(constrained_linear_vel, approach_vel);