# 2.6 Metapackage
# 2.6.1 Metapackage介紹
在一些ROS的教學資料和博客里,你可能還會看到一個Stack(功能包集)的概念,它指的是將多個功能接近、甚至相互依賴的軟件包的放到一個集合中去。但Stack這個概念在Hydro之后就取消了,取而代之的就是Metapackage。盡管換了個馬甲,但它的作用沒變,都是把一些相近的功能模塊、軟件包放到一起。
ROS里常見的Metapacakge有:
| Metapacakge名稱 | 描述 | 鏈接 |
| :------: | :------: | :------: |
| navigation | 導航相關的功能包集 | https://github.com/ros-planning/navigation |
| moveit | 運動規劃相關的(主要是機械臂)功能包集 | https://github.com/ros-planning/moveit |
| image_pipeline | 圖像獲取、處理相關的功能包集 | https://github.com/ros-perception/image_common |
| vision_opencv | ROS與OpenCV交互的功能包集| https://github.com/ros-perception/vision_opencv |
| turtlebot | Turtlebot機器人相關的功能包集 | https://github.com/turtlebot/turtlebot |
| pr2_robot | pr2機器人驅動功能包集 | https://github.com/PR2/pr2_robot |
| ... | ...|...|
以上列舉了一些常見的功能包集,例如navigation、turtlebot,他們都是用于某一方面的功能,以navigation metapackage(官方介紹里仍然沿用stack的叫法)為例,它包括了以下軟件包:
| 包名 | 功能 |
| :------: | :------: |
| navigation | Metapacakge,依賴以下所有pacakge |
| amcl | 定位 |
| fake_localization | 定位 |
| map_server | 提供地圖 |
| move_base | 路徑規劃節點 |
| nav_core | 路徑規劃的接口類|
| base_local_planner | 局部規劃 |
| dwa_local_planner| 局部規劃|
| ... | ... | ... |
具體功能介紹,我們留到第九章,這里只看一個軟件包navigation。這個navigation就是一個簡單的pacakge,里面只有幾個文件,但由于它依賴了其他所有的軟件包。Catkin編譯系統會明白,這些軟件包都屬于navigation metapacakge。
這個道理并不難理解,比如我們在安裝ROS時,用到了`sudo apt-get install ros-kinetic-desktop-full`命令,由于它依賴了ROS所有的核心組件,我們在安裝時也就能夠安裝整個ROS。
## 2.6.2 Metapackage寫法
我們以ROS-Academy-for-beginners為例介紹meteapckage的寫法,在教學包內,有一個`ros-academy-for-beginners`軟件包,該包即為一個metapacakge,其中有且僅有兩個文件:`CMakeLists.txt`和`pacakge.xml`。
`CMakeLists.txt`寫法如下:
```cmake
cmake_minimum_required(VERSION 2.8.3)
project(ros_academy_for_beginners)
find_package(catkin REQUIRED)
catkin_metapackage() #聲明本軟件包是一個metapacakge
```
`pacakge.xml`寫法如下:
```xml
<package>
<name>ros_academy_for_beginners</name>
<version>17.12.4</version>
<description>
--------------------------------------------------------------------------
A ROS tutorial for beginner level learners. This metapacakge includes some
demos of topic, service, parameter server, tf, urdf, navigation, SLAM...
It tries to explain the basic concepts and usages of ROS.
--------------------------------------------------------------------------
</description>
<maintainer email="chaichangkun@163.com">Chai Changkun</maintainer>
<author>Chai Changkun</author>
<license>BSD</license>
<url>http://http://www.droid.ac.cn</url>
<buildtool_depend>catkin</buildtool_depend>
<run_depend>navigation_sim_demo</run_depend> <!--注意這里的run_depend標簽,將其他軟件包都設為依賴項-->
<run_depend>param_demo</run_depend>
<run_depend>robot_sim_demo</run_depend>
<run_depend>service_demo</run_depend>
<run_depend>slam_sim_demo</run_depend>
<run_depend>tf_demo</run_depend>
<run_depend>topic_demo</run_depend>
<export> <!--這里需要有export和metapacakge標簽,注意這種固定寫法-->
<metapackage/>
</export>
</package>
```
metapacakge中的以上兩個文件和普通pacakge不同點是:
* `CMakeLists.txt`:加入了catkin_metapackage()宏,指定本軟件包為一個metapacakge。
* `package.xml`:<run_depend>標簽將所有軟件包列為依賴項,<export>標簽中添加<metapackage>標簽聲明。
metapacakge在我們實際開發一個大工程時可能有用
- 前言
- 第一章 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