本文主要链接了一些写得比较好的为文章:关于ROS在路径规划方面的应用
初步了解
文章来源:如何对于导航中的路径规划算法进行优化呢
不知道你们有没有发现,ROS到现在好多年了的,算法依旧还是那几个,很少有新的算法加入到ROS系统下,是因为算法经典吗?不,并不是!只是因为大多数算法仍然停留在“理论“阶段!
导航 = 定位+路径规划!
说到这里,我们不得不再来看一下move_base框架!
在使用ROS系统实现导航功能的时候,我们发布一个goal的内容,这个话题的内容由坐标点(右手坐标系)和姿态(四元数)组成,是机器人将要前往的坐标点数值及达到这个坐标点的时候,机器人处于什么样的一个姿态!在前往这个点的过程当中,我们需要通过map_server地图服务器来加载更新地图数据,我们需要传感器数据(LaserScan或者PointCloud)来感知环境,我们需要里程计(编码器计数,好点的加个IMU)数据来进行位置和姿态估计,机器人中心点坐标和各个传感器坐标、以及机器人在地图上的位置,是通过tf来描述,机器人在地图上的位置,是通过amcl来实现定位。在前往目标点的过程当中,会根据这些数据发布一个cmd_vel给底盘驱动器来执行。
在这个框架的里面,分为global_planner全局规划器、global_costmap全局代价地图和local_planner局部规划器和local_costmap局部代价地图,以及recovery_behaviors自恢复机制。
机器人起始是一个坐标点,达到的位置是一个坐标点。在这两点所规划的路线就是全局路线,全局代价地图就是整个地图。在ROS下我们使用的是栅格地图,分为障碍物区域、可行驶区域、未知区域(应该基本就这三种,个人理解)。
这里每一种颜色我们可以假设一个值,通过数据结构的一些算法就可以计算得出一条路径。比如Dijkstra(迪杰斯特拉)算法、Floyd(弗洛伊德)算法,这些是在数据结构上面简单基础的,复杂一些的比如A*算法、LPA算法等等内容。这些算法的学习并不困难,难的是如何把这些算法应用在自己的设计上面。(关于Dijkstra算法可参考《听我给你吹——Dijkstra算法》)
机器人在执行全局规划好的路线时,外界环境可能出现变化(比如出现一个人、或者增加了障碍物)导致无法通过等情况都是有可能的。机器人在执行路线的时候,也是一段一段的来执行,在某一段的情况下,就需要通过局部代价地图来进行局部路径规划。
这张图里面的那个框,就是局部地图的范围。在局部地图当中,我们对雷达识别的障碍物轮廓进行了”不同等级的膨胀“处理,每种颜色都是一个对应的值,通过这些值来决策规划最优路线。其实这里有些扯。如果你玩过这部分内容的话,你会发现机器人是“贴墙”走的,这就是最优!
recovery_behaviors自恢复机制很有用,当机器人定位丢失的情况下,就会启动自恢复机制。这个时候你会发现机器人会原地转圈,尝试着找到一个相对准确的定位。其实很多情况下是姿态问题才导致定位丢失,坐标数值的话,基本你不是抱着车跑的情况下,坐标基本不会丢。所以做多传感融合还是十分有必要的。
那么自己写的算法怎么加入到ROS系统下,先别急!我们再来聊两个东西DWA(Dynamic Window Approach,动态窗口方法)路径规划算法和TEB(Timed Elastic Band)路径规划算法,MPC(Model Predictive Control,模型预测控制)路径规划算法也不错!这三个是现在ROS用的最多的三个,也是开源的,其中DWA局部路径规划器可以说是最基础应用到的。
机器人在获得目的地信息后,首先经过全局路径规划规划出一条大致可行的路线,然后调用局部路径规划器根据这条路线及costmap的信息规划出机器人在局部时做出具体行动策略。在ROS中每当move_base处于规划状态就调用DWA算法计算出一条最佳的速度指令,发送给机器人运动底盘执行。
在ros move base控制循环中会在规划出新的路径时,将新的全局路径利用setPlan传给DWAPlannerROS,直接保存为global_plan_。此时的路径时相对于全局地图的全局坐标系的(通常为"map")。在计算速度前,会先将全局路径映射到局部地图坐标系下(通常为“odom”),在getLocalPlan中,先将较长的全局路径映射并截断到局部地图内(即坐标系转换为局部地图,且范围完全在局部地图内,超出地图的则抛弃,局部地图为costmap),局部地图使用的是rolling_window。然后,裁减全局路径和局部路径(与机器人当前位置距离超过1m的旧的路径会被裁减掉)。有了局部的目标点,就可以做规划了。
在ROS中的全局规划,navigation功能包以Dijkstra算法进行全局路径规划,局部规划有DWA、TEB、MPC三种。在ROS下使用A*算法、RRT算法等实现规划.
什么是代价地图?
详细讲解了各个yaml文件的含义,可以多学习!
在现实环境中,总会有各种无法预料到的新障碍物出现在当前地图中,或者旧的障碍物现在已经从环境地图中被移除掉了,那么我们就需要来随时更新这张地图。同时由于默认的地图是一张黑白灰三色地图,即只会标出障碍物区域、自由移动区域和未被探索区域。机器人在这样的地图中进行路径规划,会导致规划的路径不够安全,因为我们的机器人在移动时需要与障碍物之间保持一定的安全缓冲距离,这样机器人在当前地图中移动时就更安全了。
costmap简单来说就是为了在这张地图上进行各种加工,方便我们后面进行路径规划而存在的。那具体该如何实现costmap呢?在ROS中使用costmap_2d这个软件包来实现的,该软件包在原始地图上实现了两张新的地图。一个是local_costmap,另外一个就是global_costmap,根据名字大家就可以知道了,两张costmap一个是为局部路径规划准备的,一个是为全局路径规划准备的。无论是local_costmap还是global_costmap,都可以配置多个图层,包括下面几种:
Static Map Layer:静态地图层,基本上不变的地图层,通常都是SLAM建立完成的静态地图。
Obstacle Map Layer:障碍地图层,用于动态的记录传感器感知到的障碍物信息。
Inflation Layer:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的撞上障碍物。
Other Layers:你还可以通过插件的形式自己实现costmap,目前已有Social Costmap Layer、Range Sensor Layer等开源插件。
深入了解
ROS入门(九)——机器人自动导航(介绍、地图、定位和路径规划)
文章很细,有代码有案例
ROS学习笔记之——路径规划及avoid obstacles
关于路径规划的算法讲解的很多,有动图演示!
ROS学习笔记-机器人导航(仿真)2-路径规划move_base
详细讲解了:路径规划算法在move_base功能包的move_base节点中已经封装完毕了,但是还不可以直接调用,因为算法虽然已经封装了,但是该功能包面向的是各种类型支持ROS的机器人,不同类型机器人可能大小尺寸不同,传感器不同,速度不同,应用场景不同…最后可能会导致不同的路径规划结果,那么在调用路径规划节点之前,我们还需要配置机器人参数。具体实现如下:
先编写launch文件模板
编写配置文件
集成导航相关的launch文件
测试