# 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](https://img.kancloud.cn/79/cc/79cc5bec6aef534fa6806c872b9b07e2_1060x435.png)
上图中位于导航功能正中心的是`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`类型,为每一时刻规划的速度信息。
- 前言
- 第一章 ROS简介
- 机器人时代的到来
- ROS发展历程
- 什么是ROS
- 安装ROS
- 安装ROS-Academy-for-Beginners教学包
- 二进制与源码包
- 安装RoboWare Studio
- 单元测试一
- 第二章 ROS文件系统
- Catkin编译系统
- Catkin工作空间
- Package软件包
- CMakeLists.txt
- package.xml
- Metapacakge软件元包
- 其他常见文件类型
- 单元测试二
- 第三章 ROS通信架构(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常见msg类型
- 单元测试三
- 第四章 ROS通信架构(二)
- Service
- Srv
- Parameter server
- Action
- 常见srv类型
- 常见action类型
- 单元测试四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 单元测试五
- 第六章 roscpp
- Client Library与roscpp
- 节点初始、关闭与NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 时钟
- 日志与异常
- 第七章 rospy
- Rospy与主要接口
- Topic in rospy
- Service in rospy
- Param与Time
- 第八章 TF与URDF
- 认识TF
- TF消息
- tf in c++
- tf in python
- 统一机器人描述格式
- 附录:TF数学基础
- 三维空间刚体运动---旋转矩阵
- 三维空间刚体运动---欧拉角
- 三维空间刚体运动---四元数
- 第九章 SLAM
- 地图
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附录:Navigation工具包说明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery