15 #ifndef NAV2_REGULATED_PURE_PURSUIT_CONTROLLER__REGULATION_FUNCTIONS_HPP_
16 #define NAV2_REGULATED_PURE_PURSUIT_CONTROLLER__REGULATION_FUNCTIONS_HPP_
24 #include "rclcpp/rclcpp.hpp"
25 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
26 #include "nav2_util/geometry_utils.hpp"
27 #include "nav2_regulated_pure_pursuit_controller/parameter_handler.hpp"
29 namespace nav2_regulated_pure_pursuit_controller
42 inline double curvatureConstraint(
43 const double raw_linear_vel,
const double curvature,
const double min_radius)
45 const double radius = fabs(1.0 / curvature);
46 if (radius < min_radius) {
47 return raw_linear_vel * (1.0 - (fabs(radius - min_radius) / min_radius));
49 return raw_linear_vel;
61 inline double costConstraint(
62 const double raw_linear_vel,
63 const double pose_cost,
64 std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros,
69 if (pose_cost !=
static_cast<double>(NO_INFORMATION) &&
70 pose_cost !=
static_cast<double>(FREE_SPACE))
72 const double & inscribed_radius = costmap_ros->getLayeredCostmap()->getInscribedRadius();
74 const double min_distance_to_obstacle =
75 (params->inflation_cost_scaling_factor * inscribed_radius - log(pose_cost) + log(253.0f)) /
76 params->inflation_cost_scaling_factor;
78 if (min_distance_to_obstacle < params->cost_scaling_dist) {
79 return raw_linear_vel *
80 (params->cost_scaling_gain * min_distance_to_obstacle / params->cost_scaling_dist);
84 return raw_linear_vel;
93 inline double approachVelocityScalingFactor(
94 const nav_msgs::msg::Path & transformed_path,
95 const double approach_velocity_scaling_dist)
97 using namespace nav2_util::geometry_utils;
101 const double remaining_distance = calculate_path_length(transformed_path);
102 if (remaining_distance < approach_velocity_scaling_dist) {
103 auto & last = transformed_path.poses.back();
106 return std::hypot(last.pose.position.x, last.pose.position.y) / approach_velocity_scaling_dist;
120 inline double approachVelocityConstraint(
121 const double constrained_linear_vel,
122 const nav_msgs::msg::Path & path,
123 const double min_approach_velocity,
124 const double approach_velocity_scaling_dist)
126 double velocity_scaling = approachVelocityScalingFactor(path, approach_velocity_scaling_dist);
127 double approach_vel = constrained_linear_vel * velocity_scaling;
129 if (approach_vel < min_approach_velocity) {
130 approach_vel = min_approach_velocity;
133 return std::min(constrained_linear_vel, approach_vel);