当前位置: 首页 > news >正文

【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() 宏。

二、为什么要使用元功能包?

元功能包解决了几个关键问题:

  1. 简化依赖管理

    • 对于用户:用户不需要手动安装一个功能(比如导航)所需的所有零散包(move_base, amcl, gmapping, map_server 等)。他们只需要安装一个元功能包,比如 ros-noetic-navigation,所有相关的包都会被自动安装。

    • 对于开发者:当你的项目依赖一个复杂的功能时,你只需要在你的 package.xml 中添加对这个元功能包的依赖,而不是对它包含的十几个包逐一添加依赖。

  2. 软件集合的发布与分发

    • ROS发行版本身就是通过元功能包组织的。例如,ros-noetic-desktop-full 是一个元功能包,它聚合了所有桌面完整版ROS应该包含的包(rqt, rviz, simulators, navigation, perception等)。

    • 如果你开发了一套用于某个特定机器人的软件(比如驱动、控制、感知、模拟),你可以创建一个元功能包 my_robot_meta,将所有这些包组合起来,方便其他人一键安装和使用你的机器人软件栈。

  3. 逻辑分组和项目组织

    • 在一个大型的 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!运动规划框架相关的核心包。

http://www.dtcms.com/a/317868.html

相关文章:

  • electron:vue3+vite打包案例
  • 从零搭建React框架--第一章:create-react-app、antd、less
  • LAS平台Vibe Data Processing:AI驱动的数据处理新范式
  • Chrontel昆泰-【CH7036A-BF】CH7036 LVDS to HDMI/VGA/LVDS Converter
  • 基于MATLAB实现的具有螺旋相位板的4F系统用于图像边缘增强的仿真
  • 软件定义汽车 --- 电子电气架构的驱动
  • 在ubuntu上使用jenkins部署.net8程序
  • 【概念学习】早期神经网络
  • Redis 缓存三大核心问题:穿透、击穿与雪崩的深度解析
  • [AI 生成] hive 面试题
  • Document Object Model
  • 机器学习-LinearRegression
  • harbor仓库搭建(配置https)
  • MCU程序的编译与链接及格式转换
  • 防御保护防火墙简单实验报告
  • Git 乱码文件处理全流程指南:从识别到彻底清除
  • MySQL的约束条件:
  • 【Linux】调试器gdb/cgdb的使用
  • 生成式 AI 重塑自动驾驶仿真:4D 场景生成技术的突破与实践
  • vector使用模拟实现
  • 牛客AI简历筛选:破解秋招效率难题
  • 向量数据库基础入门:RAG 与向量检索基础认知构建
  • 《C语言程序设计》笔记p9
  • LLM——浅谈 LangGraph 中断式工作流:构建一个可交互的问答流程
  • 4、docker数据卷管理命令 | docker volume
  • 【关于Java的对象】
  • vue3 el-dialog自定义实现拖拽、限制视口范围增加了拖拽位置持久化的功能
  • 实战教程:从“对象文件为空“到仓库重生——修复 Git 仓库损坏全记录
  • 大数据存储域——Hive数据仓库工具
  • STM32 APP跳转后无法进入中断