autoware_minimum_rule_based_planner#
Overview#
A minimum rule-based trajectory planner that generates safe and feasible trajectories for autonomous driving. It follows the planned route by constructing trajectories from lanelet centerline and applies multi-stage optimization for geometric smoothness, velocity profiles, and obstacle avoidance.
Features#
- Centerline-based path planning: Generates paths along lanelet centerline from the HD map, extending backward and forward from the ego vehicle's position
- Smooth goal connection: Refines the path near the goal pose for smooth stopping
- Path shifting: Shifts the centerline path to start from the ego vehicle's current pose, using curvature-aware shift distance calculation based on ego velocity and lateral acceleration limits
- Trajectory smoothing: Applies an Elastic Band smoother for geometric smoothing via a plugin interface
- Trajectory modification: Applies modifier plugins (e.g., obstacle stop) for safety modifications
- Velocity optimization: Computes a jerk-filtered velocity profile respecting constraints on acceleration, jerk, and lateral acceleration
- Test mode: Supports bypassing path planning by directly receiving a
PathWithLaneIdtopic
Inputs / Outputs#
Inputs#
| Topic | Type | Description |
|---|---|---|
~/input/route |
LaneletRoute |
Planned route |
~/input/vector_map |
LaneletMapBin |
HD map |
~/input/odometry |
Odometry |
Ego pose and velocity |
~/input/acceleration |
AccelWithCovarianceStamped |
Ego acceleration |
~/input/objects |
PredictedObjects |
Surrounding obstacles |
~/input/test/path_with_lane_id |
PathWithLaneId |
Test mode: bypasses path planning |
Outputs#
| Topic | Type | Description |
|---|---|---|
~/output/candidate_trajectories |
CandidateTrajectories |
Planned trajectory |
~/debug/path_with_lane_id |
PathWithLaneId |
Debug: planned path |
~/debug/trajectory |
Trajectory |
Debug: final output trajectory |
~/debug/shifted_trajectory |
Trajectory |
Debug: trajectory after path shifting |
~/debug/optimizer/{name}/trajectory |
Trajectory |
Debug: trajectory after each optimizer plugin |
~/debug/modifier/{name}/trajectory |
Trajectory |
Debug: trajectory after each modifier plugin |
~/debug/processing_time_detail_ms |
ProcessingTimeDetail |
Debug: processing time breakdown |
Parameters#
| Name | Type | Description | Default | Range |
|---|---|---|---|---|
| planning_frequency_hz | float | Planning loop frequency [Hz] | 10.0 | ≥0.0 |
| plugin_names | array | List of plugins to load | ['autoware::minimum_rule_based_planner::plugin::ObstacleStop', 'autoware::minimum_rule_based_planner::plugin::SurroundObstacleStop'] | N/A |
| path_length.backward | float | Path length behind ego [m] | 5.0 | ≥0.0 |
| path_length.forward | float | Path length ahead of ego [m] | 300.0 | ≥0.0 |
| smooth_goal_connection.search_radius_range | float | Search radius for goal connection [m] | 7.5 | ≥0.0 |
| smooth_goal_connection.pre_goal_offset | float | Offset before goal for smooth connection [m] | 1.0 | ≥0.0 |
| ego_nearest_lanelet.dist_threshold | float | Distance threshold for ego nearest lanelet [m] | 3.0 | ≥0.0 |
| ego_nearest_lanelet.yaw_threshold | float | Yaw threshold for ego nearest lanelet [rad] | 0.174533 | ≥0.0 |
| path_shift.enable | boolean | Enable path shifting to ego pose | True | N/A |
| path_shift.minimum_shift_length | float | Lateral offset threshold to trigger shift [m] | 0.5 | ≥0.0 |
| path_shift.minimum_shift_yaw | float | Yaw deviation threshold to trigger shift [rad] | 0.349 | ≥0.0 |
| path_shift.minimum_shift_distance | float | Floor for shift distance [m] | 5.0 | ≥0.0 |
| path_shift.min_speed_for_curvature | float | Lower bound on speed for curvature computation [m/s] | 2.77 | ≥0.0 |
| path_shift.lateral_accel_limit | float | Lateral acceleration limit for shift [m/s^2] | 1.0 | ≥0.0 |
| waypoint_group.separation_threshold | float | Max distance between waypoints in same group [m] | 1.0 | ≥0.0 |
| waypoint_group.interval_margin_ratio | float | IRatio to expand group interval by lateral distance | 10.0 | ≥0.0 |
| output.delta_arc_length | float | Resampling interval for path-to-trajectory conversion [m] | 0.5 | ≥0.0 |
| obstacle_stop.enable | boolean | Enable obstacle stop [m] | True | N/A |
| obstacle_stop.use_objects | boolean | Enable object detection [m] | True | N/A |
| obstacle_stop.use_pointcloud | boolean | Enable pointcloud detection [m] | True | N/A |
| obstacle_stop.enable_stop_for_objects | boolean | Enable stop for objects | True | N/A |
| obstacle_stop.enable_stop_for_pointcloud | boolean | Enable stop for pointcloud | False | N/A |
| obstacle_stop.stop_margin | float | Stop margin [m] | 6.0 | ≥0.0 |
| obstacle_stop.nominal_stopping_decel | float | Nominal stopping deceleration [m/s^2] | 1.0 | ≥0.0 |
| obstacle_stop.maximum_stopping_decel | float | Maximum stopping deceleration [m/s^2] | 4.0 | ≥0.0 |
| obstacle_stop.stopping_jerk | float | Stopping jerk [m/s^3] | 3.0 | ≥0.0 |
| obstacle_stop.on_time_buffer | float | On time buffer [s] | 0.5 | ≥0.0 |
| obstacle_stop.off_time_buffer | float | Off time buffer [s] | 1.0 | ≥0.0 |
| obstacle_stop.lateral_margin | float | Lateral margin [m] | 0.5 | ≥0.0 |
| obstacle_stop.arrived_distance_threshold | float | Threshold to check if the ego vehicle has arrived at the stop point [m] | 0.5 | ≥0.0 |
| objects.object_types | array | Object types | ['car', 'truck', 'bus', 'trailer', 'motorcycle', 'bicycle', 'pedestrian', 'hazard'] | N/A |
| objects.max_velocity_th | float | Max velocity threshold [m/s] | 1.0 | ≥0.0 |
| objects.stopped_velocity_th | float | Velocity threshold for target object to be considered as stopped [m/s] | 0.25 | ≥0.0 |
| objects.max_lateral_velocity_th | float | Maximum lateral velocity threshold for target object [m/s] | 1.0 | ≥0.0 ≤10.0 |
| objects.safety_buffer | float | Safety buffer to expand object shape [m] | 0.0 | ≥0.0 ≤10.0 |
| pointcloud.height_buffer | float | Height buffer [m] | 0.5 | ≥0.0 |
| pointcloud.min_height | float | Min height [m] | 0.2 | ≥0.0 |
| pointcloud.detection_range | float | Detection range [m] | 100.0 | ≥0.0 |
| voxel_grid_filter.x | float | X [m] | 0.2 | ≥0.0 |
| voxel_grid_filter.y | float | Y [m] | 0.2 | ≥0.0 |
| voxel_grid_filter.z | float | Z [m] | 0.2 | ≥0.0 |
| voxel_grid_filter.min_size | float | Min size | 3 | ≥0.0 |
| clustering.tolerance | float | Tolerance [m] | 0.5 | ≥0.0 |
| clustering.min_height | float | Min height [m] | 0.5 | ≥0.0 |
| clustering.min_size | float | Min size | 10 | ≥0.0 |
| clustering.max_size | float | Max size | 10000 | ≥0.0 |
| rss_params.enable | boolean | Enable RSS-based stop logic | True | N/A |
| object_decel.car | float | Deceleration for car type objects [m/s^2] | 1.5 | ≥0.0 |
| object_decel.truck | float | Deceleration for truck type objects [m/s^2] | 1.5 | ≥0.0 |
| object_decel.bus | float | Deceleration for bus type objects [m/s^2] | 1.5 | ≥0.0 |
| object_decel.trailer | float | Deceleration for trailer type objects [m/s^2] | 1.5 | ≥0.0 |
| object_decel.motorcycle | float | Deceleration for motorcycle type objects [m/s^2] | 3.0 | ≥0.0 |
| object_decel.bicycle | float | Deceleration for bicycle type objects [m/s^2] | 5.0 | ≥0.0 |
| object_decel.pedestrian | float | Deceleration for pedestrian type objects [m/s^2] | 5.0 | ≥0.0 |
| rss_params.ego_decel | float | Deceleration for ego vehicle used in RSS calculation [m/s^2] | 4.0 | ≥0.0 |
| rss_params.reaction_time | float | Reaction time used in RSS calculation [s] | 0.2 | ≥0.0 |
| rss_params.safety_margin | float | Safety margin used in RSS calculation [m] | 2.0 | ≥0.0 |
| rss_params.lookahead_horizon | float | Lookahead horizon used in RSS calculation [s] | 1.5 | ≥0.0 |
| surround_obstacle_stop.enable | boolean | Enable surround obstacle stop | True | N/A |
| surround_obstacle_stop.use_objects | boolean | Enable the use of objects for surround obstacle stop | True | N/A |
| surround_obstacle_stop.use_pointcloud | boolean | Enable the use of pointcloud for surround obstacle stop | False | N/A |
| surround_obstacle_stop.object_types | array | Types of objects to consider for surround obstacle stop | ['car', 'truck', 'bus', 'trailer', 'motorcycle', 'bicycle', 'pedestrian', 'hazard', 'animal', 'unknown'] | N/A |
| front_distance_th.car | float | Front surround check distance for car [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.truck | float | Front surround check distance for truck [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.bus | float | Front surround check distance for bus [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.trailer | float | Front surround check distance for trailer [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.motorcycle | float | Front surround check distance for motorcycle [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.bicycle | float | Front surround check distance for bicycle [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.pedestrian | float | Front surround check distance for pedestrian [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.hazard | float | Front surround check distance for hazard [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.animal | float | Front surround check distance for animal [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.unknown | float | Front surround check distance for unknown [m] | 0.5 | ≥0.0 ≤10.0 |
| front_distance_th.pointcloud | float | Front surround check distance for pointcloud [m] | 0.5 | ≥0.0 ≤10.0 |
| side_distance_th.car | float | Side surround check distance for car [m] | 0.0 | ≥0.0 ≤10.0 |
| side_distance_th.truck | float | Side surround check distance for truck [m] | 0.0 | ≥0.0 ≤10.0 |
| side_distance_th.bus | float | Side surround check distance for bus [m] | 0.0 | ≥0.0 ≤10.0 |
| side_distance_th.trailer | float | Side surround check distance for trailer [m] | 0.0 | ≥0.0 ≤10.0 |
| side_distance_th.motorcycle | float | Side surround check distance for motorcycle [m] | 1.0 | ≥0.0 ≤10.0 |
| side_distance_th.bicycle | float | Side surround check distance for bicycle [m] | 1.0 | ≥0.0 ≤10.0 |
| side_distance_th.pedestrian | float | Side surround check distance for pedestrian [m] | 1.0 | ≥0.0 ≤10.0 |
| side_distance_th.hazard | float | Side surround check distance for hazard [m] | 0.5 | ≥0.0 ≤10.0 |
| side_distance_th.animal | float | Side surround check distance for animal [m] | 0.5 | ≥0.0 ≤10.0 |
| side_distance_th.unknown | float | Side surround check distance for unknown [m] | 0.5 | ≥0.0 ≤10.0 |
| side_distance_th.pointcloud | float | Side surround check distance for pointcloud [m] | 0.5 | ≥0.0 ≤10.0 |
| back_distance_th.car | float | Back surround check distance for car [m] | 0.0 | ≥0.0 ≤10.0 |
| back_distance_th.truck | float | Back surround check distance for truck [m] | 0.0 | ≥0.0 ≤10.0 |
| back_distance_th.bus | float | Back surround check distance for bus [m] | 0.0 | ≥0.0 ≤10.0 |
| back_distance_th.trailer | float | Back surround check distance for trailer [m] | 0.0 | ≥0.0 ≤10.0 |
| back_distance_th.motorcycle | float | Back surround check distance for motorcycle [m] | 0.5 | ≥0.0 ≤10.0 |
| back_distance_th.bicycle | float | Back surround check distance for bicycle [m] | 0.5 | ≥0.0 ≤10.0 |
| back_distance_th.pedestrian | float | Back surround check distance for pedestrian [m] | 0.5 | ≥0.0 ≤10.0 |
| back_distance_th.hazard | float | Back surround check distance for hazard [m] | 0.5 | ≥0.0 ≤10.0 |
| back_distance_th.animal | float | Back surround check distance for animal [m] | 0.5 | ≥0.0 ≤10.0 |
| back_distance_th.unknown | float | Back surround check distance for unknown [m] | 0.5 | ≥0.0 ≤10.0 |
| back_distance_th.pointcloud | float | Back surround check distance for pointcloud [m] | 0.5 | ≥0.0 ≤10.0 |
| surround_obstacle_stop.hysteresis_distance | float | Distance hysteresis threshold for clearing surround stop [m] | 0.1 | ≥0.0 ≤10.0 |
| surround_obstacle_stop.hysteresis_time | float | Time hysteresis threshold for clearing surround stop [s] | 0.2 | ≥0.0 ≤10.0 |
| surround_obstacle_stop.ego_stopped_vel_th | float | Velocity threshold below which ego vehicle is considered stopped [m/s] | 0.1 | ≥0.0 ≤10.0 |
| velocity_smoother.nearest_dist_threshold_m | float | Nearest distance threshold [m] | 1.5 | ≥0.0 |
| velocity_smoother.nearest_yaw_threshold_deg | float | Nearest yaw threshold [deg] | 60.0 | ≥0.0 |
| velocity_smoother.target_pull_out_speed_mps | float | Target pull out speed [m/s] | 0.25 | ≥0.0 |
| velocity_smoother.target_pull_out_acc_mps2 | float | Target pull out acceleration [m/s^2] | 0.5 | ≥0.0 |
| velocity_smoother.max_speed_mps | float | Max speed [m/s] | 13.88 | ≥0.0 |
| velocity_smoother.max_lateral_accel_mps2 | float | Max lateral acceleration [m/s^2] | 1.5 | ≥0.0 |
| velocity_smoother.set_engage_speed | boolean | Set engage speed at start | True | N/A |
| velocity_smoother.limit_speed | boolean | Apply max speed limit | True | N/A |
| velocity_smoother.limit_lateral_acceleration | boolean | Apply max lateral acceleration limit | False | N/A |
| velocity_smoother.smooth_velocities | boolean | Apply jerk-filtered velocity smoothing | True | N/A |
| velocity_smoother.stop_dist_to_prohibit_engage | float | Stop distance to prohibit engage [m] | 0.5 | ≥0.0 |
| post_resample.max_trajectory_length | float | Max trajectory length for post-optimization resampling [m] | 300.0 | ≥0.0 |
| post_resample.min_trajectory_length | float | Minimum trajectory length for post-optimization resampling [m] | 30.0 | ≥0.0 |
| post_resample.resample_time | float | Resample total time [s] | 10.0 | ≥0.0 |
| post_resample.dense_resample_dt | float | Dense sampling time interval [s] | 0.1 | ≥0.0 |
| post_resample.dense_min_interval_distance | float | Dense sampling min interval [m] | 0.1 | ≥0.0 |
| post_resample.sparse_resample_dt | float | Sparse sampling time interval [s] | 0.1 | ≥0.0 |
| post_resample.sparse_min_interval_distance | float | Sparse sampling min interval [m] | 1.0 | ≥0.0 |
| debug.enable_path | boolean | Enable path debugging | True | N/A |
| debug.enable_shifted_trajectory | boolean | Enable shifted trajectory debugging | True | N/A |
| debug.enable_optimizer_trajectory | boolean | Enable optimizer trajectory debugging | True | N/A |
| debug.enable_modifier_trajectory | boolean | Enable modifier trajectory debugging | True | N/A |
| debug.enable_output_trajectory | boolean | Enable output trajectory debugging | True | N/A |
Parameters can be set via YAML configuration files in the config/ directory.
Jerk-filtered smoother parameters are defined in config/velocity_smoother/jerk_filtered_smoother.param.yaml.
EB smoother parameters are defined in config/trajectory_optimizer_plugins/elastic_band_smoother.param.yaml.