Regulated Pure Pursuit
Source code on Github.
The Regulated Pure Pursuit controller implements a variation on the Pure Pursuit controller that specifically targeting service / industrial robot needs. It regulates the linear velocities by curvature of the path to help reduce overshoot at high speeds around blind corners allowing operations to be much more safe. It also better follows paths than any other variation currently available of Pure Pursuit. It also has heuristics to slow in proximity to other obstacles so that you can slow the robot automatically when nearby potential collisions. It also implements the Adaptive lookahead point features to be scaled by velocities to enable more stable behavior in a larger range of translational speeds.
See the package's README for more complete information.
If you use the Regulated Pure Pursuit Controller algorithm or software from this repository, please cite this work in your papers:
- S. Macenski, S. Singh, F. Martin, J. Gines, Regulated Pure Pursuit for Robot Path Tracking. Autonomous Robots, 2023.
Regulated Pure Pursuit Parameters
desired_linear_vel
- Type:
doubleDefault:0.5 -
The desired maximum linear velocity (m/s) to use.
lookahead_dist
- Type:
doubleDefault:0.6 -
The lookahead distance (m) to use to find the lookahead point when
use_velocity_scaled_lookahead_distisfalse.
min_lookahead_dist
- Type:
doubleDefault:0.3 -
The minimum lookahead distance (m) threshold when
use_velocity_scaled_lookahead_dististrue.
max_lookahead_dist
- Type:
doubleDefault:0.9 -
The maximum lookahead distance (m) threshold when
use_velocity_scaled_lookahead_dististrue.
lookahead_time
- Type:
doubleDefault:1.5 -
The time (s) to project the velocity by when
use_velocity_scaled_lookahead_dististrue. Also known as the lookahead gain.
rotate_to_heading_angular_vel
- Type:
doubleDefault:1.8 -
If
use_rotate_to_headingistrue, this is the angular velocity to use.
transform_tolerance
- Type:
doubleDefault:0.1 -
The TF transform tolerance (s).
use_velocity_scaled_lookahead_dist
- Type:
boolDefault:false -
Whether to use the velocity scaled lookahead distances or constant
lookahead_distance.
min_approach_linear_velocity
- Type:
doubleDefault:0.05 -
The minimum velocity (m/s) threshold to apply when approaching the goal to ensure progress. Must be
> 0.01.
approach_velocity_scaling_dist
- Type:
doubleDefault:0.6 -
The distance (m) left on the path at which to start slowing down. Should be less than the half the costmap width.
use_collision_detection
- Type:
boolDefault:true -
Whether to enable collision detection.
max_allowed_time_to_collision_up_to_carrot
- Type:
doubleDefault:1.0 -
The time (s) to forward-simulate the current velocity command to check for collisions when
use_collision_detectionistrue. At each simulation step, the robot's footprint is projected forward by the costmap resolution. The simulation stops at whichever limit is reached first: this time limit or the carrot distance. If a collision is detected at any projected pose, the robot will stop. Whenmin_distance_to_obstacleis set, this time limit may be automatically extended to ensure the minimum obstacle distance can be checked at the current velocity. Pre-Humble, this wasmax_allowed_time_to_collision.
use_regulated_linear_velocity_scaling
- Type:
boolDefault:true -
Whether to use the regulated features for path curvature (e.g. slow on high curvature paths).
use_cost_regulated_linear_velocity_scaling
- Type:
boolDefault:true -
Whether to use the regulated features for proximity to obstacles (e.g. slow in close proximity to obstacles).
cost_scaling_dist
- Type:
doubleDefault:0.6 -
The minimum distance from an obstacle to trigger the scaling of linear velocity, if
use_cost_regulated_linear_velocity_scalingis enabled. The value set should be smaller or equal to theinflation_radiusset in the inflation layer of costmap, since inflation is used to compute the distance from obstacles.
cost_scaling_gain
- Type:
doubleDefault:1.0 -
A multiplier gain, which should be
<= 1.0, used to further scale the speed when an obstacle is withincost_scaling_dist. Lower value reduces speed more quickly.
regulated_linear_scaling_min_radius
- Type:
doubleDefault:0.9 -
The turning radius (m) for which the regulation features are triggered when
use_regulated_linear_velocity_scalingistrue. Remember, sharper turns have smaller radii.
regulated_linear_scaling_min_speed
- Type:
doubleDefault:0.25 -
The minimum speed (m/s) for which any of the regulated heuristics can send, to ensure process is still achievable even in high cost spaces with high curvature. Must be
> 0.1.
use_fixed_curvature_lookahead
- Type:
boolDefault:false -
Whether to use a fixed lookahead distance to compute curvature from. Since a lookahead distance may be set to vary on velocity, it can introduce a reference cycle that can be problematic for large lookahead distances.
curvature_lookahead_dist
- Type:
doubleDefault:0.6 -
Distance to look ahead on the path to detect curvature.
use_rotate_to_heading
- Type:
boolDefault:true -
Whether to enable rotating to rough heading and goal orientation when using holonomic planners. Recommended on for all robot types that can rotate in place.
- Note
- Both
use_rotate_to_headingandallow_reversingcannot be set totrueat the same time as it would result in ambiguous situations.
allow_reversing
- Type:
boolDefault:false -
Enables the robot to drive in the reverse direction, when the path planned involves reversing (which is represented by orientation cusps). Variants of the
smac_plannercomes with the support of reversing. Checkout the Smac Planner to know more.
rotate_to_heading_min_angle
- Type:
doubleDefault:0.785 -
The difference in the path orientation and the starting robot orientation (radians) to trigger a rotate in place, if
use_rotate_to_headingistrue.
max_angular_accel
- Type:
doubleDefault:3.2 -
Maximum allowable angular acceleration (rad/s/s) while rotating to heading, if
use_rotate_to_headingistrue.
use_cancel_deceleration
- Type:
boolDefault:false -
Whether to use deceleration when the goal is canceled.
cancel_deceleration
- Type:
doubleDefault:3.2 -
Linear deceleration (m/s/s) to apply when the goal is canceled.
max_robot_pose_search_dist
- Type:
doubleDefault: Local costmap max extent(max(width, height) / 2) -
Upper bound on integrated distance along the global plan to search for the closest pose to the robot pose. This should be left as the default unless there are paths with loops and intersections that do not leave the local costmap, in which case making this value smaller is necessary to prevent shortcutting. If set to
-1, it will use the maximum distance possible to search every point on the path for the nearest path point.
interpolate_curvature_after_goal
- Type:
boolDefault:false -
Interpolate a carrot after the goal dedicated to the curvate calculation (to avoid oscilaltions at the end of the path). For visualization, it will be published on the
/curvature_lookahead_pointtopic similarly to/lookahead_point- Note
- Needs
use_fixed_curvature_lookaheadto betrue
stateful
- Type:
boolDefault:true -
Enables stateful goal handling behavior. When set to
true, the controller will persist the goal state once the robot reaches the XY tolerance. It will then focus on aligning to the goal heading without reverting to XY position corrections.
Example
controller_server:
ros__parameters:
controller_frequency: 20.0
min_x_velocity_threshold: 0.001
min_y_velocity_threshold: 0.5
min_theta_velocity_threshold: 0.001
progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
goal_checker_plugins: ["goal_checker"]
controller_plugins: ["FollowPath"]
progress_checker:
plugin: "nav2_controller::SimpleProgressChecker"
required_movement_radius: 0.5
movement_time_allowance: 10.0
goal_checker:
plugin: "nav2_controller::SimpleGoalChecker"
xy_goal_tolerance: 0.25
yaw_goal_tolerance: 0.25
stateful: True
FollowPath:
plugin: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController"
desired_linear_vel: 0.5
lookahead_dist: 0.6
min_lookahead_dist: 0.3
max_lookahead_dist: 0.9
lookahead_time: 1.5
rotate_to_heading_angular_vel: 1.8
transform_tolerance: 0.1
use_velocity_scaled_lookahead_dist: false
min_approach_linear_velocity: 0.05
approach_velocity_scaling_dist: 0.6
use_collision_detection: true
max_allowed_time_to_collision_up_to_carrot: 1.0
use_regulated_linear_velocity_scaling: true
use_fixed_curvature_lookahead: false
curvature_lookahead_dist: 0.25
use_cost_regulated_linear_velocity_scaling: false
cost_scaling_dist: 0.3
cost_scaling_gain: 1.0
regulated_linear_scaling_min_radius: 0.9
regulated_linear_scaling_min_speed: 0.25
use_rotate_to_heading: true
allow_reversing: false
rotate_to_heading_min_angle: 0.785
max_angular_accel: 3.2
max_robot_pose_search_dist: 10.0
stateful: true