ROS学习笔记之——路径规划及avoid obstacles

2023-05-16

之前博客《ROS学习笔记之——Navigation Stack及路径规划》介绍了navigation stack,其中涉及到的amcl、路径规划以及避障还没有详细的展开

 

目录

AMCL

路径规划

全局路径规划中的地图

栅格地图(Grid Map)

概率图(Cost Map)

特征地图(Feature Map)

拓扑地图(Topological Map)

全局路径规划算法

Dijkstra 算法

最佳路径优先搜索算法(BFS)

A * 搜索算法

双向 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*)算法

局部路径规划算法

人工势场法

动态窗口法(DWA,dynamic window approach)

避障(avoid obstales)

base_global_planner

global_planner概述

base_local_planner

概述

dwa_local_planner

ROS实验

补充资料

参考资料


 

AMCL

http://wiki.ros.org/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)算法

(https://mp.weixin.qq.com/s?__biz=MzIwNzgxNzg0Mg==&mid=2247487267&idx=1&sn=90b8cf6695dcf4e808a3f47a259231ca&chksm=970dd23ea07a5b28207a1806c997a64f88b27ea44cb1c01836b3febb443176f88bd667e5c835&mpshare=1&scene=1&srcid=1130WefkNgAhGTkAxiRkaE23&sharer_sharetime=1606699308509&sharer_shareid=a02329314a01e92e427ef82703762420&key=2b4f3f2619a4c56f023ccb02bc0345bbbec9c347679df836ef8692eff136d1ff36ae5d2cfd145bc28b8d04d069891ae18feb1751cb0f16b126f3c6bec3d2ce3bbe9cc79a647942247cc12cb5ef27ad5528fed544041007415638103919431cc9b9858a1a64715769d66e29ca3007b2273169138d471c69566ba6bfe1df38def4&ascene=1&uin=MTIxMjY0NjM2Mw%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=A7zGAcbb6Wf8vS4sE6JTFUE%3D&pass_ticket=mvkXRioFKkyDukIPORVswY%2FWIHUfFQKDC2ii4fZYYmsXeqmdzPaQcOqSPBHWaTcZ&wx_header=0)

快速搜索随机树算法是一种增量式采样的搜索方法,该方法在应用中不需要任何参数整定,拥有良好的使用性能。

基于快速扩展随机树的路径规划算法,通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,能够有效的解决高维空间和复杂约束的路径规划问题。

它以一个初始点作为根结点,通过随机采样增加叶子结点的方式,生成一个随机扩展树,当随机树中的叶子结点包含了目标结点或进入了目标区域,便可以在随机树中找到一条由初始点到目标点的路径。该方法的特点是能够快速有效地搜索高维空间,通过状态空间的随机采样点,把搜索导向空白区域,从而寻找到一条从起始点到目标点的规划路径,适合解决多移动机器人在复杂环境中的路径规划问题。

目标偏好 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 – 获取屏幕的某个区域截图并存放到剪贴板

 

 

参考资料

http://wiki.ros.org/amcl

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://mp.weixin.qq.com/s?__biz=MjM5NDU4NzcwMw==&mid=2650484608&idx=1&sn=48d75c913dae44323efe3e4bdf7b60ab&chksm=be8afad889fd73ce435508a0ea0eb3d035c5086edc4edc7b9b009848c2f7491e739a9a39a895&mpshare=1&scene=1&srcid=11309i9D1Uif138M8OognRnT&sharer_sharetime=1606699992753&sharer_shareid=a02329314a01e92e427ef82703762420&key=5ecfa8a65e08b207fa940eaaa6713212384329053da53cac4b641f41328be3fbbf4dda15b3dbf06bca8711b76c808c7aa7be4c204e78f10b5cff259d85bad270c91c0a24892bd4a57797db4119f840d2a4403c0bf5303ebf6e2c3e073037e239925ad8b5a09f80e3a1a581596c03f8a76c0e37a946bcd80ef00787a458b7ec84&ascene=1&uin=MTIxMjY0NjM2Mw%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=A4K%2B3l0mhimMaYEoHYegBeI%3D&pass_ticket=mvkXRioFKkyDukIPORVswY%2FWIHUfFQKDC2ii4fZYYmsXeqmdzPaQcOqSPBHWaTcZ&wx_header=0

https://mp.weixin.qq.com/s?__biz=MzIwNzgxNzg0Mg==&mid=2247487267&idx=1&sn=90b8cf6695dcf4e808a3f47a259231ca&chksm=970dd23ea07a5b28207a1806c997a64f88b27ea44cb1c01836b3febb443176f88bd667e5c835&mpshare=1&scene=1&srcid=1130WefkNgAhGTkAxiRkaE23&sharer_sharetime=1606699308509&sharer_shareid=a02329314a01e92e427ef82703762420&key=2b4f3f2619a4c56f023ccb02bc0345bbbec9c347679df836ef8692eff136d1ff36ae5d2cfd145bc28b8d04d069891ae18feb1751cb0f16b126f3c6bec3d2ce3bbe9cc79a647942247cc12cb5ef27ad5528fed544041007415638103919431cc9b9858a1a64715769d66e29ca3007b2273169138d471c69566ba6bfe1df38def4&ascene=1&uin=MTIxMjY0NjM2Mw%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=A7zGAcbb6Wf8vS4sE6JTFUE%3D&pass_ticket=mvkXRioFKkyDukIPORVswY%2FWIHUfFQKDC2ii4fZYYmsXeqmdzPaQcOqSPBHWaTcZ&wx_header=0

https://www.jianshu.com/p/97ebcbddd64c

https://developer.aliyun.com/article/765023

https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650802204&idx=4&sn=1938e82f1d6f46877a6734b04e6fdaee&chksm=84e5cc62b3924574ab7570eb4bd0acdfd8d76ef7a6964e9bb37cec4fbd0fd45de664229fdb93&mpshare=1&scene=1&srcid=1130aY1TiyN3FR9LcI0Kg5vH&sharer_sharetime=1606699462339&sharer_shareid=a02329314a01e92e427ef82703762420&key=2b4f3f2619a4c56f4566ccdbea12eefb9e9841bddf20072b2671cb43ec5b22bd879c11eeb5a531996a25ea8203ffc8024663b9754046603974edf8dc8fbfd466c9f89ea004ef6b04220d53d0d4a41e2e9f59f8fc0d0202f3828a0bb1ae231c9bbf4f37e68b171d937a4b64e106135f56aed6ff6dfa0b3ff74789382c3e89db05&ascene=1&uin=MTIxMjY0NjM2Mw%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=A3hg%2F7syYFP2YWSRCh%2FD0ho%3D&pass_ticket=mvkXRioFKkyDukIPORVswY%2FWIHUfFQKDC2ii4fZYYmsXeqmdzPaQcOqSPBHWaTcZ&wx_header=0

http://theory.stanford.edu/~amitp/GameProgramming/

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS学习笔记之——路径规划及avoid obstacles 的相关文章

  • Mac M1芯片安装 Numpy Pandas

    本文教你如何简单的在M1芯片的MacBook上安装Numpy和Pandas 刚入手了一个Mac Pro xff0c 是M1芯片的 xff0c 结果在安装Numpy和Pandas时遇到了各种莫名奇妙的问题 第1种报错 xff0c 很长 xff
  • addr2line

    1 符号表 1 1什么是符号表 符号表是内存地址与函数名 文件名 行号的映射表 符号表元素如下所示 xff1a lt 起始地址 gt lt 结束地址 gt lt 函数 gt lt 文件名 行号 gt 1 2为什么要配置符号表 为了能快速并准
  • 一些有用的Python库

    1 制作动态排序图的库 做出来像这种效果 https mp weixin qq com s DQf35t7PUcFmi3j942Q7A 2 基于matplotlib轻松绘制漂亮的表格 比自己在ppt或者excel中搞出来的表格好看多了 像这
  • Android创建杀不死的Service

    在Android开发中我们经常会遇到一些特殊的需求需要让我们的服务常驻内存 xff0c 但是会遇到各种清理软件或者用户在设置中手动停止程序的情况而导致我们的服务被异常的终止掉 虽然没有办法保证绝对的常驻内存 xff0c 但是通过策略我们还是
  • Mac 从Bash切换到Zsh的注意事项

    1 第一步要安装Zsh xff0c 可以参考现成的文章 xff0c 推荐一篇https zhuanlan zhihu com p 19556676 2 安装完成之后退出命令行重新进入 xff0c 就可以看到Zsh的效果啦 3 及得切换默认的
  • 数组求实际长度(逻辑长度)

    有很多情况下 xff0c 比如我们定义了一个数组 xff0c byte a 61 new byte 100 但是给数组赋值的时候只赋了10个 xff0c 虽然这个数组在内存中的长度仍然是100 xff0c 但是我们想得到的确实数组的实际长度
  • java清空数组

    定义一个数字byte a 61 new byte 20 如果给数组赋值后又想让数组恢复到初始的状态 xff0c 那如何做呢 xff0c 其实很简单 xff0c 直接上方法 将byte数组置空 public static byte reset
  • 使用gazebo的官方模型库文件

    首先下载所有的gazebo模型库文件 xff0c 我已经打包上传到csdn了 xff0c 可以从如下链接中下载 xff1a 下载link 然后将下载好的文件存放在如下目录 xff1a cd gazebo models 如果没有上述目录就自行
  • 作为一个普通的程序员,到底应不应该转型AI工程师?

    动不动就是50万的毕业生年薪 xff0c 动不动就是100万起步价的海归AI高级人才 xff0c 普通员到底应不应该转型AI工程师 xff0c 普通程序员到底应该如何转型AI工程师 xff1f 下面就分享几个特别典型的普通程序员成功转型AI
  • 树莓派Odroid等卡片式电脑上搭建NAS教程系列1-Ubuntu系统安装

    我用的是韩国hardkernel公司做的Odroid XU板子 xff0c 类似于树莓派香蕉派 xff0c 看下它的真面目 相关参数点他 gt Odroid XU 搭建NAS之前先来安装好Ubuntu系统 下载安装文件 在Odroid里安装
  • 立创eda学习笔记一:pcb板基础知识

    整理了一下零基础学习pcb板画图需要了解的一些基础知识 xff0c 否则后面画图很困扰 什么是pcb板 xff1f PCB xff08 Printed Circuit Board xff09 xff0c 中文名称为印制电路板 xff0c 又
  • 立创eda学习笔记二:画pcb板流程(极简入门版)

    一般PCB基本设计流程如下 xff1a 前期准备 gt PCB结构设计 gt PCB布局 gt 布线 gt 布线优化和丝印 gt 网络和DRC检查和结构检查 gt 制版 一 画原理图 完成后检查元件的封装 连线是否正确 核实电路结构 xff
  • 立创eda学习笔记十一:立创eda、立创商城、嘉立创的区别

    简单来说 xff1a 立创eda是一个画原理图和pcb的eda软件 xff0c 类似于ad 立创商城是一个卖元器件网上平台 xff0c 类似于淘宝 嘉立创是一个生产pcb板 给pcb板贴片的生产厂家 一般情况下 xff0c 你可以在立创ed
  • 立创eda学习笔记十七:铺铜

    铺铜是pcb设计很常用的指令 xff0c 或者是必然用到的指令 xff0c 很多时候布线的时候不去画gnd的线 xff0c 把其他线画好了之后 xff0c 再统一铺铜作为gnd xff0c 这样方便很多 铺铜这个概念可以理解为大面积的布线
  • 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程

    可以通过以下办法找到教程 xff1a 1 xff0c 在软件界面点帮助 使用教程 2 xff0c 在网站首页 帮助 教程进入 如何使用教程 xff1a 这里是一级目录 xff0c 其实对新手最有用的是前面3个部分 xff0c 后面的仿真先不
  • 立创eda学习笔记二十四:拼板

    这里主要是两部分 xff1a 自带拼板和手动拼板 xff0c 软件自带拼板功能 xff0c 那么手动拼板当然就是自己重新画图拼板了 一般用自带拼板功能就可以了 xff0c 把单板画好之后很容易就拼好了 xff0c 完全不用动任何器件和丝印编
  • Prometheus实战教程:监控mysql数据库

    今天我们使用prometheus 43 Grafana 43 mysql exporter实现监控mysql数据库各项指标数据 mysql exporter xff1a 采集mysql数据库各项指标数据 prometheus xff1a 获
  • prometheus常用exporter下载地址大全

    1 node exporter下载 https github com prometheus node exporter releases 2 blackbox exporter下载 https github com prometheus b
  • 论文润色 ‖ 一分钟教你如何写好SCI论文里的主题句,事半功倍

    今天 xff0c 小编来分享一下论文润色 xff0c SCI论文的主题句 xff08 Topic Sentences xff09 怎么写 xff1a 01什么是主题句 xff1f 主题句通常是段落开头的一句话 xff0c 是整个段落的小主题
  • Go xml文件处理

    在开发中会常遇到xml数据序列化和反序列化 xff0c 这里我们介绍go语言处理xml数据 encoding xml 包实现了一个简单的xml 1 0解析器 xff0c 可以理解xml名称空间 读取xml 示例 xff1a package

随机推荐

  • UC/OS-III 消息队列

    消息队列 一 消息队列基本概念讲解1 消息队列基本概念2 消息池2 1 消息池概念2 2 消息池初始化2 3 消息队列的运作机制2 4 消息队列的阻塞机制2 5 消息队列的应用场景 二 消息队列创建步骤1 定义消息队列2 创建消息队列 三
  • Altium Designer绘制stm32f103c8t6最小系统原理图

    文章目录 前言芯片封装自定义封装原理图绘制总结 前言 本文提供了初学者绘制stm32最小系统 xff0c 同时初学者的同学可以跟着小白学习绘制原理图哦 芯片封装 提示 xff1a 下载安装好Altium Designer之后才能进行以下操作
  • Jetson Xavier NX安装opencv3.x以及踩过的坑

    Jetson Xavier NX默认安装的是opencv4 x xff0c 在很多项目中其与opencv3 x xff0c 其中opencv3与opencv4中有部分函数是完全不同的 xff08 例如点一些Point的定义 xff0c Cv
  • 【导航算法】无人机路径跟踪L1导航算法

    L1导航算法是非常经典的非线性无人机路径跟随算法 xff0c 最早由MIT于2004年提出 xff0c 论文为 A New Nonlinear Guidance Logic for Trajectory Tracking xff0c 其导航
  • 【人工智能】1.问题求解:状态空间图和盲目搜索

    什么是问题求解 xff1f 问题求解可以理解为利用知识 xff0c 尽可能有效的找到问题的解 xff0c 或者最优解的过程 xff0c 主要包括 xff1a 1 xff09 问题描述方法 xff1a 状态空间法 xff0c 与或树表示法 x
  • 【路径规划】A*三维全局路径规划(附Python实现源码)

    1 A 启发式搜索 A 算法介绍 xff1a 启发式搜索算法 xff0c 除了wiki之外比较全的一个参考资料 xff1a A 启发式搜索算法详解 人工智能 这里是用Python写了一个简单的路径规划例子供参考 2 Matplotlib库
  • 【数据结构】3.图、最小生成树

    一 图的基本概念 1 什么是图 图表示一种多对多的关系 图包括 xff1a 1 xff09 一组顶点 xff1a 通常用 V Vertex 表示顶点集合 2 xff09 一组边 xff1a 通常用 E Edge 表示边的集合 3 xff09
  • 【NLP】主题模型文本分类

    自然语言处理之主题模型文本分类 LDA主题模型 1 主题模型 xff08 Topic Model xff09 主题模型是以非监督学习的方式对文集的隐含语义结构进行聚类的统计模型 主题模型主要被用于自然语言处理中的语义分析和文本挖掘问题 xf
  • 【NLP】Word2Vec模型文本分类

    自然语言处理之词向量模型聚类分析 Word Embedding 词嵌入向量 Word Embedding 是NLP里面一个重要的概念 xff0c 我们可以利用Word Embedding一个单词固定长度向量的表示一种表示形式 Word Em
  • (6.1)Kubernetes的Sevice服务间调用

    1 场景1 选择器 xff08 selector xff09 在k8s上运行了两个pod replicas 2 我们通过Service来整合这两个pod 在创建 Service 时 xff0c 就要通过选择器 xff08 selector
  • 【飞控算法】四旋翼飞行器控制原理与设计入门

    从动力学建模和几个四旋翼核心算法角度分析半自主飞控系统的建立 xff0c 即实现传统四旋翼的姿态控制和高度控制的过程 xff0c 文章主要借鉴了北航多旋翼设计课程 正点原子minifly微型四旋翼的资料 四旋翼无人飞行器设计 清华出版社 x
  • 【开源飞控】匿名飞控TI版解析(1)

    准备电赛的飞控题 xff0c 买来了匿名的飞控学习一下 xff0c 这里整理了一下匿名飞控中比较关键的几部分 xff0c 学习了一下原理 xff0c 然后代码解读都写注释里了 xff0c 篇幅较长 目录 一 遥控器信号接收 1 代码解读 2
  • 【开源飞控】匿名飞控TI版解析(2)

    因为电赛 xff0c 买来匿名飞控研究一下 xff0c 感觉相比其他的一下开源飞控 xff0c 易开发性和稳定性都是比较好的 xff0c 但就是比较贵 匿名TI版飞控是从32版改过来的 xff0c 硬件上就换了个芯片 xff0c 程序里也有
  • ROS中机器人与电脑的网络配置

    打开网络连接菜单 xff1a 选择网络 xff0c 输密码 并连接 xff08 以350502为例 xff0c 这里我就不连进去这个WiFi了 xff0c 还是连回402 xff0c 意思到了就行 xff09 查看连接信息 xff08 GU
  • ROS学习笔记之——gazebo仿真

    本博文是本人学习gazebo的学习记录 Gazebo是一款3D仿真器 xff0c 支持机器人开发所需的机器人 传感器和环境模型 xff0c 并且通过搭载的物理引擎可以得到逼真的仿真结果 Gazebo是近年来最受欢迎的三维仿真器之一 xff0
  • ROS学习笔记之——gazebo模型(URDF)

    最近在学习gazebo仿真 在之前博文里面 学习笔记之 gazebo仿真 xff0c 在介绍深度相机的ROS插件的时候 xff0c 涉及到了gazebo里面的一些模型文件架构的定义 本博文主要是对模型文件的定义做学习记录 目录 Model
  • ROS学习笔记之——ROS与gazebo之间的控制关系

    之前博客 学习笔记之 gazebo仿真 有采用用ricz来监控gazebo中的机器人 本博文对其进行深入的介绍 本文以 ROS学习笔记之 gazebo模型 xff08 URDF xff09 中的RRBot为例 目录 ros control
  • ROS学习笔记之——移动机器人的导航

    之前博客 ROS学习笔记之 激光雷达SLAM建图 已经介绍过如何通过激光雷达SLAM建图了 xff0c 本博文讲一下ROS机器人的导航相关 目录 导航相关理论介绍 导航的概述 costmap AMCL Dynamic Window Appr
  • ROS学习笔记之——EKF (Extended Kalman Filter) node 扩展卡尔曼滤波

    最近正好准备想试试利用EKF实现多传感器的融合 但没想到本身ROS里面就已经有EKF的功能包了 这个包用于评估机器人的3D位姿 xff0c 使用了来自不同源的位姿测量信息 xff0c 它使用带有6D xff08 3D position an
  • ROS学习笔记之——路径规划及avoid obstacles

    之前博客 ROS学习笔记之 Navigation Stack及路径规划 介绍了navigation stack xff0c 其中涉及到的amcl 路径规划以及避障还没有详细的展开 目录 AMCL 路径规划 全局路径规划中的地图 栅格地图 x