10.1 Navigation Stack
10.1.1 Navigation Stack
Navigation Stack是一个ROS的metapackage,里面包含了ROS在路径规划、定位、地图、异常行为恢复等方面的package,其中运行的算法都堪称经典。Navigation Stack的主要作用就是路径规划,通常是输入各传感器的数据,输出速度。一般我们的ROS都预装了Navigation。
Navigation Stack的源代码位于https://github.com/ros-planning/navigation,包括了以下几个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 | 机器人位姿的卡尔曼滤波 |
这么多package,你可能会觉得很乱,不过担心,在使用中其实还是比较简单的,我们接下来会对常用的主要功能进行介绍。
10.1.2 Navigation工作框架
机器人的自主导航功能基本全靠Navigation中的pacakge,来看这张图:
上图中位于导航功能正中心的是move_base
节点,可以理解为一个强大的路径规划器,在实际的导航任务中,你只需要启动这一个node,并且给他提供数据,就可以规划出路径和速度。
move_base
之所以能做到路径规划,是因为它包含了很多的插件,像图中的白色圆圈global_planner
、local_planner
、global_costmap
、local_costmap
、recovery_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
类型,为每一时刻规划的速度信息。