本篇博客属于网上收集的笔记,大部分内容不是原创
所有的参考的文章都会在下面贴出来啦
我只是进行收集、总结、运用,后期可能会加入自己调试参数的效果
目录
一、ROS - teb_local_planner 参数总结
TEB 的参数调试:
二、TEB Local Planner的特性与参数调试技巧总结
TEB规划器的性能问题的总结参考
TEB Local Planner的重要特点和缺点
TEB Local Planner的参数调试方法
惩罚权重配置
TEB中的恢复措施
Costmap Converter
Local Costmap 配置指导
关于多路径并行规划(Parallel Planning in distinctive Topologies)
三、teb_local_planner安装及使用
四、ROS下阿克曼转向结构车型导航应用实践(teb_local_planner)
修改teb_local_planner_params.yaml中的内容
原文链接:ROS - teb_local_planner 参数总结
这篇文章主要是参照官网的教程进行调试和总结的:
安装teb_local_planner:
sudo apt-get install ros-kinetic-teb-local-planner
sudo apt-get install ros-kinetic-teb-local-planner-tutorials
观察单个轨迹的仿真(观察参数对于路径规划上的影响),启动节点和rviz:
rosparam set /test_optim_node/enable_homotopy_class_planning True
roslaunch teb_local_planner test_optim_node.launch
启动参数调节器:
rosrun rqt_reconfigure rqt_reconfigure
汽车模型机器人的仿真:
roslaunch teb_local_planner_tutorials robot_carlike_in_stage.launch
欧几里得距离:
欧几里得距离,又称欧氏距离,是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。在二维和三维空间中的欧式距离的就是两点之间的距离,二维的公式是 d = sqrt((x1-x2)^+(y1-y2)^) 三维的公式是 d=sqrt(x1-x2)^+(y1-y2)^+(z1-z2)^)。在计算相似度(比如人脸识别)的场景下,欧几里得距离是比较直观、比较常见的一种相似度算法。欧氏距离越小,相似度越大;欧氏距离越大,相似度越小。
参数 | 类型 | 含义 | 最小 | 默认 | 最大 |
teb_autosize | bool | 优化期间允许改变轨迹的时域长度 | False | True | True |
dt_ref | double | 局部路径规划的解析度 | 0.01 | 0.3 | 1.0 |
dt_hysteresis | double | 允许改变的时域解析度的浮动范围, 一般为 dt_ref 的 10% 左右; | 0.002 | 0.1 | 0.5 |
global_plan_overwrite_orientation | bool | 覆盖全局路径中局部路径点的朝向,有些全局规划者在开始和全局目标之间没有考虑局部子目标的方向,因此自动确定 | False | True | True |
allow_init_with_backwards_motion | bool | 允许在开始时想后退来执行轨迹,如果为true,则在目标在本地成本图中落后于起点的情况下,可以使用向后运动来初始化基础轨迹(仅在机器人配备了后部传感器的情况下才建议这样做) | False | False | True |
max_global_plan_lookahead_dist | double | 考虑优化的全局计划子集的最大长度(累积欧几里得距离)(如果为0或负数:禁用;长度也受本地Costmap大小的限制) | 0.0 | 3.0 | 50.0 |
force_reinit_new_goal_dist | double | 如果上一个目标的间隔超过指定的米数(跳过热启动),则强制规划器重新初始化轨迹 | 0.0 | 1.0 | 10.0 |
feasibility_check_no_poses | int | 检测位姿可到达的时间间隔 | 0 | 5 | 50 |
exact_arc_length | bool | 如果为真,规划器在速度、加速度和转弯率计算中使用精确的弧长[->增加的CPU时间],否则使用欧几里德近似 | False | False | True |
publish_feedback | bool | 发布包含完整轨迹和活动障碍物列表的规划器反馈 | False | False | True |
visualize_with_time_as_z_axis_scale | double | 如果该值大于0,则使用该值缩放的Z轴的时间在3D中可视化轨迹和障碍物。最适用于动态障碍。 | 0.0 | 0.0 | 1.0 |
global_plan_viapoint_sep | double | 从全局计划中提取的每两个连续通过点之间的最小间隔[如果为负:禁用] | -0.1 | -0.1 | 5.0 |
via_points_ordered | bool | 如果为真,规划器遵循存储容器中通过点的顺序。 | False | False | True |
max_vel_x | double | 最大x前向速度 | 0.01 | 0.4 | 100.0 |
max_vel_x_backwards | double | 最大x后退速度 | 0.01 | 0.2 | 100.0 |
max_vel_theta | double | 最大转向叫速度 | 0.01 | 0.3 | 100.0 |
acc_lim_x | double | 最大x加速度 | 0.01 | 0.5 | 100.0 |
acc_lim_theta | double | 最大角速度 | 0.01 | 0.5 | 100.0 |
is_footprint_dynamic | bool | 是否footprint 为动态的,如果为true,则在检查轨迹可行性之前更新覆盖区 | False | False | True |
min_turning_radius | double | 车类机器人的最小转弯半径,小型机器人的最小转弯半径(差速驱动机器人:零) | 0.0 | 0.0 | 50.0 |
wheelbase | double | 驱动轴和转向轴之间的距离(仅适用于启用了“Cmd_angle_而不是_rotvel”的Carlike机器人);对于后轮式机器人,该值可能为负值! | -10.0 | 1.0 | 10.0 |
cmd_angle_instead_rotvel | bool | 将收到的角速度消息转换为 操作上的角度变化。 | False | False | True |
max_vel_y | double | 最大y方向速度,机器人的最大起步速度(对于非完整机器人,应为零!) | 0.0 | 0.0 | 100.0 |
acc_lim_y | double | 最大y向加速度,机器人的最大加速度 | 0.01 | 0.5 | 100.0 |
xy_goal_tolerance | double | 目标 xy 偏移容忍度,到目标位置的最终欧几里得距离 | 0.001 | 0.2 | 10.0 |
yaw_goal_tolerance | double | 目标 角度 偏移容忍度 | 0.001 | 0.1 | 3.2 |
free_goal_vel | bool | 允许机器人以最大速度驶向目的地, 出于计划目的,允许机器人的速度不为零(机器人可以以最大速度到达目标) | False | False | True |
min_obstacle_dist | double | 和障碍物最小距离 | 0.0 | 0.5 | 10.0 |
inflation_dist | double | 障碍物膨胀距离,惩罚成本不为零的障碍物周围的缓冲区(应大于min_obstacle_dist才能生效) | 0.0 | 0.6 | 15.0 |
dynamic_obstacle_inflation_dist | double | 动态障碍物的膨胀范围,动态障碍物的预测位置周围的缓冲区的惩罚成本非零(应大于min_obstacle_dist才能生效) | 0.0 | 0.6 | 15.0 |
include_dynamic_obstacles | bool | 是否将动态障碍物预测为速度模型,指定是否动态障碍物的运动应该被一个恒速模型预测(这也改变了同伦类搜索)。如果为false,则认为所有的障碍都是静态的。 | False | False | True |
include_costmap_obstacles | bool | costmap 中的障碍物是否被直接考虑 | False | True | True |
legacy_obstacle_association | bool | 是否严格遵循局部规划出来的路径,如果为true,则使用旧的关联策略(对于每个障碍,找到最近的TEB姿势),否则使用新的关联策略(对于每个teb姿势,仅找到“相关”障碍)。 | False | False | True |
obstacle_association_force_inclusion_factor | double | non-legacy障碍关联技术只尝试连接相关障碍与离散轨迹优化、specifed距离内的所有障碍被迫被包括(如min_obstacle_dist的倍数),如选择2.0为了考虑在半径为2.0 * min_obstacle_dist障碍。 | 0.0 | 1.5 | 100.0 |
obstacle_association_cutoff_factor | double | 参见obstacle_association_force_inclusion_factor,但如果超过[value]*min_obstacle_dist的倍数,优化过程中所有障碍都将被忽略。首先处理obstacle_association_force_inclusion_factor。 | 1.0 | 5.0 | 100.0 |
costmap_obstacles_behind_robot_dist | double | 限制在机器人后面规划时考虑到的占用的本地成本图障碍(指定距离,单位为米) | 0.0 | 1.5 | 20.0 |
obstacle_poses_affected | int | 障碍物位置与轨迹上最接近的姿态相连,以减少计算量,但同时也考虑了许多相邻的障碍物 | 0 | 30 | 200 |
no_inner_iterations | int | 被外循环调用后内循环执行优化次数 | 1 | 5 | 100 |
no_outer_iterations | int | 执行的外循环的优化次数 | 1 | 4 | 100 |
optimization_activate | bool | 激活优化 | False | True | True |
optimization_verbose | bool | 打印优化过程详情 | False | False | True |
penalty_epsilon | double | 对于硬约束近似,在惩罚函数中添加安全范围 | 0.0 | 0.1 | 1.0 |
weight_max_vel_x | double | 最大x速度权重 | 0.0 | 2.0 | 1000.0 |
weight_max_vel_y | double | 最大y速度权重 | 0.0 | 2.0 | 1000.0 |
weight_max_vel_theta | double | 最大加速度权重 | 0.0 | 1.0 | 1000.0 |
weight_acc_lim_x | double | 最大x 加速度权重 | 0.0 | 1.0 | 1000.0 |
weight_acc_lim_y | double | 最大y 加速度权重 | 0.0 | 1.0 | 1000.0 |
weight_acc_lim_theta | double | 最大角速度权重 | 0.0 | 1.0 | 1000.0 |
weight_kinematics_nh | double | 满足非完整运动学的优化权值 | 0.0 | 1000.0 | 10000.0 |
weight_kinematics_forward_drive | double | 优化过程中,迫使机器人只选择前进方向,差速轮适用 | 0.0 | 1.0 | 1000.0 |
weight_kinematics_turning_radius | double | 优化过程中,车型机器人的最小转弯半径的权重 | 0.0 | 1.0 | 1000.0 |
weight_optimaltime | double | 优化过程中,基于轨迹的时间上的权重 | 0.0 | 1.0 | 1000.0 |
weight_obstacle | double | 优化过程中,和障碍物最小距离的权重 | 0.0 | 50.0 | 1000.0 |
weight_inflation | double | 优化过程中, 膨胀区的权重 | 0.0 | 0.1 | 10.0 |
weight_dynamic_obstacle | double | 优化过程中,和动态障碍物最小距离的权重 | 0.0 | 50.0 | 1000.0 |
weight_dynamic_obstacle_inflation | double | 优化过程中,和动态障碍物膨胀区的权重 | 0.0 | 0.1 | 10.0 |
weight_viapoint | double | 优化过程中,和全局路径采样点距离的权重 | 0.0 | 1.0 | 1000.0 |
weight_adapt_factor | double | 在每次外部TEB迭代中,一些特殊权重(当前为“ weight_obstacle”)会以此因子重复缩放(weight_new:weight_old * factor); 迭代地增加权重而不是设置较大的先验值会导致底层优化问题的更好的数值条件。 | 1.0 | 2.0 | 100.0 |
enable_multithreading | bool | 允许多线程并行处理 | False | True | True |
max_number_classes | int | 允许的线程数 | 1 | 5 | 100 |
selection_cost_hysteresis | double | 指定新候选人必须有多少轨迹成本 先前选择的轨迹以进行选择(如果new_cost 0.0 |
1.0 |
2.0 |
|
selection_prefer_initial_plan | double | 为初始计划的等价类中的轨迹指定在区间(0,1)中的成本降低。 | 0.0 | 0.95 | 1.0 |
selection_obst_cost_scale | double | 为了选择“最佳”候选人,障碍成本项的额外缩放(new_obst_cost: obst_cost*factor) | 0.0 | 100.0 | 1000.0 |
selection_viapoint_cost_scale | double | 仅为了选择“最佳”候选人,就可以额外增加通点成本条款。 (new_viapt_cost:viapt_cost * factor) | 0.0 | 1.0 | 100.0 |
selection_alternative_time_cost | bool | 如果为true,则将时间成本替换为总过渡时间。 | False | False | True |
switching_blocking_period | double | 指定允许切换到新的等效类之前需要终止的持续时间(以秒为单位) | 0.0 | 0.0 | 60.0 |
roadmap_graph_no_samples | int | 如果simple_exploration被turend关闭,请指定为创建路线图图而生成的示例数量 | 1 | 15 | 100 |
roadmap_graph_area_width | double | 指定采样区域在开始和目标[m]之间的宽度(高度等于开始和目标的距离) | 0.1 | 5.0 | 20.0 |
roadmap_graph_area_length_scale | double | 矩形区域的长度取决于起点和目标之间的距离。 此参数进一步缩放距离,以使几何中心保持相等!) | 0.5 | 1.0 | 2.0 |
h_signature_prescaler | double | 缩放障碍物数值,允许设置大量障碍物。不要选得太低,否则无法区分障碍物(0.20.2 |
1.0 |
1.0 |
|
h_signature_threshold | double | 如果实部和复部的差都低于指定的阈值,则假设两个h-符号相等 | 0.0 | 0.1 | 1.0 |
obstacle_heading_threshold | double | 指定障碍物航向和目标航向之间的标准化标量积的值,以便将它们(障碍物)考虑到探索中) | 0.0 | 0.45 | 1.0 |
viapoints_all_candidates | bool | 如果为true,则将不同拓扑的所有轨迹附加到该组通孔点,否则仅附加与初始/全局计划共享同一轨迹的轨迹(在test_optim_node中无效)。 | False | True | True |
visualize_hc_graph | bool | 可视化为探索新同伦类而创建的图 | False | True | True |
shrink_horizon_backup | bool | 当规划器检测到系统异常,允许缩小时域规划范围 | False | True | True |
oscillation_recovery | bool | 尝试检测和解决振荡,尝试检测并解决相同等价类中多个解决方案之间的振荡(机器人经常在左/右/前/后退之间切换)。 | False | True | True |
原文链接:TEB Local Planner的特性与参数调试技巧总结
下面的这些参数会在上面的表格中蓝色字体处理:
katex is not defined
此时应设置wheelbase即前后轮距离。前后轮距离d与速度、角速度和舵机角度之间的关系是:katex is not defined(注:车辆运动学中心是后轮中点,速度除以角速度所得半径也是以这里为准的)在TEB规划器中,除了撞击障碍物不被允许外,其余的约束在没有可行方案时可被打破(如规划出事实上不可行的转弯半径)。对于权重配置,向读者介绍以下几种策略:
恢复措施可以尝试将卡在杂物中的机器人或路径规划错误的机器人恢复至正常状态。TEB Local Planner实现了由move_base规定的振荡恢复方法。但是,实测中控制器将高频率振荡速度指令(>10Hz),读者应当评估自己的电动机能否承受。(可在 move_base配置中关闭)
TEB提供路径规划不可行(plan not feasible)时的恢复措施,称为shrink horizon backup。此时TEB将以更近的点作为规划目标,尝试重新规划出可行路径。调试时可关闭,以在可视化界面上观察原出错路径。
TEB默认情况下不使用Costmap Converter。事实上,此插件可以在复杂场景下极大提高运算效率,尤其是处理激光雷达分散的测量数据时。因为将障碍物视为系列孤立点效率极低。
ROS WIKI:costmap_converter
Costmap的一般配置方法请参考相应官方文档。本文着重介绍为TEB规划器配置时的注意事项。
footprint配置:配置车辆/机器人的多边形外形。此外形应与TEB中的外形一致,或者至少在大小上没有太大的差别。注意costmap中的footprint设置是有默认值的,因此读者必须手动设置此配置为合适的值。
costmap layers: 局部耗费地图需要有来自地图的静态层和来自传感器的动态层,缺一不可。笔者在最初尝试配置时忽略了静态层,此时TEB将无视全局地图中的障碍。许多传感器,例如2D激光雷达,不可能探测到实时障碍物(地图中没有的)背后的静态障碍物(地图中有的),TEB规划器可能规划出绕过前方障碍物,并穿过当前没有见到的障碍物的错误路径。速度较快时可能来不及在发现障碍物时改正。鉴于TEB已有障碍物膨胀功能,此处可以不再添加膨胀层。
局部耗费地图的更新频率应当不低于规划器和costmap_conveter的转换频率,否则显然是没有意义的。同时,局部耗费地图应当开启滑动窗口(rolling window)模式,窗口大小也不应大于传感器的探测距离。
此功能将严重影响规划器性能。当路径中存在大量不连续分布的障碍物(如锥桶)并产生大量可行路径时,此功能有良好的效果。相反,若在单一路径上运行,则没有必要时用此功能。具体配置笔者并未做更多研究,还留待读者自行探索。
转载文章链接:teb_local_planner安装及使用
1、安装依赖:(ros:kenetic)
rosdep install teb_local_planner
2、github上下载源码:
https://github.com/rst-tu-dortmund/teb_local_planner
3、放入工作空间的/src文件夹中
4、(单独编译teb_local_planner)编译需要较长的编译时间
catkin_make -DCATKIN_WHITELIST_PACKAGES=“源码存放的文件夹名字”
5、查看teb_local_planner的plugin是否安装完成
rospack plugins --attrib=plugin nav_core
如果能查询到teb_local_planner,则表明以及准备就绪。值得一提的是,teb_local_planner源码中关于plugin的配置文件均已写好,直接编译源码就能完成plugin的注册及插入,非常方便。
6、新建teb_local_planner配置文件teb_local_planner_params.yaml
teb_local_planner使用方法和base_local_planner一样
git clone https://github.com/rst-tu-dortmund/teb_local_planner_tutorials.git
注意:由于使用机器人odom为差动模式的,故选取diff_drive中的。(这个是原文说明,但是我们的是阿克曼小车)
7、将teb_local_planner_params.yaml和navigation中其他的配置文件(如costmap_common_params.yaml等)放在一起,方便查阅调用。
8、在启动navigation的launch文件中load上述配置文件
...
...
teb_local_planner将navigation里的base_local_planner替换,故其作用机制和base_local_planner一样为ros的plugin机制
9、启动navigation,在rviz中将三条path调出来,即可观察机器人导航过程中规划路径的变化。
可以通过rosrun rqt_reconfigure rqt_reconfigure动态调节参数使机器人导航性能达到最佳。关于参数调节的方法请参考其ros官方文档。实际使用的经历来看,采用从teb_local_planner_tutorials下载下来的默认参数达到的性能已经远优于原始navigation中的路径规划算法的性能。
原文链接:ROS下阿克曼转向结构车型导航应用实践(teb_local_planner)
ROS下的导航中local planner多数都针对两轮差速结构设计的,阿克曼转向结构由于结构的特点会有最小转向半径的限制,所以常见的local planner例如base_local_planner,dwa_local_planner等在这里都不适用里,这里使用的是teb_local_planner
它提供了一种car-like的动力学模型(即有最小转向半径限制),这样他所规划的路径也就符合了阿克曼结构的运动特点了
官网提供的教程:teb_local_planner/Tutorials
其中:Planning for car-like robots:teb_local_planner/Tutorials/Planning for car-like robots
跑下来效果还可以,直接上车测试,把Tutorials中类车结构下的配置文件移植到我的车上
主要修改下面几点:
costmap_common_params.yaml
中的footprint
为实体机器人的实际尺寸信息global_costmap_params.yaml
中的robot_base_frame
为你机器人的基座标名称local_costmap_params.yaml
中的robot_base_frame
为你机器人的基座标名称local_costmap_params.yaml
中的width
和height
这个参数默认设置为intteb_local_planner_params.yaml
中的内容主要要设置车的速度,角速度,转向半径和车外轮廓安全尺寸
两个坑:
footprint_model
设置:去官网上找了一下具体的含义:wiki 问题出现:
这个是博主的问题,但是我也遇到过!!!
[ WARN] [1567946341.717090426, 13.700000000]: Control loop missed its desired rate of 5.0000Hz... the loop actually took 1.0000 seconds
[ WARN] [1567946341.718131483, 13.700000000]: Map update loop missed its desired rate of 5.0000Hz... the loop actually took 0.7000 seconds
根据博主的测试:
这个链接是:Tutorials Wiki
长答案我总结一下:
本地costmap_2d配置(强烈建议使用滚动窗口!):
障碍物/所述的Costmap参数teb_local_planner:
通过注册/激活costmap_converter插件,也可以将costmap障碍物预处理移到另一个线程中。这些插件旨在将成本图单元(许多点障碍)转换为几何图元(点,线,多边形)。也可以过滤冗余单元或障碍物内部的单元。但是到目前为止,可用的转换插件仍处于试验阶段,并且有许多更有效的方法可以预处理成本图。请参阅本教程。如果有人有兴趣贡献力量,可以使用pluginlib轻松集成更多插件。