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,来看这张图:

slam_gmapping

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

输入

  • /tf:提要提供的tf包括map_frameodom_framebase_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类型,为每一时刻规划的速度信息。

results matching ""

    No results matching ""