最近没啥可写博客了的,而且自己的毕业设计刚好是ROS的SLAM+MoveIt相关的,怕写的太多论文查重没法通过。

最近有小伙伴联系到我,问了我八个ROS问题,我觉得很有意义,所以在这里给大家整理一下供大家一起学习。

大家在学习有困惑可以发送问题给我(1692697820@qq.com),我会找时间整理并回复大家。也欢迎大家在“泡泡”里面进行提问~

这里我们来讲解第七个问题,如何对于导航中的路径规划算法进行优化呢?经常听到A*算法和迪杰斯特拉算法,但完全不知道怎么修改?


这个问题,我是想放弃解答的~

不知道你们有没有发现,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算法进行全局路径规划,局部规划有D

WA、TEB、MPC三种。在ROS下使用A*算法、RRT算法等实现规划,可以借鉴以下内容(我看的似懂非懂)。

在ROS中实现A*路径规划算法

在ROS中实现RRT路径规划算法

确实是很多纯理论的东西,转成代码到实际应用,还需要很长的时间~