之前博客《ROS学习笔记之——Navigation Stack及路径规划》介绍了navigation stack,其中涉及到的amcl、路径规划以及避障还没有详细的展开
目录
Anytime Repairing A* (ARA*) 搜索算法
动态窗口法(DWA,dynamic window approach)
AMCL
关于基于AMCL的定位,后面会再写博客深入介绍。
路径规划
之前博客《 学习笔记之——路径规划》已经介绍过路径规划了。此处再来学习一下~
移动一个简单的物体(object)看起来是容易的。而路径搜索是非常复杂的。如下图所示。
物体最初位于地图的底端并且尝试向顶部移动。物体扫描的区域中(粉红色部分)没有任何东西显示它不能向上移动,因此它持续向上移动。在靠近顶部时,它探测到一个障碍物然后改变移动方向。然后它沿着U形障碍物找到它的红色的路径。相反的,一个路径搜索器(pathfinder)将会扫描一个更大的区域(淡蓝色部分),但是它能做到不让物体(unit)走向凹形障碍物而找到一条更短的路径(蓝色路径)。
路径规划技术是自主移动机器人技术研究中的一个核心内容,是要实现移动机器人在未知环境下自主路径规划决策,具备实时、自主并识别高风险区域的能力,标志着移动机器人的智能化水平。根据机器人对环境信息掌握的程度,将路径规划分为全局路径规划和局部路径规划。
路径规划是指移动机器人按照某一性能指标(如距离、时间等)搜索一条从起始状态到目标状态的最优或次优路径。根据对环境信息的把握程度可把路径规划分为基于先验信息的全局路径规划和基于传感器信息的局部路径规划。其中,从获取障碍物信息是静态或是动态的角度看,全局路径规划属于静态规划(又称离线规划)。全局路径规划需要掌握所有的环境信息,根据环境地图的所有信息进行路径规划;局部路径规划只需要有传感器实时采集环境信息,了解环境地图信息,然后确定出所在地图的位置及其障碍物分布情况,从而可以选出从当前节点到某一子目标的最优路径。
全局路径规划中的地图
在全局路径规划中,首先需要的是有环境的地图。基于先验的地图信息来做全局的路径规划。
栅格地图(Grid Map)
Grid Map是把环境划分成一系列栅格,在数学视角下是由边联结起来的结点的集合,一个基于图块拼接的地图可以看成是一个栅格图,每个图块(tile)是一个结点,图块之间的连接关系如短线。
另外一种讲法是:栅格法是将移动机器人的工作空间分解为许多网格状的单元,这些单元一般用0、1两个数值来表示,工作环境中的障碍物的形状和大小是一致的,而且移动机器人在行走的过程中,障碍物的位置、形状和大小是固定不变化的。(个人感觉栅格地图跟概率图很像)
概率图(Cost Map)
如果在栅格图的基础上,每一栅格给定一个可能值,表示该栅格被占据的概率,则该图为概率图。故此在ROS中,实际上就是先通过对地图进行栅格化,然后再加上每个栅格被占用的概率而得到costmap,根据costmap来做相应的路径规划。关于costmap之前的博客《ROS学习笔记之——Navigation Stack》介绍过
特征地图(Feature Map)
特征地图用有关的几何特征(如点、直线、面)表示环境。常见于vSLAM(视觉SLAM)技术中。它一般通过如GPS、UWB以及摄像头配合稀疏方式的vSLAM算法产生,优点是相对数据存储量和运算量比较小,多见于最早的SLAM算法中。
拓扑地图(Topological Map)
Topological Map是指地图学中一种统计地图, 一种保持点与线相对位置关系正确而不一定保持图形形状与面积、距离、方向正确的抽象地图。包括有有向图和无向图。
全局路径规划算法
https://github.com/zhm-real/PathPlanning中已经实现了大量的路径规划算法
基于搜索的路径规划算法
基于搜索的路径规划算法已经较为成熟且得到了广泛应用,常常被用于游戏中人物和移动机器人的路径规划。
Dijkstra 算法
Dijkstra算法算是贪心思想实现的,具体实现方法是,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。
在介绍Dijkstra 算法前,先介绍一下启发式搜索,以及广度优先搜索
启发式搜索
基于启发式搜索,也叫贪心搜索。贪心算法的思路就是每一次迭代都朝着局部最优的值靠近。对每一个数据结构内的节点用一个函数去估计其代价,找到代价最小的即局部最优值去访问,其中这个预估代价的函数便称作启发函数。若采用距离来作为启发函数则每次都会朝着离目标点最近的方向去搜索。如下图(注意,下面的图是把启发式搜索跟广度优先搜索合在一起了~~~)
可以看到,在没有障碍物的情况下该算法能非常快找到一条可行路径,但是有障碍物时就不一样了,如下所示。
可以看到在一开始的时候算法陷入了局部的极值,没有找到一条最好的路径反而走向了死胡同。
广度优先搜索
广度优先算法是一层层的搜索的过程。
广度优先搜索需要访问大量的节点才能找到最优路径,启发式搜索能很快的进行搜索但是容易陷入局部极值导致路径并非最优的。于是有人提出将这两种方法的有点结合起来。
接下来我们先看看Dijkstra算法。
Dijkstra算法的第一个问题是如何确保找到的路径是最优的,可以从之前的例子看到路径不只一条且有的是最优路径有的不是。
每一个节点在访问的时候都会累计得到从起点到该节点的路径上所有的权重和,若之前这个节点被访问过,则比较两者的权重和大小,取小的从而保证路径是最优的。而每次从队列中取出的不再是先进入的而是权重和最小的。其表现如下图所示:
可以看到,比起广度优先算法以一种正方形的方式扩展Dijkstra算法是以圆形的方式扩展,更为合理且能保证找到一条最优的路径。但是依旧保留广度优先算法的最大的缺点——需要搜索大量的节点后才能得到一条路径,算法效率太低。
Dijkstra算法从物体所在的初始点开始,访问图中的节点。它迭代检查节点集中的结点,并将和该节点最靠近的尚未检查的结点加入待检查点集。该结点集从初始结点向外扩展,直到到达目标节点。Dijkstra算法保证能够找到一条从初始点到目标点的最短路径。只要所有的边都有一个非负的代价值。
Dijkstra算法是一种经典的广度优先的状态空间搜索算法,算法会搜索整个空间直到到达目标点,这就导致了Dijkstra算法计算时间和数据量很大,而且搜索得到的大量数据对于移动机器人的运动是无用的。
如下图所示,Dijkstra算法搜索的区域是非常大的。个人感觉Dijkstra算法好像就是单纯的就是广度优先算法了。没有加入启发式。
最佳路径优先搜索算法(BFS)
有点类似启发式算法(在Dijkstra 算法讲了启发式算法了),可以看作基于启发式的深度优先算法。它选择离目标最近的结点。BFS不能保证找到一条最短路径。但是比起的Dijkstra 算法块多了,
因为它用了一个启发式函数(heuristic )快速地导向目标结点。例如,如果目标位于出发点的南方,BFS将趋向于导向南方的路径。在下面的图中,越黄的结点代表越高的启发式值(移动到目标的代价高),而越黑的结点代表越低的启发式值(移动到目标的代价低)。
但是当有障碍物的时候。对于Dijkstra算法而言,运行得较慢,但确实能保证找到一条最短路径:
而对于BFS,虽然运行得较快,但是它找到的路径明显不是一条好的路径:
BFS是基于贪心策略的,它试图向目标移动尽管这不是正确的路径。由于它仅仅考虑到达目标的代价,而忽略了当前已花费的代价,于是尽管路径变得很长,它仍然继续走下去。
A * 搜索算法
(https://www.gamedev.net/reference/articles/article2003.asp)
Dijkstra的优先级队列的排序规则是节点的权重和而启发式搜索的排序规则是距离目标点的距离。所以结合两者算法,优先级队列的规则设置为节点的权重和与距离目标点的距离两者的和。
A*搜索算法跟Dijkstra算法很类似(在Dijkstra算法的基础上增加了启发式特性,搜索的效率大大提升)。只是将排序的规则改成了节点的权重和与距离目标点的距离两者的和。效果如下所示
是路径搜索中最受欢迎的选择,因为它相当灵活,并且能用于多种多样的情形之中。
和其它的图搜索算法一样,A潜在地搜索图中一个很大的区域。和Dijkstra一样,A能用于搜索最短路径。和BFS一样,A*能用启发式函数(heuristic)引导它自己。在简单的情况中,它和BFS一样快。
在无障碍物时的A*算法:
在有障碍物时的A*算法
A*算法把Dijkstra算法(靠近初始点的结点)和BFS算法(靠近目标点的结点)的信息块结合起来。
双向 A * 搜索算法
重复 A * 搜索算法
Anytime Repairing A* (ARA*) 搜索算法
实时学习 A * 搜索(LRTA*)算法
实时适应性 A * 搜索(RTAA*)算法
动态 A * 搜索(D*)算法
终身规划 A * 搜索算法
Anytime D * 搜索算法:变动较小
Anytime D * 搜索算法:变动较大
基于采样的路径规划算法
与基于搜索不同,基于采样的路径规划算法不需要显式构建整个配置空间和边界,并且在高维度的规划问题中得到广泛应用。
快速随机搜索树(RRT)算法
快速搜索随机树算法是一种增量式采样的搜索方法,该方法在应用中不需要任何参数整定,拥有良好的使用性能。
基于快速扩展随机树的路径规划算法,通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,能够有效的解决高维空间和复杂约束的路径规划问题。
它以一个初始点作为根结点,通过随机采样增加叶子结点的方式,生成一个随机扩展树,当随机树中的叶子结点包含了目标结点或进入了目标区域,便可以在随机树中找到一条由初始点到目标点的路径。该方法的特点是能够快速有效地搜索高维空间,通过状态空间的随机采样点,把搜索导向空白区域,从而寻找到一条从起始点到目标点的规划路径,适合解决多移动机器人在复杂环境中的路径规划问题。
目标偏好 RRT 算法
双向快速扩展随机树(RRT_CONNECT)算法
Extended_RRT 算法
动态 RRT 算法
快速行进树(FMT*)算法
Batch Informed 树(BIT*)算法
局部路径规划算法
在全局路径规划中,用得最多的应该是A*算法,而在局部路径规划中用得最多的应该是DWA算法了。
首先全局路径规划会生成一条大致的全局路径,局部路径规划器会把全局路径给分段,然后根据分段的全局路径的坐标,进行局部重新规划。特别是当遇到原本地图中不存在的障碍物时,就要重新规划路径。
机器人在获得目的地信息后,首先经过全局路径规划规划出一条大致可行的路线,然后调用局部路径规划器根据这条路线及costmap的信息规划出机器人在局部时做出具体行动策略
人工势场法
人工势场法是由哈提卜提出的一种虚拟的力场法。假设移动机器人在空间中运动的时候受到了引力和斥力的共同作用,这是人工势场法的基本思想。其中障碍物具有排斥势场,对移动机器人产生斥力,移动机器人离障碍物越近,斥力越大。目标具有吸引势场,对移动机器人产生引力,移动机器人离目标越近引力越小。
引力和斥力的合力根据牛顿定律会对移动机器人产生加速度,从而控制移动机器人的运动方向和速度等。在移动机器人上选择一些用来测试的点,计算这些测试点与各个障碍物之间的排斥势和目标之间的吸引势,对获得的这些排斥势和吸引势相加。最后,通过计算势函数梯度下降的方向来找到一条无碰路径。
人工势场法适合应用在环境不断变化的情况。这种方法有利于底层的、在线的控制移动机器人的运动,而且构造起来简单,在运动路线的平滑控制方面和在线避免与障碍物相撞方面应用越来越广。
动态窗口法(DWA,dynamic window approach)
(https://yunchengjiang.blog.csdn.net/article/details/101393017?utm_source=app
https://www.cnblogs.com/kuangxionghui/p/8484803.html
https://blog.csdn.net/heyijia0327/article/details/44983551)
动态窗口法DWA是在曲率速度法基础上提出的,将移动机器人的位置控制转化为速度控制,将避障问题描述为速度空间带约束的优化问题。该算法在速度空间中采样多组速度,将有限的速度和加速度的运动约束考虑到动态窗口的设计中,模拟移动机器人以一定的速度在一定时间内的运动轨迹。
在得到运动轨迹后,通过一个评价函数对这些轨迹打分,选取最优轨迹对应的速度来驱动移动机器人的运动。
动态窗口法和A*算法进行融合,构造一种估计全局最优路径评价函数,可实时避障,路径更加平滑,曲率变化的连续性以及可输出的运动控制参数更符合移动机器人动力学控制。动态窗口法充分考虑了移动机器人的物理限制、环境约束以及当前速度等因素,得到的路径安全可靠,适用于局部路径规划。
DWA算法主要是在速度空间(v,w)中采样多组速度,并模拟这些速度在一定时间(sim_period)内的运动轨迹,再通过一个评价函数对这些轨迹打分,选取得分最高的最优路径,并把相应的速度控制指令发送给机器人。该算法的突出点在于动态窗口这个概念,它的含义是依据移动机器人的加减速性能限定速度速度采样空间在一个可行的动态范围内。
在DWA中,要模拟机器人的运动轨迹,就需要知道机器人的运动模型。假设两轮移动机器人的轨迹是一段一段的圆弧,或者直线(旋转速度为0),一对就代表一个圆弧轨迹。具体的推导可以参考博客:https://blog.csdn.net/heyijia0327/article/details/44983551或https://www.cnblogs.com/kuangxionghui/p/8484803.html
避障(avoid obstales)
通过增加几个map可以选择。
路径规划插件位于move_base中。在之前博文《 ROS学习笔记之——Navigation Stack及路径规划》中已经介绍了一部分。the main function of the move_base node is to move the robot from its current position to a goal position
通过使用2D Nav Goal,向move_base/goal发布topic,让机器人移动到对应的位置。
在局部路径规划种,已经加入了避障
清空loacl costmap
rosservice call /move_base/clear_costmaps "{}"
base_global_planner
(http://wiki.ros.org/global_planner?distro=lunar
https://blog.csdn.net/x_r_su/article/details/53391462)
其插件包括了:
- parrot_planner: 实现了较简单的全局规划算法
- navfn/NavfnROS: 实现了Dijkstra和A*全局规划算法
- global_planner: 重新实现了Dijkstra和A*全局规划算法,可以看作navfn的改进版
global_planner概述
这个package为导航提供了一种快速,内插值的全局规划器, 继承了nav_core包中nav_core::BaseGlobalPlanner接口,该实现相比navfn使用更加灵活。
-
global_planner是一个路径规划器节点。
-
这个包为导航实现了一种快速,内插值的全局路径规划器, 继承了nav_core包中nav_core::BaseGlobalPlanner接口,该实现相比navfn使用更加灵活。
如果要用A*算法,需要设置
- use_dijkstra=False
base_local_planner
http://wiki.ros.org/base_local_planner
其插件包括了:
- base_local_planner/TrajectoryPlannerROS: 实现了Trajectory Rollout和DWA两种局部规划算法
- dwa_local_planner: 实现了DWA局部规划算法,可以看作是base_local_planner的改进版本
概述
-
这个包使用Trajectory Rollout and Dynamic Window approaches来做平面上运动的机器人局部导航,控制器基于给定的路径规划和costmap生成速度命令后发送给移动基座。
-
该包适用于全向移动和非全向移动机器人,机器人轮廓可以表示为凸多边形或者圆。
-
这个包进行了ROS封装,继承了BaseLocalPlanner接口,且可以在启动文件中设置ROS参数。(通过设置对应的参数,理论上可以修改路径规划的效果)
-
base_local_planner包提供了驱动底座在平面移动的控制器,控制器可以连接路径规划器和机器人基座。
-
为了让机器人从起始位置到达目标位置,路径规划器使用地图创建运动轨迹。
-
向目标移动的路上,路径规划器至少需要在地图上的机器人周围创建一个可以表示成栅格地图的评价函数。
-
This value function encodes the costs of traversing through the grid cells.
-
该控制器任务就是用这个评价函数确定发送速度和角度(dx,dy,dtheta velocities)给机器人基座。
Trajectory Rollout and Dynamic Window Approach (DWA)算法基本理念如下:
-
采样机器人当前的状态。Discretely sample in the robot's control space (dx,dy,dtheta)
-
用采样的离散点做前向模拟,基于机器人当前状态,预测如果使用空间采样点的速度运动一段时间可能出现的情况。
-
评价前向模拟的每条轨迹,评价标准包括(接近障碍,接近目标,接近全局路径和速度)。丢弃不合法的轨迹(如可能碰到障碍物的轨迹)。
-
根据打分,选择最优路径,并将其对应速度发送给基座。
-
重复上面步骤。
DWA与Trajectory Rollout的区别主要是在机器人的控制空间采样差异。Trajectory Rollout采样点来源于整个前向模拟阶段所有可用速度集合,而DWA采样点仅仅来源于一个模拟步骤中的可用速度集合。这意味着相比之下DWA是一种更加有效算法,因为其使用了更小采样空间;然而对于低加速度的机器人来说可能Trajectory Rollout更好,因为DWA不能对常加速度做前向模拟。
dwa_local_planner
http://wiki.ros.org/dwa_local_planner
https://www.ncnynl.com/archives/201708/1906.html
-
该包使用DWA(Dynamic Window Approach)算法实现了平面上移动机器人局部导航功能。
-
给定一个全局路径规划和代价地图,局部路径规划器生成的速度命令发送到移动基座。
-
该包支持任何footprint表示为凸多边形或圆形的机器人,同时将其配置公开为可在启动文件中设置的ROS参数。 该规划器的参数也可重新动态配置。
-
该包的ROS封装继承了BaseLocalPlanner接口。
-
dwa_local_planner包提供了一个驱动平面中移动基座的控制器,其将路径规划器和机器人连接到一起。
-
移动过程中,路径规划器会在机器人周围创建可以表示为栅格地图的评价函数。其中控制器的主要任务就是利用评价函数确定发送给基座的速度(dx,dy,dtheta)。
可以通过设置ROS参数来定制dwa_local_planner :: DWAPlannerROS的行为,具体参考(https://www.ncnynl.com/archives/201708/1906.html)通过改变输出的最大最小值,进而可以控制机器人更加平稳的运动
ROS实验
一般通过下面命令就可以打开地图并实现导航
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map/2.yaml
下面我们深入的看看这个launch文件。文件位于/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_navigation/launch/turtlebot3_navigation.launch
<launch>
<!-- Arguments -->
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="map_file" default="$(find turtlebot3_navigation)/maps/map.yaml"/>
<arg name="open_rviz" default="true"/>
<arg name="move_forward_only" default="false"/>
<!-- Turtlebot3 -->
<include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch">
<arg name="model" value="$(arg model)" />
</include>
<!-- Map server -->
<node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"/>
<!-- AMCL -->
<!--<include file="$(find turtlebot3_navigation)/launch/amcl.launch"/>-->
<!-- move_base -->
<include file="$(find turtlebot3_navigation)/launch/move_base.launch">
<arg name="model" value="$(arg model)" />
<arg name="move_forward_only" value="$(arg move_forward_only)"/>
</include>
<!-- rviz -->
<group if="$(arg open_rviz)">
<node pkg="rviz" type="rviz" name="rviz" required="true"
args="-d $(find turtlebot3_navigation)/rviz/turtlebot3_navigation.rviz"/>
</group>
</launch>
从这里可以看到。该文件启动了一些选项。
其中,由于本人这边的实验需求,不采用AMCL的定位结果,所以把AMCL注释掉了。
那么处理导航的部分,则是move_base了,此处,开了另外一个move_base的launch,我们来看看里面的内容
<launch>
<!-- Arguments -->
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="cmd_vel_topic" default="/cmd_vel" />
<arg name="odom_topic" default="odom" />
<arg name="move_forward_only" default="false"/>
<!-- move_base -->
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/local_costmap_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/global_costmap_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/move_base_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params_$(arg model).yaml" command="load" />
<remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>
<remap from="odom" to="$(arg odom_topic)"/>
<param name="DWAPlannerROS/min_vel_x" value="0.0" if="$(arg move_forward_only)" />
</node>
</launch>
这里启动了一系列的节点。注释如下:
<launch>
<!-- Arguments -->
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="cmd_vel_topic" default="/cmd_vel" />
<arg name="odom_topic" default="odom" />
<arg name="move_forward_only" default="false"/>
<!-- move_base -->
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<!-- 启动局部路径规划base_local_planner,选用dwa_local_planner/DWAPlannerROS方法 -->
<param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
<!-- 启动costmap节点及对应的参数 -->
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/local_costmap_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/global_costmap_params.yaml" command="load" />
<!-- move_based对应的参数 -->
<rosparam file="$(find turtlebot3_navigation)/param/move_base_params.yaml" command="load" />
<!-- 局部路径规划对应的参数 -->
<rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params_$(arg model).yaml" command="load" />
<remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>
<remap from="odom" to="$(arg odom_topic)"/>
<param name="DWAPlannerROS/min_vel_x" value="0.0" if="$(arg move_forward_only)" />
</node>
</launch>
通过修改文件/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/dwa_local_planner_params_burger.yaml中的参数来改变路径规划的控制
DWAPlannerROS:
# Robot Configuration Parameters
max_vel_x: 0.22
min_vel_x: -0.22
max_vel_y: 0.0
min_vel_y: 0.0
# The velocity when robot is moving in a straight line
max_trans_vel: 0.22
min_trans_vel: 0.11
max_rot_vel: 2.75
min_rot_vel: 1.37
acc_lim_x: 2.5
acc_lim_y: 0.0
acc_lim_theta: 3.2
# Goal Tolerance Parametes
xy_goal_tolerance: 0.05
yaw_goal_tolerance: 0.17
latch_xy_goal_tolerance: false
# Forward Simulation Parameters
sim_time: 1.5
vx_samples: 20
vy_samples: 0
vth_samples: 40
controller_frequency: 10.0
# Trajectory Scoring Parameters
path_distance_bias: 32.0
goal_distance_bias: 20.0
occdist_scale: 0.02
forward_point_distance: 0.325
stop_time_buffer: 0.2
scaling_speed: 0.25
max_scaling_factor: 0.2
# Oscillation Prevention Parameters
oscillation_reset_dist: 0.05
# Debugging
publish_traj_pc : true
publish_cost_grid_pc: true
注释如下:
DWAPlannerROS:
# Robot Configuration Parameters
max_vel_x: 0.22
min_vel_x: -0.22
max_vel_y: 0.0
min_vel_y: 0.0
# The velocity when robot is moving in a straight line 机器人直线运动时速率的控制
max_trans_vel: 0.22
min_trans_vel: 0.11
max_rot_vel: 2.75
min_rot_vel: 1.37
acc_lim_x: 2.5
acc_lim_y: 0.0
acc_lim_theta: 3.2
# Goal Tolerance Parametes 目标容忍度参数
# 这个的设置其实就是设置路径规划到目标点的误差的容忍度
xy_goal_tolerance: 0.05
yaw_goal_tolerance: 0.17
latch_xy_goal_tolerance: false
# Forward Simulation Parameters
sim_time: 1.5
vx_samples: 20
vy_samples: 0
vth_samples: 40
controller_frequency: 10.0
# Trajectory Scoring Parameters
path_distance_bias: 32.0
goal_distance_bias: 20.0
occdist_scale: 0.02
forward_point_distance: 0.325
stop_time_buffer: 0.2
scaling_speed: 0.25
max_scaling_factor: 0.2
# Oscillation Prevention Parameters 防止震荡的参数
oscillation_reset_dist: 0.05
# Debugging
publish_traj_pc : true
publish_cost_grid_pc: true
补充资料
linux中截屏:
Shift + Ctrl + PrtSc
– 获取屏幕的某个区域截图并存放到剪贴板
参考资料
https://blog.csdn.net/x_r_su/article/details/53380545(base_local_planner)
https://www.ncnynl.com/archives/201708/1903.html(base_local_planner)
不错的视频学习链接(https://www.youtube.com/results?search_query=%23ROStutorial)mark一下
https://www.youtube.com/watch?v=mYwIu4OVMR8&list=RDCMUCt6Lag-vv25fTX3e11mVY1Q&start_radio=1
https://www.youtube.com/playlist?list=PLK0b4e05LnzbuxWCdip-2Tf-SIiZle5NA
https://www.jianshu.com/p/97ebcbddd64c
https://developer.aliyun.com/article/765023
http://theory.stanford.edu/~amitp/GameProgramming/