# 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`類型,為每一時刻規劃的速度信息。
- 前言
- 第一章 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