Rotation Shim Controller
Source code on Github.
The nav2_rotation_shim_controller
will check the rough heading difference with respect to the robot and a newly received path. If within a threshold, it will pass the request onto the primary_controller
to execute the task. If it is outside of the threshold, this controller will rotate the robot in place towards that path heading. Once it is within the tolerance, it will then pass off control-execution from this rotation shim controller onto the primary controller plugin. At this point, the robot’s main plugin will take control for a smooth hand off into the task.
When the rotate_to_goal_heading
parameter is set to true, this controller is also able to take back control of the robot when reaching the XY goal tolerance of the goal checker. In this case, the robot will rotate towards the goal heading until the goal checker validate the goal and ends the current navigation task.
The RotationShimController
is most suitable for:
Robots that can rotate in place, such as differential and omnidirectional robots.
Preference to rotate in place when starting to track a new path that is at a significantly different heading than the robot’s current heading – or when tuning your controller for its task makes tight rotations difficult.
Using planners that are non-kinematically feasible, such as NavFn, Theta*, or Smac 2D (Feasible planners such as Smac Hybrid-A* and State Lattice will start search from the robot’s actual starting heading, requiring no rotation since their paths are guaranteed drivable by physical constraints).
See the package’s README
for more complete information.
Rotation Shim Controller Parameters
- angular_dist_threshold:
Type
Default
double
0.785
- Description
Maximum angular distance, in radians, away from the path heading to trigger rotation until within.
- forward_sampling_distance:
Type
Default
double
0.5
- Description
Forward distance, in meters, along path to select a sampling point to use to approximate path heading
- rotate_to_heading_angular_vel:
Type
Default
double
1.8
- Description
Angular rotational velocity, in rad/s, to rotate to the path heading
- primary_controller:
Type
Default
string
N/A
- Description
Internal controller plugin to use for actual control behavior after rotating to heading
- max_angular_accel:
Type
Default
double
3.2
- Description
Maximum angular acceleration for rotation to heading (rad/s/s)
- simulate_ahead_time:
Type
Default
double
1.0
- Description
Time in seconds to forward simulate a rotation command to check for collisions. If a collision is found, forwards control back to the primary controller plugin.
- rotate_to_goal_heading:
Type
Default
bool
false
- Description
If true, the rotationShimController will take back control of the robot when in XY tolerance of the goal and start rotating towards the goal heading.
- rotate_to_heading_once:
Type
Default
bool
false
- Description
If true, the rotationShimController will only rotate to heading once on a new goal, not each time a path is set.
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_rotation_shim_controller::RotationShimController"
primary_controller: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController"
angular_dist_threshold: 0.785
forward_sampling_distance: 0.5
rotate_to_heading_angular_vel: 1.8
max_angular_accel: 3.2
simulate_ahead_time: 1.0
rotate_to_goal_heading: false
# Primary controller params can be placed here below
# ...