当前位置: 首页 > news >正文

【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 主要有以下几类参数:

  1. 轨迹生成策略
    👉 控制“怎么生成一条轨迹”
  • 设置轨迹带上的点数、时间间隔、允许倒车吗?
  • 决定机器人是怎么在地图上“计划”一步一步走的。

常见参数:

  • teb_autosize: 自动调整轨迹点数量;
  • dt_ref: 时间间隔参考值;
  • allow_init_with_backwards_motion: 允许初始方向倒车。
  1. 运动性能相关
    👉 告诉规划器你这个机器人能跑多快、能转多快
  • 设置速度、加速度、转弯半径这些;
  • 太高的话轨迹太激进,太低就拖拉。

常见参数:

  • max_vel_x: 最大前进速度;
  • acc_lim_theta: 最大角加速度;
  • min_turning_radius: 最小转弯半径。
  1. 车底轮廓描述
    👉 告诉规划器你机器人长啥样,用来避障
  • 是圆的、长方形还是多边形?
  • 设置好了才知道碰没碰到障碍物。

常见参数:

  • footprint_model: 设置机器人外形;
  • 可选类型包括 point, circular, line, polygon
  1. 到达目标点的判断容差
    👉 多近才算“到了目标点”
  • 不可能精确 0 cm 到达,设置个容差,省得原地打转;
  • 还能设置“到了目标后要不要停下来”。

常见参数:

  • xy_goal_tolerance: x、y 方向的误差范围;
  • yaw_goal_tolerance: 角度的误差范围;
  • free_goal_vel: 允许到了目标点继续移动。
  1. 障碍物避障相关
    👉 告诉机器人:看到障碍要避开,保持距离
  • 设置安全距离;
  • 要不要考虑代价地图里的障碍。

常见参数:

  • min_obstacle_dist: 离障碍物最少多远;
  • inflation_dist: 周围“膨胀”区域;
  • include_costmap_obstacles: 是否考虑代价地图里的障碍物。
  1. 路径优化相关
    👉 怎么给路径“打分”然后不断优化
  • 想让路径更快、更安全,还是更顺滑?用权重控制;
  • 这个部分调得好不好,直接影响规划质量。

常见参数:

  • weight_time: 时间越短越好;
  • weight_obstacle: 尽量远离障碍;
  • weight_kinematics_nh: 考虑非完整性运动学(差速车就要开这个);
  • weight_viapoint: 优先贴近你设定的关键路径点。
  1. 多线规划相关(同伦类规划)
    👉 不只规划一条路径,尝试多种“走法”然后挑个最优的
  • 适合障碍复杂、岔路多的场景;
  • 比如前面有个大障碍,你可以左绕、右绕、原地掉头,不止一条路线。

常见参数:

  • 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

相关文章:

  • 概率多假设跟踪(PMHT):多目标跟踪中的概率软关联与高效跟踪算法解析
  • 继承的了解与学习
  • 使用 vcpkg 构建支持 HTTPS 的 libcurl 并解决常见链接错误
  • 【时时三省】(C语言基础)用do...while语句实现循环
  • Wireshark 搜索组合速查表
  • linux服务器命令行获取nvidia显卡SN的方法
  • 通过 winsw 把相关服务配置windows自启动
  • package.json 里面出现 workspace:*,关于工作区的解释
  • 文献总结:NIPS2023——车路协同自动驾驶感知中的时间对齐(FFNet)
  • 时序逻辑电路——序列检测器
  • 如何提高单元测试的覆盖率
  • PC主板及CPU ID 信息、笔记本电脑唯一 MAC地址获取
  • 目标检测综述
  • 深度解析生成对抗网络:原理、应用与未来趋势
  • 三维点拟合平面ransac c++
  • MCP 协议:AI 世界的 “USB-C 接口”,开启智能交互新时代
  • 管家婆财贸ERP BB095.销售单草稿自动填充组合品明细
  • Python 的 pip 命令详解,涵盖常用操作和高级用法
  • Vue 3.0 Composition API 与 Vue 2.x Options API 的区别
  • (论文阅读)RNNoise 基于递归神经网络的噪声抑制库
  • 快评|对华关税或“大幅下降”,市场压力之下特朗普“急于与中国达成协议”
  • 外媒:特朗普称或将“大幅降低”对中国的关税
  • 神二十航天员公布
  • 浦江观察|3.6亿元消费券,为上海餐饮业带来了什么?
  • 电影“名场面”被制成表情包在网站上传播,网站运营者被判赔5500元
  • 伊朗外长访华将会见哪些人?讨论哪些议题?外交部回应