写在前面
我在CSDN上写了一套关于ros基础的图文教程,欢迎关注!!!
navigation stack
如图所示,关键包是中间的白框move_base
其中具体包括:全局路径规划,局部路径规划,全局代价地图,局部代价地图以及恢复行为
输入:
- /tf 相关传感器与base_frame的
- odom 和 sensor(激光雷达,深度相机) 实时数据
- /map
输出:对应的速度到控制器模块
1. 关键包move_base详解
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或其他插件来实现。
2. costmap详解
- 本质上也是个插件:一个C++的动态链接库,在调用move_base过程中动态调用其中相关函数。
- costmap特点:
- 首先,代价地图有两张,一张是local_costmap,一张是global_costmap,分别用于局部路径规划器和全局路径规划器,而这两个costmap都默认并且只能选择costmap_2d作为插件。
- 无论是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等开源插件。
- 参数服务器配置
与move_base插件的配置类似,costmap配置也同样用yaml 来保存,其本质是维护在参数服务器上。由于costmap通常分为local和global的coastmap,我们习惯把两个代价地图分开。
3. map_Server详解
首先,从下图可知,mapserver是和参数服务器一样,单独拎出来放在package目录下。它是一个和地图相关的功能包,它可以将已知地图发布出来,供导航和其他功能使用,也可以保存SLAM建立的地图。
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三个通道的平均值
相关命令如下:
4. AMCL详解
Adaptive Mentcarto Localization(AMCL),蒙特卡洛自适应定位是一种很常用的定位算法,它通过比较检测到的障碍物和已知地图来进行定位。
AMCL上的通信架构如上图所示,与之前SLAM的框架很像,最主要的区别是/map作为了输入,而不是输出,因为AMCL算法只负责定位,而不管建图。
AMCl定位会对里程计误差进行修正,修正的方法是把里程计误差加到map_frame和odom_frame之间,而odom_frame和base_frame之间是里程计的测量值,这个测量值并不会被修正。这一工程实现与之前gmapping、karto的做法是相同的。
备注:航位推测法(英语:Dead reckoning,缩写:DR)是一种利用现在物体位置及速度推定未来位置方向的航海技术,现已应用至许多交通技术层面,但容易受到误差累积的影响。