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_minimum_required(VERSION 2.8.3)
project(ros_academy_for_beginners)
find_package(catkin REQUIRED)
catkin_metapackage() #声明本软件包是一个metapacakge
pacakge.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="[email protected]">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
:标签将所有软件包列为依赖项, 标签中添加 标签声明。
metapacakge在我们实际开发一个大工程时可能有用