Ask Your Question
0

TEB planner tuning help to follow a path strictly

asked 2020-02-14 04:56:18 -0600

madmax gravatar image

So what I am trying to do, is let the robot follow a global path very strictly.
I know this path doesn't make sense, as it's not taking the shortest route, etc, but let's just say it's like a street the robot has to follow.

My question is, if it is even possible to limit the planner in such a way, that it follows the path and doesn't take a shortcut.
I tried to enable via points and decreased the global plan lookahead but it doesn't affect planning at all.

Also when looking at the second gif, the robot moves back to the beginning of the path.
But for this case, I thought the planner is pruning the already passed global path with calling this function pruneGlobalPlan() , similar to dwb is doing it.

image description

image description

controller_frequency: 10.
controller_plugin_ids: ["FollowPath"]
controller_plugin_types: ["teb_local_planner::TebLocalPlannerROS"]
min_theta_velocity_threshold: 0.0001
min_x_velocity_threshold: 0.0001
min_y_velocity_threshold: 0.0001
FollowPath.acc_lim_theta: 3.
FollowPath.acc_lim_x: 2.
FollowPath.acc_lim_y: 0.
FollowPath.allow_init_with_backwards_motion: False
FollowPath.cmd_angle_instead_rotvel: False
FollowPath.complete_global_plan: True # true prevents the robot from ending the path early when it cross the end goal
FollowPath.costmap_converter_plugin: "costmap_converter::CostmapToPolygonsDBSMCCH"
FollowPath.costmap_converter_spin_thread: True
FollowPath.costmap_obstacles_behind_robot_dist: 1.0
FollowPath.delete_detours_backwards: True
FollowPath.detours_orientation_tolerance: 1.5708
FollowPath.dt_hysteresis: 0.05
FollowPath.dt_ref: 0.3
FollowPath.dynamic_obstacle_inflation_dist: 0.6
FollowPath.enable_homotopy_class_planning: True
FollowPath.enable_multithreading: True
FollowPath.exact_arc_length: False
FollowPath.feasibility_check_no_poses: 5
FollowPath.footprint_model.radius: 0.6
FollowPath.footprint_model.type: "circular"
FollowPath.force_reinit_new_goal_dist: 1.
FollowPath.free_goal_vel: False
FollowPath.global_plan_overwrite_orientation: True
FollowPath.global_plan_prune_distance: 2.0
FollowPath.h_signature_prescaler: 1.
FollowPath.h_signature_threshold: 0.1
FollowPath.include_costmap_obstacles: True
FollowPath.include_dynamic_obstacles: True
FollowPath.inflation_dist: 0.1
FollowPath.is_footprint_dynamic: False
FollowPath.legacy_obstacle_association: False
FollowPath.length_start_orientation_vector: 0.4
FollowPath.map_frame: "map"
FollowPath.max_global_plan_lookahead_dist: 0.5
FollowPath.max_number_classes: 5
FollowPath.max_ratio_detours_duration_best_duration: 3.
FollowPath.max_samples: 20
FollowPath.max_vel_theta: 1.
FollowPath.max_vel_x: 1.3
FollowPath.max_vel_x_backwards: 0.3
FollowPath.max_vel_y: 0.0
FollowPath.min_obstacle_dist: 0.1
FollowPath.min_resolution_collision_check_angular: 3.14159
FollowPath.min_samples: 3
FollowPath.min_turning_radius: 0.0
FollowPath.no_inner_iterations: 5
FollowPath.no_outer_iterations: 4
FollowPath.obstacle_association_cutoff_factor: 5.
FollowPath.obstacle_association_force_inclusion_factor: 1.5
FollowPath.obstacle_cost_exponent: 1.
FollowPath.obstacle_heading_threshold: 0.45
FollowPath.obstacle_keypoint_offset: 0.1
FollowPath.obstacle_poses_affected: 25
FollowPath.odom_topic: "odom"
FollowPath.optimization_activate: True
FollowPath.optimization_verbose: True
FollowPath.oscillation_filter_duration: 10.
FollowPath.oscillation_omega_eps: 0.1
FollowPath.oscillation_recovery: True
FollowPath.oscillation_recovery_min_duration: 10.
FollowPath.oscillation_v_eps: 0.1
FollowPath.penalty_epsilon: 0.1
FollowPath.publish_feedback: False
FollowPath.roadmap_graph_area_length_scale: 1.
FollowPath.roadmap_graph_area_width: 2.
FollowPath.roadmap_graph_samples: 15
FollowPath.selection_alternative_time_cost: False
FollowPath.selection_cost_hysteresis: 1.
FollowPath.selection_obst_cost_scale: 100.
FollowPath.selection_prefer_initial_plan: 0.95
FollowPath.selection_viapoint_cost_scale: 1.
FollowPath.shrink_horizon_backup: True
FollowPath.shrink_horizon_min_duration: 10.
FollowPath.simple_exploration: False
FollowPath.switching_blocking_period: 0.
FollowPath.teb_autosize: 1.
FollowPath.global_plan_viapoint_sep: 1. # If positive, via-points are extracted from the global plan (path-following mode). The value determines the resolution of the reference path (min. separation between each two consecutive via-points along the global plan, if negative: disabled). Refer to parameter weight_viapoint for adjusting the intensity.
FollowPath.via_points_ordered: True # If true, the planner adheres to the order of via-points in the storage container
FollowPath.viapoints_all_candidates: True
FollowPath.visualize_hc_graph: True
FollowPath.visualize_with_time_as_z_axis_scale: 0.
FollowPath.weight_acc_lim_theta: 1.
FollowPath ...
(more)
edit retag flag offensive close merge delete

1 Answer

Sort by » oldest newest most voted
1

answered 2020-02-14 11:00:51 -0600

I think TEB is fundamentally the incorrect technology choice if you want exact waypoint following. Implementing something like a pure pursuit (or "carrot") controller would be your better bet.

edit flag offensive delete link more

Comments

Well that‘s true. Maybe strict and exact is too heavy, it should prefer aligning to the plan. We also have a pure pursuit controller, but next step was to take some constraints into account and thought about an mpc controller. And the teb planner feels a bit like a mpc controller, with added planner and obstacle avoidance which would also be a nice feature. Replanning the global plan will be difficult, as it‘s coming from a remote server.

madmax gravatar imagemadmax ( 2020-02-14 12:15:03 -0600 )edit

I don't think you're going to get that here. You should look at DWB for something like that. Just a note though, if you tune any controller to be a nearly exact path follower, its not going to be able to handle dynamic obstacles well (or at all in some cases) since you've trained it not to deviate from the path.

I wouldn't consider that to be good behavior unless youre in a static environment, have a fast replanning rate, or need to navigate in very narrow places.

stevemacenski gravatar imagestevemacenski ( 2020-02-14 12:20:11 -0600 )edit

Thanks, I get your point. Not exactly sure about the DWB, cause I think it‘s also a „cost optimizer“ which is then tuned to follow the path. But to some this up, it looks like I need two local controllers. A „dumb“ controller which just follows the path and just stops if there is an obstacle on the path. And a planning controller to drive around obstacles if the road is blocked or in complete autonomous situations.

madmax gravatar imagemadmax ( 2020-02-14 14:50:40 -0600 )edit

that sounds reasonable.

If I've answered your question, can you hit the checkmark so its removed from our unanswered questions queue?

stevemacenski gravatar imagestevemacenski ( 2020-02-14 16:48:14 -0600 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2020-02-14 04:56:18 -0600

Seen: 14 times

Last updated: Feb 14