ROS-Navigation相关知识

navigation stack

如图所示,关键包是中间的白框move_base
其中具体包括:全局路径规划,局部路径规划,全局代价地图,局部代价地图以及恢复行为
输入:

  1. /tf 相关传感器与base_frame的
  2. odom 和 sensor(激光雷达,深度相机) 实时数据
  3. /map

输出:对应的速度到控制器模块


ROS-Navigation相关知识_第1张图片
关键包的数据流图

1. 关键包move_base详解

ROS-Navigation相关知识_第2张图片
image.png

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

如下为系统默认提供的插件:

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

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

2. costmap详解

  1. 本质上也是个插件:一个C++的动态链接库,在调用move_base过程中动态调用其中相关函数。
  2. costmap特点:
    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等开源插件。
  1. 参数服务器配置
    与move_base插件的配置类似,costmap配置也同样用yaml 来保存,其本质是维护在参数服务器上。由于costmap通常分为local和global的coastmap,我们习惯把两个代价地图分开。

3. map_Server详解

首先,从下图可知,mapserver是和参数服务器一样,单独拎出来放在package目录下。它是一个和地图相关的功能包,它可以将已知地图发布出来,供导航和其他功能使用,也可以保存SLAM建立的地图。


ROS-Navigation相关知识_第3张图片
某个package目录中的map

map服务器下的.yaml文件,大致规范如下:

image: Software_Museum.pgm  #指定地图文件
resolution: 0.050000    #地图的分辨率 单位为m/pixel
origin: [-25.000000, -25.000000, 0.000000]   #地图的原点
negate: 0    #0代表 白色为空闲 黑色为占据
occupied_thresh: 0.65  #当占据的概率大于0.65认为被占据
free_thresh: 0.196     #当占据的概率小于0.196认为无障碍

占据概率的计算方法:
occ = (255-color_avg)/255.0, color_avg为RGB三个通道的平均值
相关命令如下:


ROS-Navigation相关知识_第4张图片
map服务器相关命令

4. AMCL详解

Adaptive Mentcarto Localization(AMCL),蒙特卡洛自适应定位是一种很常用的定位算法,它通过比较检测到的障碍物和已知地图来进行定位。


ROS-Navigation相关知识_第5张图片
架构图

AMCL上的通信架构如上图所示,与之前SLAM的框架很像,最主要的区别是/map作为了输入,而不是输出,因为AMCL算法只负责定位,而不管建图。

AMCl定位会对里程计误差进行修正,修正的方法是把里程计误差加到map_frame和odom_frame之间,而odom_frame和base_frame之间是里程计的测量值,这个测量值并不会被修正。这一工程实现与之前gmapping、karto的做法是相同的。

ROS-Navigation相关知识_第6张图片
具体做法图例

备注:航位推测法(英语:Dead reckoning,缩写:DR)是一种利用现在物体位置及速度推定未来位置方向的航海技术,现已应用至许多交通技术层面,但容易受到误差累积的影响。

你可能感兴趣的:(ROS-Navigation相关知识)