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:

Regulated Pure Pursuit Parameters

desired_linear_vel

Type

Default

double

0.5

Description

The desired maximum linear velocity (m/s) to use.

lookahead_dist

Type

Default

double

0.6

Description

The lookahead distance (m) to use to find the lookahead point when use_velocity_scaled_lookahead_dist is false.

min_lookahead_dist

Type

Default

double

0.3

Description

The minimum lookahead distance (m) threshold when use_velocity_scaled_lookahead_dist is true.

max_lookahead_dist

Type

Default

double

0.9

Description

The maximum lookahead distance (m) threshold when use_velocity_scaled_lookahead_dist is true.

lookahead_time

Type

Default

double

1.5

Description

The time (s) to project the velocity by when use_velocity_scaled_lookahead_dist is true. Also known as the lookahead gain.

rotate_to_heading_angular_vel

Type

Default

double

1.8

Description

If use_rotate_to_heading is true, this is the angular velocity to use.

transform_tolerance

Type

Default

double

0.1

Description

The TF transform tolerance (s).

use_velocity_scaled_lookahead_dist

Type

Default

bool

false

Description

Whether to use the velocity scaled lookahead distances or constant lookahead_distance.

min_approach_linear_velocity

Type

Default

double

0.05

Description

The minimum velocity (m/s) threshold to apply when approaching the goal to ensure progress. Must be > 0.01.

approach_velocity_scaling_dist

Type

Default

double

0.6

Description

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

Default

bool

true

Description

Whether to enable collision detection.

max_allowed_time_to_collision_up_to_carrot

Type

Default

double

1.0

Description

The time (s) to project a velocity command forward to check for collisions when use_collision_detection is true. Pre-Humble, this was max_allowed_time_to_collision.

use_regulated_linear_velocity_scaling

Type

Default

bool

true

Description

Whether to use the regulated features for path curvature (e.g. slow on high curvature paths).

use_cost_regulated_linear_velocity_scaling

Type

Default

bool

true

Description

Whether to use the regulated features for proximity to obstacles (e.g. slow in close proximity to obstacles).

regulated_linear_scaling_min_radius

Type

Default

double

0.90

Description

The turning radius (m) for which the regulation features are triggered when use_regulated_linear_velocity_scaling is true. Remember, sharper turns have smaller radii.

regulated_linear_scaling_min_speed

Type

Default

double

0.25

Description

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

Default

bool

false

Description

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

Default

double

0.6

Description

Distance to look ahead on the path to detect curvature.

use_rotate_to_heading

Type

Default

bool

true

Description

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_heading and allow_reversing cannot be set to true at the same time as it would result in ambiguous situations.

allow_reversing

Type

Default

bool

false

Description

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_planner comes with the support of reversing. Checkout the Smac Planner to know more.

rotate_to_heading_min_angle

Type

Default

double

0.785

Description

The difference in the path orientation and the starting robot orientation (radians) to trigger a rotate in place, if use_rotate_to_heading is true.

max_angular_accel

Type

Default

double

3.2

Description

Maximum allowable angular acceleration (rad/s/s) while rotating to heading, if use_rotate_to_heading is true.

cancel_deceleration

Type

Default

double

3.2

Description

Linear deceleration (m/s/s) to apply when the goal is canceled.

max_robot_pose_search_dist

Type

Default

double

Local costmap max extent (max(width, height) / 2)

Description

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

Default

bool

false

Description

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_point topic similarly to /lookahead_point

Note: Needs use_fixed_curvature_lookahead to be true

Example

controller_server:
  ros__parameters:
    use_sim_time: True
    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
      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