目录
8 Navigation
Navigation是机器人最基本的功能之一,ROS为我们提供了一整套Navigation的解决方案,包括全局与局部的路径规划、代价地图、异常行为恢复、地图服务器等。这个功能放在Navigation Stack这个ROS的metapackage中,里面包含了路径规划、定位、地图、异常行为恢复等方面的package。
包名 |
功能 |
amcl |
定位 |
fake_localization |
定位 |
map_server |
提供地图 |
move_base |
路径规划节点 |
nav_core |
路径规划的接口类,包括base_local_planner、 base_global_planner和recovery_behavior三个接口 |
base_local_planner |
实现了Trajectory Rollout和DWA两种局部规划算法 |
dwa_local_planner |
重新实现了DWA局部规划算法 |
parrot_planner |
实现了较简单的全局规划算法 |
navfn |
实现了Dijkstra和A*全局规划算法 |
global_planner |
重新实现了Dijkstra和A*全局规划算法 |
clear_costmap_recovery |
实现了清除代价地图的恢复行为 |
rotate_recovery |
实现了旋转的恢复行为 |
move_slow_and_clear |
实现了缓慢移动的恢复行为 |
costmap_2d |
二维代价地图 |
voxel_grid |
三维小方块 |
robot_pose_ekf |
机器人位姿的卡尔曼滤波 |
8.1 Navigation工作框架
输入:
- /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 :目标点位置。
输出:
- /cmd_vel : geometry_msgs/Twist 类型,为每一时刻规划的速度信息。格式如下:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
move_base提供的Service:
- make_plan: nav_msgs/GetPlan类型,请求为一个目标点,响应为规划的轨迹,但不执行该轨迹。
- clear_unknown_space: std_srvs/Empty类型,允许用户清除未知区域地图。
- clear_costmaps: std_srvs/Empty类型,允许用户清楚代价地图上的障碍物。
8.2 move_base
move_base是Navigation中的核心节点,它在导航的任务中处于支配地位,其他的一些package都是它的插件。
move_base要运行起来,需要选择好插件,包括三种插件: base_local_planner 、base_global_planner 和 recovery_behavior ,这三种插件都得指定,否则系统会指定默认值。Navigation为我们提供了不少候选的插件,可以在配置move_base时选择。
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插件:
该插件默认已经选择好,默认即为costmap_2d,不可更改。
在move_base的参数设置里可以选择插件。由于要配置的参数太多,通常会将配置写在一个yaml文件中,我们用 param/move_base_params.yaml 来保存以上参数。
8.3 Costmap
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 等开源插件。
可以同时选择多个Layer并存。
costmap配置也同样用yaml 来保存,由于costmap通常分为local和global的coastmap,我们习惯把两个代价地图分开。
8.4 map_server
在固定场景下,我们已经知道了地图(无论通过SLAM还是测量),这样机器人每次启动最好就能直接加载已知地图,而不是每次开机都重建。在这种情况下,就需要有一个节点来发布 /map ,提供场景信息。map_server就是这样一个功能包,它可以将已知地图发布出来,供导航和其他功能使用,也可以保存SLAM建立的地图。
要让map_server发布 /map ,需要输入给它两个文件:
- 地图文件,通常为pgm格式;
- 地图的描述文件,通常为yaml格式
有了以上两个文件,就可以通过指令来加载这张地图, map_server相关命令如下:
- rosrun map_server map_server Software_Museum.yaml 加载自定义的地图
- rosrun map_server map_saver -f mymap 保存当前地图为mymap.pgn和mymap.yaml
map_server会提供以下topic和service:
- Topic
- /map_metadata: 发布地图的描述信息
- /map: 发布锁存的地图消息
- Service
- static_map: 用于请求和响应当前的静态地图。
Param:map_server有一个参数需要设置,就是发布地图的frame。
~frame_id: string类型,默认为map。 绑定发布的地图与tf中的哪个frame,通常就是map。
8.5 AMCL 定位
Adaptive Mentcarto Localization(AMCL):蒙特卡洛自适应定位是一种很常用的定位算法,它通过比较检测到的障碍物和已知地图来进行定位。
AMCL上的通信架构如下图:
与之前SLAM的框架很像,最主要的区别是 /map 作为了输入,而不是输出,因为AMCL算法只负责定位,而不管建图。
评论(0)
您还未登录,请登录后发表或查看评论