【ROS1】13-元功能包
目录
一、什么是元功能包
二、为什么要使用元功能包?
三、创建元功能包
3.1 新建功能包
3.2 修改package.xml
3.3 修改CMakeLists.txt
四、著名元功能包示例
一、什么是元功能包
简单来说,元功能包是一个“空”的包,它本身不包含任何代码、节点或文件(除了 package.xml 和 CMakeLists.txt),它的唯一作用就是将一组相关的ROS包组织在一起,作为一个单一的单元进行引用。
你可以把它想象成一个“购物清单”或者一个“快捷方式集合”。当你安装这个元功能包时,ROS的包管理工具(如 apt)会自动安装这个“清单”上列出的所有包。
关键特征:
-
没有代码:它不包含 src, include, scripts, launch 等常规的ROS包目录。
-
核心是 package.xml:所有的依赖关系都定义在 package.xml 文件中。
-
使用 <export> 和 <run_depend>:通过这两个标签来声明它所“包含”的包。
-
特殊的 CMakeLists.txt:它的 CMakeLists.txt 文件非常简单,只包含一个特殊的 catkin_metapackage() 宏。
二、为什么要使用元功能包?
元功能包解决了几个关键问题:
-
简化依赖管理:
-
对于用户:用户不需要手动安装一个功能(比如导航)所需的所有零散包(move_base, amcl, gmapping, map_server 等)。他们只需要安装一个元功能包,比如 ros-noetic-navigation,所有相关的包都会被自动安装。
-
对于开发者:当你的项目依赖一个复杂的功能时,你只需要在你的 package.xml 中添加对这个元功能包的依赖,而不是对它包含的十几个包逐一添加依赖。
-
-
软件集合的发布与分发:
-
ROS发行版本身就是通过元功能包组织的。例如,ros-noetic-desktop-full 是一个元功能包,它聚合了所有桌面完整版ROS应该包含的包(rqt, rviz, simulators, navigation, perception等)。
-
如果你开发了一套用于某个特定机器人的软件(比如驱动、控制、感知、模拟),你可以创建一个元功能包 my_robot_meta,将所有这些包组合起来,方便其他人一键安装和使用你的机器人软件栈。
-
-
逻辑分组和项目组织:
-
在一个大型的 catkin 工作空间中,你可能有几十个包。使用元功能包可以将功能上相关的包(比如所有与“感知”相关的包)在概念上捆绑在一起,使项目结构更清晰。
-
三、创建元功能包
在之前的文章中我们已经在一个工作空间中实现了发布订阅、请求响应和参数服务器功能,现在我想通过元功能包将这三个功能包关联到一起。
3.1 新建功能包
在工作空间的src目录下通过如下命令创建一个名为“pumbing_my”的功能包,不含任何依赖
catkin_create_pkg pumbing_my
可以看到该功能包只有“CMakeLists.txt”和“package.xml”两个文件
此时元功能包创建完毕
3.2 修改package.xml
打开“package.xml”,添加如下内容来表示本元功能包包含了哪些功能包
添加如下标签,明确告诉 catkin 和其他ROS工具,这个包是一个元功能包。
“package.xml”完整内容如下:
<?xml version="1.0"?>
<package format="2"><name>pumbing_my</name><version>0.0.0</version><description>The pumbing_my package</description><!-- One maintainer tag required, multiple allowed, one person per tag --><!-- Example: --><!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --><maintainer email="chaochao@todo.todo">chaochao</maintainer><!-- One license tag required, multiple allowed, one license per tag --><!-- Commonly used license strings: --><!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --><license>TODO</license><!-- Url tags are optional, but multiple are allowed, one per tag --><!-- Optional attribute type can be: website, bugtracker, or repository --><!-- Example: --><!-- <url type="website">http://wiki.ros.org/pumbing_my</url> --><!-- Author tags are optional, multiple are allowed, one per tag --><!-- Authors do not have to be maintainers, but could be --><!-- Example: --><!-- <author email="jane.doe@example.com">Jane Doe</author> --><!-- The *depend tags are used to specify dependencies --><!-- Dependencies can be catkin packages or system dependencies --><!-- Examples: --><!-- Use depend as a shortcut for packages that are both build and exec dependencies --><!-- <depend>roscpp</depend> --><!-- Note that this is equivalent to the following: --><!-- <build_depend>roscpp</build_depend> --><!-- <exec_depend>roscpp</exec_depend> --><!-- Use build_depend for packages you need at compile time: --><!-- <build_depend>message_generation</build_depend> --><!-- Use build_export_depend for packages you need in order to build against this package: --><!-- <build_export_depend>message_generation</build_export_depend> --><!-- Use buildtool_depend for build tool packages: --><!-- <buildtool_depend>catkin</buildtool_depend> --><!-- Use exec_depend for packages you need at runtime: --><!-- <exec_depend>message_runtime</exec_depend> --><!-- Use test_depend for packages you need only for testing: --><!-- <test_depend>gtest</test_depend> --><!-- Use doc_depend for packages you need only for building documentation: --><!-- <doc_depend>doxygen</doc_depend> --><buildtool_depend>catkin</buildtool_depend><exec_depend>plumbing_pub_sub</exec_depend><exec_depend>plumbing_server_client</exec_depend><exec_depend>plumbing_param_server</exec_depend><!-- The export tag contains other, unspecified, tags --><export><!-- Other tools can request additional information be placed here --><metapackage /></export>
</package>
3.3 修改CMakeLists.txt
打开“CMakeLists.txt”添加如下一行,
cmake_minimum_required(VERSION 3.0.2)
project(pumbing_my)
find_package(catkin REQUIRED)
catkin_metapackage()
编译。
当把这个元功能包发布后,用户只需要执行 sudo apt-get install ros-<distro>-pumbing_my,apt 就会自动解决依赖关系,并安装 plumbing_pub_sub、plumbing_server_client、 和 plumbing_param_server 这三个包。
四、著名元功能包示例
为了更好地理解,可以看看ROS中一些著名的元功能包:
-
navigation:
-
包含 move_base, amcl, gmapping, dwa_local_planner, global_planner 等一系列用于机器人2D导航的包。
-
在Github上查看它的 package.xml: https://github.com/ros-planning/navigation/blob/noetic-devel/package.xml
-
你会发现它本身就是一个元功能包,同时还依赖了另一个元功能包 navigation_msgs。
-
-
desktop_full:
-
ros-noetic-desktop-full 是新用户安装ROS时最常用的包。
-
它聚合了 desktop, perception, simulators 等多个元功能包,提供了一个完整的、开箱即用的ROS开发环境。
-
-
moveit:
-
moveit 元功能包聚合了所有与MoveIt!运动规划框架相关的核心包。
-