前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Navigation Stack

Navigation Stack

作者头像
小飞侠xp
发布2019-05-17 12:00:57
1.1K0
发布2019-05-17 12:00:57
举报

Navigation Stack是一个ROS的metapackage,里面包含了ROS在路径规划、定位、地图、异常行为恢复等方面的package,其中运行的算法都堪称经典。Navigation Stack的主要作用就是路径规划,通常是输入各传感器的数据,输出速度。一般我们的ROS都预装了Navigation。 Navigation Stack的源代码位于https://github.com/ros-planning/navigation,包括了以下几个package:

工作框架

上图中位于导航功能正中心的是 move_base 节点,可以理解为一个强大的路径规划器,在实际的导航任务中,你只需要启动这一个node,并且给他提供数据,就可以规划出路径和速度。 move_base 之所以能做到路径规划,是因为它包含了很多的插件,像图中的白色圆圈 global_plannerlocal_plannerglobal_costmaplocal_costmaprecovery_behaviors。这些插件用于负责一些更细微的任务:全局规划、局部规划、全局地图、局部地图、恢复行为。而每一个插件其实也都是一个package,放在Navigation Stack里。 关于move_base我们后面会进一步介绍,先来看看 move_base外围有哪些输入输出。

输入
  • /tf :提要提供的tf包括 map_frame 、 odom_frame 、 base_frame 以及机器人各关节之间的 完成的一棵tf树。
  • /odom :里程计信息
  • /scan 或 /pointcloud :传感器的输入信息,最常用的是激光雷达 (sensor_msgs/LaserScan类型),也有用点云数据(sensor_msgs/PointCloud)的。
  • /map :地图,可以由SLAM程序来提供,也可以由 map_server 来指定已知地图。

以上四个Topic是必须持续提供给导航系统的,下面一个是可随时发布的topic:

  • move_base_simple/goal :目标点位置。

有几点需要注意: 1.move_base并不会去发布tf,因为对于路径规划问题来说,假设地图和位置都是已知的,定位和建图是其他节点的事情。 2.sensor_topics一般输入是激光雷达数据,但也有输入点云的情况。 3.图中map_server是灰色,代表可选,并不表示 /map 这个topic是可选,必须提供地图给move_base。

输出

/cmd_vel : geometry_msgs/Twist 类型,为每一时刻规划的速度信息。

move_base与插件

move_base算得上是Navigation中的核心节点,之所以称之为核心,是因为它在导航的任务中处于支配地位,其他的一些package都是它的插件。 来看这张图

move_base要运行起来,需要选择好插件,包括三种插 件: base_local_planner 、 base_global_planner 和 recovery_behavior ,这三种插件都得指 定,否则系统会指定默认值。

base_local_planner插件:
  • base_local_planner: 实现了Trajectory Rollout和DWA两种局部规划算法
  • dwa_local_planner: 实现了DWA局部规划算法,可以看作是base_local_planner的改进版 本
base_global_planner插件:
  • parrot_planner: 实现了较简单的全局规划算法
  • navfn: 实现了Dijkstra和A*全局规划算法
  • global_planner: 重新实现了Dijkstra和A*全局规划算法,可以看作navfn的改进版
recovery_behavior插件:
  • clear_costmap_recovery: 实现了清除代价地图的恢复行为
  • rotate_recovery: 实现了旋转的恢复行为
  • move_slow_and_clear: 实现了缓慢移动的恢复行为

除了以上三个需要指定的插件外,还有一个costmap插件,该插件默认已经选择好,无法更改

以上所有的插件都是继承于 nav_core 里的接口, nav_core 属于一个接口package,它只定义了三种插件的规范,也可以说定义了三种接口类,然后分别由以上的插件来继承和实现这些接口。因此如果你要研究路径规划算法,不妨研究一下 nav_core 定义的路径规划工作流程,然后仿照 dwa_local_planner 或其他插件来实现。

除了以上三个需要指定的插件外,还有一个costmap插件,该插件默认已经选择好,默认即为costmap_2d,不可更改,但costmap_2d提供了不同的Layer可以供我们设置

costmap

costmap是Navigation Stack里的代价地图,它其实也是move_base插件,本质上是C++的动态链接库,用过catkin_make之后生成.so文件,然后move_base在启动时会通过动态加载的方式调用其中的函数

代价地图

之前我们在介绍SLAM时讲过ROS里的地图的概念,地图就是 /map 这个topic,它也是一张图片,一个像素代表了实际的一块面积,用灰度值来表示障碍物存在的可能性。然而在实际的导航任务中,光有一张地图是不够的,机器人需要能动态的把障碍物加入,或者清楚已经不存在的障碍物,有些时候还要在地图上标出危险区域,为路径规划提供更有用的信息、 因为导航的需要,所以出现了代价地图。你可以将代价地图理解为,在 /map 之上新加的另外几层地图,不仅包含了原始地图信息,还加入了其他辅助信息。

代价地图有一下特点: 1.首先,代价地图有两张,一张是 local_costmap ,一张是 global_costmap ,分别用于局部路径规划器和全局路径规划器,而这两个costmap都默认并且只能选择 costmap_2d 作为插件。 2. 无论是 local_costmap 还是 global_costmap ,都可以配置他们的Layer,可以选择多个层次。costmap的Layer包括以下几种:

  • Static Map Layer:静态地图层,通常都是SLAM建立完成的静态地图。
  • Obstacle Map Layer:障碍地图层,用于动态的记录传感器感知到的障碍物信息。
  • Inflation Layer:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的外壳会撞上障碍物。
  • Other Layers:你还可以通过插件的形式自己实现costmap,目前已有 Social Costmap Layer 、 Range Sensor Layer 等开源插件。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工作框架
    • 输入
      • 输出
        • move_base与插件
          • base_local_planner插件:
            • base_global_planner插件:
              • recovery_behavior插件:
                • costmap
                  • 代价地图
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档