【ROS】TEB 规划器
【ROS】TEB 规划器
- 前言
- TEB 规划器概述
- 如何使用 TEB 规划器
- 安装 TEB 规划器
- 启用 TEB 规划器
- 示例:配置 TEB 规划器的启动文件
- TEB 参数说明
- TEB 参数文件示例 `teb_local_planner_params.yaml`
- TEB 规划器快速调参
- 在 RViz 中显示 TEB 的轨迹路径
前言
TEB 规划器是 ROS 导航中常用的一个局部路径规划器,它的名字叫“时间弹力带”。简单来说,它会在机器人前方的一小段路径上进行优化,让路径尽量避开障碍物、贴近全局路径,并考虑走这条路要花多少时间。
“弹力带”就像一根橡皮筋,全局路径把它拉住,障碍物推开它,TEB 就在这些力的作用下调整路径形状;而“时间”则代表它还会选择最快能走完的路径。
所以,TEB 规划器能让机器人走得既安全又高效,特别适合速度要求高的场景,比如竞速比赛。
我的环境:
本教程使用的环境是:实体 ROS 小车,Ubuntu 18.04,ROS1 Melodic
参考资料:
- ROS导航系统 | TEB规划器 | TEB Planner
- ROS Wiki - teb_local_planner
TEB 规划器概述
TEB(Timed Elastic Band)规划器是一种常用的第三方局部路径规划器,相比 DWA,它的优势在于考虑了时间因素,规划出的路径通常更快。它的核心思想是:在机器人当前局部范围内的全局路径基础上,综合考虑三个因素——障碍物的避让力(推开路径)、全局路径的引导力(拉近路径)以及通过路径所需的时间。就像一根“时间弹力带”,在推拉和时间的共同作用下,动态优化出一条既安全又高效的执行轨迹。
如何使用 TEB 规划器
安装 TEB 规划器
首先需要注意,TEB 规划器并不是 ROS 官方自带的局部规划器,它是一个第三方插件,因此在使用前需要手动安装。你可以使用以下命令进行安装(请根据你的 ROS 版本进行替换):
sudo apt install ros-<你的ROS版本>-teb-local-planner
例如,如果你使用的是 ROS Noetic,则命令为:
sudo apt install ros-noetic-teb-local-planner
启用 TEB 规划器
在 move_base 中启用 TEB(Timed Elastic Band)规划器同样非常简单,只需完成以下两步配置:
1. 指定使用 TEB 规划器
<param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS" />
这行代码告诉 move_base 使用 TEB 作为局部路径规划器。
2. 加载 TEB 规划器的参数文件
<rosparam file="$(find your_robot_navigation)/config/dwa_local_planner_params.yaml" command="load" />
这会将你设置好的 TEB 参数加载进 ROS 参数服务器中,确保规划器按照你的配置运行。
示例:配置 TEB 规划器的启动文件
下面是一个完整的 launch
文件示例,展示如何在 move_base
中集成 TEB 规划器:
<launch><node name="move_base" pkg="move_base" type="move_base" output="screen"><param name="base_global_planner" value="global_planner/GlobalPlanner" /><!-- 局部规划器配置:使用 TEB Planner--><param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS" /><rosparam file="$(find your_robot_navigation)/config/costmap_common_params.yaml" command="load" /><rosparam file="$(find your_robot_navigation)/config/global_costmap.yaml" command="load" /><rosparam file="$(find your_robot_navigation)/config/local_costmap.yaml" command="load" /><!-- 加载 TEB 规划器的参数文件 --><rosparam file="$(find your_robot_navigation)/config/teb_local_planner_params.yaml" command="load" /></node>
</launch>
配置完成后,move_base 就会使用你设定的 TEB 规划器参数进行本地路径规划和避障控制了。
TEB 参数说明
TEB 规划器包含大量可调参数,用于控制机器人轨迹生成、避障行为和路径优化效果。
完整参数解释可参考官方文档:ROS Wiki - teb_local_planner 的第 3.2 小节。
如果你想真正掌握如何调参,建议先大致了解 TEB 的算法原理。可以阅读该 Wiki 页首提到的论文,对规划器的工作方式有个整体认识,调参才会更有方向、更高效。
TEB 主要有以下几类参数:
- 轨迹生成策略
👉 控制“怎么生成一条轨迹”
- 设置轨迹带上的点数、时间间隔、允许倒车吗?
- 决定机器人是怎么在地图上“计划”一步一步走的。
常见参数:
teb_autosize
: 自动调整轨迹点数量;dt_ref
: 时间间隔参考值;allow_init_with_backwards_motion
: 允许初始方向倒车。
- 运动性能相关
👉 告诉规划器你这个机器人能跑多快、能转多快
- 设置速度、加速度、转弯半径这些;
- 太高的话轨迹太激进,太低就拖拉。
常见参数:
max_vel_x
: 最大前进速度;acc_lim_theta
: 最大角加速度;min_turning_radius
: 最小转弯半径。
- 车底轮廓描述
👉 告诉规划器你机器人长啥样,用来避障
- 是圆的、长方形还是多边形?
- 设置好了才知道碰没碰到障碍物。
常见参数:
footprint_model
: 设置机器人外形;- 可选类型包括
point
,circular
,line
,polygon
。
- 到达目标点的判断容差
👉 多近才算“到了目标点”
- 不可能精确 0 cm 到达,设置个容差,省得原地打转;
- 还能设置“到了目标后要不要停下来”。
常见参数:
xy_goal_tolerance
: x、y 方向的误差范围;yaw_goal_tolerance
: 角度的误差范围;free_goal_vel
: 允许到了目标点继续移动。
- 障碍物避障相关
👉 告诉机器人:看到障碍要避开,保持距离
- 设置安全距离;
- 要不要考虑代价地图里的障碍。
常见参数:
min_obstacle_dist
: 离障碍物最少多远;inflation_dist
: 周围“膨胀”区域;include_costmap_obstacles
: 是否考虑代价地图里的障碍物。
- 路径优化相关
👉 怎么给路径“打分”然后不断优化
- 想让路径更快、更安全,还是更顺滑?用权重控制;
- 这个部分调得好不好,直接影响规划质量。
常见参数:
weight_time
: 时间越短越好;weight_obstacle
: 尽量远离障碍;weight_kinematics_nh
: 考虑非完整性运动学(差速车就要开这个);weight_viapoint
: 优先贴近你设定的关键路径点。
- 多线规划相关(同伦类规划)
👉 不只规划一条路径,尝试多种“走法”然后挑个最优的
- 适合障碍复杂、岔路多的场景;
- 比如前面有个大障碍,你可以左绕、右绕、原地掉头,不止一条路线。
常见参数:
enable_homotopy_class_planning
: 开启多线规划;enable_multithreading
: 开多线程,提高效率;selection_cost_hysteresis
: 设置路径切换的“犹豫度”。
调参建议:
不要一开始就改很多参数,建议先用默认参数跑通基本导航。之后每次只调整一两个参数,观察机器的实际表现,再继续优化。
调参是一个逐步试错、反复微调的过程,慢慢来,效果更好也更稳。
TEB 参数文件示例 teb_local_planner_params.yaml
TebLocalPlannerROS:odom_topic: odom# 策略相关teb_autosize: True # 是否允许改变轨迹的时域长度,也就是改变 dt_refdt_ref: 0.5 # 路径上的两个相邻姿态的默认距离dt_hysteresis: 0.1 # 允许改变的时域解析度的浮动范围global_plan_overwrite_orientation: True # 是否修正全局路径中的临时局部路径各点的朝向max_global_plan_lookahead_dist: 2.0 # 最大向前看距离feasibility_check_no_poses: 2 # 在判断生成的轨迹是否冲突时使用,此时设置为2,即从轨迹起点开始逐个检查。# 运动相关max_vel_x: 0.4 # 最大速度max_vel_x_backwards: 0.2 # 最大倒车速度, 设置为0或者负数将导致错误。减少倒车应该修改倒车权重,不改这里。max_vel_theta: 1.0 # 最大转向角速度, 跟 min_turning_radius 相关 (r = v / omega)acc_lim_x: 0.5 # 最大线加速度acc_lim_theta: 1.0 # 最大角加速度# ************************ 转向半径相关 ************************min_turning_radius: 0.5 # 小转弯半径。如果设为0,表示可以原地转弯。wheelbase: 0.31 # 只有在 cmd_angle_instead_rotvel为true时才有效cmd_angle_instead_rotvel: False # 是否将收到的角速度消息转换为操作上的角度变化。设置成 True 时,话题是 vel_msg# ***************************************************# 车体轮廓footprint_model: # types可选项: "point", "circular", "two_circles", "line", "polygon"type: "circular"# 对 type "circular" 有效的参数:radius: 0.17# 对 type "line" 有效的参数:# line_start: [0.0, 0.0]# line_end: [0.35, 0.0]# 对 type "two_circles" 有效的参数:# front_offset: 0.35# front_radius: 0.35# rear_offset: 0.35# rear_radius: 0.35# 对 type "polygon" 有效的参数:# vertices: [ [0.35, 0.0], [-0.2, -0.25], [-0.2, 0.25] ]# 到达目标的判断容差xy_goal_tolerance: 0.2yaw_goal_tolerance: 0.1# 障碍物相关min_obstacle_dist: 0.1 # 与障碍物的最小距离inflation_dist: 0.4 # 障碍物膨胀距离include_costmap_obstacles: True # 是否检测动态障碍物costmap_obstacles_behind_robot_dist: 1.0 # 身后多远距离内障碍物加入检测范围obstacle_poses_affected: 25 # 障碍物对附近多少个关键点产生影响costmap_converter_plugin: "" # costmap_converter 插件名称,这里不使用# 路径优化相关no_inner_iterations: 3 # 图优化optimizer的迭代次数no_outer_iterations: 3 # 外循环迭代次数penalty_epsilon: 0.1 # 为所有的惩罚项增加一个小的安全余量weight_max_vel_x: 2 # 平移速度的优化权重weight_max_vel_theta: 1 # 角速度的优化权重weight_acc_lim_x: 1 # 平移加速度的优化权重weight_acc_lim_theta: 1 # 角加速度的优化权重weight_kinematics_nh: 1000 # 非完整运动学的优化权重weight_kinematics_forward_drive: 1 # 向前移动的权重weight_optimaltime: 1 # 耗时权重weight_obstacle: 50 # 与障碍物保持距离的权重# 多线规划enable_homotopy_class_planning: True # 激活多线规划enable_multithreading: True # 多线程计算max_number_classes: 2 # 规划的路径线数上限selection_cost_hysteresis: 1.0 # 路径轨迹筛选入选的评价上限selection_obst_cost_scale: 1.0 # 障碍物成本在入选标准中的缩放倍率selection_alternative_time_cost: False # 时间成本是否要进行平方计算roadmap_graph_no_samples: 15 # 为创建 roadmap graph 而生成的样本数roadmap_graph_area_width: 5 # 关键点采样的宽度,单位为米。# 注意:示例文件省略了其他可能的TEB参数,例如关于同伦类规划的更多参数,# 调试参数 (如 publish_robot_conf, publish_traj_details, etc.)# 以及其他权重参数。此输出仅包含图像中可见的部分。
TEB 规划器快速调参
在运行 TEB 规划器进行导航时,可以通过启动一个 rqt_reconfigure 节点来快速调整参数。使用以下指令启动:
rosrun rqt_reconfigure rqt_reconfigure
启动后,左侧选择 move_base
并选中 TebLocalPlannerROS
,在右侧即可动态调整参数。
调整完参数后,可以在 RViz 中观察导航效果,快速验证参数调整对导航的影响,提升调试效率。
在 RViz 中显示 TEB 的轨迹路径
为了在 RViz 中观察 TEB 规划器生成的实际执行的局部路径和想等,可以按照以下步骤进行设置:
1. 显示局部规划路径(即实际执行轨迹)
- 点击左下角的 “Add” 按钮;
- 添加 Path 类型;
- 设置订阅话题为:
/move_base/DWAPlannerROS/local_plan
; - 在样式中选择 Billboards(粗线条),这样轨迹显示更清晰。
2. 显示 TEB 预测的未来的位置
- 再次点击 “Add”;
- 添加 PoseArray 类型;
- 设置订阅话题为:
/move_base/TebLocalPlannerROS/teb_poses
。