【ROS2】初级:客户端-创建一个包

目标:使用 CMake 或 Python 创建一个新包,并运行其可执行文件。

 教程级别:初学者

 时间:15 分钟

 目录

  •  背景

    • 1. ROS 2 包是什么?

    • 2. 组成 ROS 2 包的是什么?

    • 3. 工作区中的包

  •  先决条件

  •  任务

    • 1. 创建一个包

    • 2. 打包

    • 3 源安装文件

    • 4. 使用该软件包

    • 5. 检查包裹内容

    •  6 自定义 package.xml

  •  摘要

  •  下一步

 背景

1 什么是 ROS 2 包?

一个包是您的 ROS 2 代码的组织单元。如果您想要安装您的代码或与他人共享,那么您需要将它组织在一个包中。通过包,您可以发布您的 ROS 2 工作,并允许他人轻松地构建和使用它。

在 ROS 2 中创建包使用 ament 作为其构建系统,colcon 作为其构建工具。您可以使用 CMake 或 Python 创建包,这两种方式都得到官方支持,尽管还存在其他构建类型。

2. 组成 ROS 2 包的是什么?

ROS 2 Python 和 CMake 包都有各自的最低要求内容:

CMake:

  • 描述如何在包内构建代码的 CMakeLists.txt 文件

  • 包含包公共头文件的 include/<package_name> 目录

  • 包含包元信息的 package.xml 文件

  • 包含包源代码的目录

81ee514fcabe789605e421198d70c7a8.png

Python:

  • 包含包元信息的 package.xml 文件

  • 标记文件为包

  • 当包含有可执行文件时,需要 setup.cfg ,以便 ros2 run 能够找到它们

  • 包含如何安装软件包的说明

  • <package_name> - 一个与您的包同名的目录,被 ROS 2 工具用来找到您的包,包含 __init__.py

最简单的包可能具有如下的文件结构:

CMake:

my_package/CMakeLists.txtinclude/my_package/package.xmlsrc/

Python:

my_package/package.xmlresource/my_packagesetup.cfgsetup.pymy_package/

3. 工作区中的包

一个工作空间可以包含任意多的包,每个包都在自己的文件夹中。你也可以在一个工作空间中拥有不同构建类型的包(CMake、Python 等)。你不能有嵌套的包。

最佳实践是在工作区内有一个 src 文件夹,并在其中创建你的包。这样可以保持工作区顶层的“整洁”。

一个简单的工作空间可能看起来像:

workspace_folder/src/cpp_package_1/CMakeLists.txtinclude/cpp_package_1/package.xmlsrc/py_package_1/package.xmlresource/py_package_1setup.cfgsetup.pypy_package_1/...cpp_package_n/CMakeLists.txtinclude/cpp_package_n/package.xmlsrc/

 先决条件

您在遵循上一教程的指导后,应该有一个 ROS 2 工作空间。您将在此工作空间中创建您的包。

任务

1. 创建一个包

首先,配置您的 ROS 2 安装。

让我们使用你在上一个教程中创建的工作空间, ros2_ws ,来为你的新包。

确保在运行打包创建命令之前,您在 src 文件夹中。

cd ~/ros2_ws/src

在 ROS 2 中创建新包的命令语法是:

CMake:

ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>

Python:

ros2 pkg create --build-type ament_python --license Apache-2.0 <package_name>

在本教程中,您将使用可选参数 --node-name 和 --license 。 --node-name 选项在包中创建一个简单的 Hello World 类型的可执行文件, --license 声明包的许可信息。

在终端中输入以下命令:

CMake:

ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package

Python:

ros2 pkg create --build-type ament_python --license Apache-2.0 --node-name my_node my_package

您的工作空间的 src 目录中现在将有一个名为 my_package 的新文件夹。

执行命令后,终端会返回消息:

cxy@ubuntu2404-cxy:~/ros2_ws/src$ ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package
going to create a new package
package name: my_package
destination directory: /home/cxy/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['cxy <cxy@todo.todo>']
licenses: ['Apache-2.0']
build type: ament_cmake
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source and include folder
creating folder ./my_package/src
creating folder ./my_package/include/my_package
creating ./my_package/CMakeLists.txt
creating ./my_package/src/my_node.cpp

您可以看到新包自动生成的文件。

2. 构建软件包

将包放在工作区中特别有价值,因为您可以通过在工作区根目录运行 colcon build 一次构建多个包。否则,您将不得不逐个构建每个包。

返回到您工作区的根目录:

cd ~/ros2_ws

现在您可以构建您的包:

colcon build

回想一下上一次教程,你在 ros2_ws 中也有 ros_tutorials 包。你可能已经注意到运行 colcon build 也构建了 turtlesim 包。当工作空间中只有几个包时,这是可以的,但是当有很多包时, colcon build 可能需要很长时间。

要想下次只构建 my_package 包,您可以运行:

colcon build --packages-select my_package
cxy@ubuntu2404-cxy:~/ros2_ws$ colcon build --packages-select my_package
Starting >>> my_package
Finished <<< my_package [2.39s]                     Summary: 1 package finished [2.63s]

3 源设置文件 

要使用您的新软件包和可执行文件,请首先打开一个新的终端并源于您的主要 ROS 2 安装。

然后,在 ros2_ws 目录内部运行以下命令来配置您的工作区:

source install/local_setup.bash

现在您的工作区已经添加到您的路径中,您将能够使用新包的可执行文件。

4. 使用该软件包

要运行您在包创建过程中使用 --node-name 参数创建的可执行文件,请输入命令:

ros2 run my_package my_node

将返回消息到您的终端:

cxy@ubuntu2404-cxy:~/ros2_ws$ ros2 run my_package my_node
hello world my_package package

5. 检查包内容

在 ros2_ws/src/my_package 内,您将看到 ros2 pkg create 自动生成的文件和文件夹:

CMakeLists.txt  include  package.xml  src

my_node.cpp 位于 src 目录内。这是您将来所有自定义 C++节点的存放位置。

d0721a3aad01c29758fe122a5a7276ae.png

6 自定义 package.xml

您可能已经注意到,在创建包后的返回消息中,字段 description 和 license 包含 TODO 注释。这是因为包描述和许可声明不会自动设置,但如果您想要发布您的包,这些是必需的。字段 maintainer 也可能需要填写。

从 ros2_ws/src/my_package ,使用您喜欢的文本编辑器打开 package.xml :

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>my_package</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="cxy@todo.todo">cxy</maintainer><license>Apache-2.0</license><buildtool_depend>ament_cmake</buildtool_depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

如果您的姓名和电子邮件没有自动填写,请在 maintainer 行输入您的姓名和电子邮件。然后,编辑 description 行来总结包内容:

<description>Beginner client libraries tutorials practice package</description>

然后,更新 license 行。您可以在这里了解更多关于开源许可证的信息。由于这个包仅用于练习,使用任何许可证都是安全的。我们将使用 Apache-2.0 :

<license>Apache-2.0</license>

编辑完成后,请不要忘记保存。

在许可证标签下面,您会看到一些以 _depend 结尾的标签名称。这是您的 package.xml 列出其对其他包的依赖性,以供 colcon 搜索的地方。 my_package 很简单,没有任何依赖性,但您会看到这个空间在即将到来的教程中被利用。

您现在已经完成了!

 摘要

您已创建了一个包来组织您的代码,并使其易于他人使用。

您的包已自动填充了必要的文件,然后您使用 colcon 进行构建,以便您可以在本地环境中使用其可执行文件。

 下一步

接下来,让我们向包中添加一些有意义的内容。您将从一个简单的发布/订阅系统开始,您可以选择用 C++ https://docs.ros.org/en/jazzy/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html 或 Python 编写https://docs.ros.org/en/jazzy/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Publisher-And-Subscriber.html。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1475546.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯发布2024大模型十大最新趋势!

近日&#xff0c;在2024世界人工智能大会上&#xff0c;腾讯正式发布了《2024大模型十大趋势——走进“机器外脑”时代》报告。目前&#xff0c;这一报告正在AI产业界各大社群快速传播。 报告中&#xff0c;腾讯研究院试图通过10个关键性的趋势&#xff0c;去理解全世界范围内正…

一文清晰了解HTML——简单实例

想要仿照该页面编写HTML代码&#xff1a; 在vscode中输入&#xff01;自动生成默认模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

为什么KV Cache只需缓存K矩阵和V矩阵,无需缓存Q矩阵?

大家都知道大模型是通过语言序列预测下一个词的概率。假定{ x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x3​&#xff0c;…&#xff0c; x n − 1 x_{n-1} xn−1​}为已知序列&#xff0c;其中 x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x…

第二证券股市资讯:深夜!突然暴涨75%!

一则重磅收买引发医药圈轰动。 北京时间7月8日晚间&#xff0c;美股开盘后&#xff0c;美国生物制药公司Morphic股价一度暴升超75%。音讯面上&#xff0c;生物医药巨子礼来公司官宣&#xff0c;将以57美元/股的价格现金收买Morphic&#xff0c;较上星期五的收盘价溢价79%&…

Dungeonborne卡顿延迟怎么办?这样降低Dungeonborne延迟

Dungeonborne将第一人称的动作的即时性和经典的西幻RPG职业设计深度结合&#xff0c;带来无与伦比的游戏体验。玩家在游戏中扮演一位从神秘地牢中醒来的勇士&#xff0c;他必须面对各种未知的敌人和挑战&#xff0c;逐渐揭开自己的身世之谜。在这个充满魔法和奇迹的世界里&…

微信如何快速回复信息呢?

时业务繁忙的时候可能会出现一大堆消息需要去回复&#xff0c;很多客户也会来问重复的问题&#xff0c;有时候回复消息也需要一个及时性&#xff0c;如果回复慢了有可能客户就跑了&#xff0c;那这个时候就会体现出自动回复的优势。 只要设置好一个关键词&#xff0c;只要对方…

朗新天霁eHR GetFunc_code.asmx SQL注入致RCE漏洞复现

0x01 产品简介 朗新天霁人力资源管理系统(LongShine eHR)是一款由北京朗新天霁软件技术有限公司研发的人力资源管理系统,该产品融合了国外先进的人力资源管理理念和国内大量人力资源管理实践经验,是国内功能较为全面、性价比较高的人力资源管理系统之一,系统凭借其集成化…

【C语言】auto 关键字详解

在C语言中&#xff0c;auto关键字用于声明局部变量&#xff0c;但它的使用已经变得很少见。事实上&#xff0c;从C99标准开始&#xff0c;auto关键字的默认行为就是隐含的&#xff0c;因此在大多数情况下无需显式使用它。 基本用法 在C语言中&#xff0c;auto关键字用于指定变…

Vulnhub靶场DC-6练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集1. wordpress扫描2. wordlists字典爆破 0x03 漏洞查找与利用1. 漏洞查找2. CVE-2018-15877漏洞利用3. 反弹shell5. nmap提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-6.zip 介绍&#…

代码随想录打卡第十三天

代码随想录–二叉树部分 day13 二叉树第一天 文章目录 代码随想录--二叉树部分二叉树基础知识一、力扣144--二叉树的前序遍历&#xff08;递归&#xff09;二、力扣145--二叉树的后序遍历&#xff08;递归&#xff09;三、力扣94--二叉树的中序遍历&#xff08;递归&#xff0…

【密码学】哈希函数与加密算法的关系

一、哈希函数的定义 哈希函数&#xff08;Hash Function&#xff09;&#xff0c;也被称为散列函数或杂凑函数&#xff0c; 是一种将任意长度的输入数据&#xff08;通常称为“预映射”或“消息”&#xff09;转换为固定长度输出&#xff08;通常称为“哈希值”、“散列值”、“…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

Gradle基础:从入门到掌握

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 在现代软件开发中&#xff0c;自动化构建工具是提高效率和管理依赖的重要手段。而Gradle作为一种灵活且强大的构…

SRS流媒体服务器概述

SRS/5.0(Bee) is a simple, high efficiency and realtime video server, supports RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH and GB28181. 翻译&#xff1a;SRS/5.0(Bee)是一款简洁、高效、实时的视频服务器&#xff0c;支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DAS…

欧美海外媒体发稿,国外新闻发布,外媒发布

欧美媒体的影响力 欧美媒体在全球范围内具有较大的影响力&#xff0c;其发稿内容更具全球化视野和多样化观点。欧美媒体多以英语为主要报道语言&#xff0c;覆盖的领域包括政治、经济、文化、科技等多个方面。例如&#xff0c;BBC、CNN、纽约时报等媒体机构的新闻报道被广泛引…

zdppy+onlyoffice+vue3解决文档加载和文档强制保存时弹出警告的问题

解决过程 第一次排查 最开始排查的是官方文档说的 https://api.onlyoffice.com/editors/troubleshooting#key 解决方案。参考的是官方的 https://github.com/ONLYOFFICE/document-server-integration/releases/latest/download/Python.Example.zip 基于Django的Python代码。 …

Linux 复现Docker NAT网络

Linux 复现Docker NAT网络 docker 网络的构成分为宿主机docker0网桥和为容器创建的veth 对构成。这个默认网络命名空间就是我们登陆后日常使用的命名空间 使用ifconfig命令查看到的就是默认网络命名空间&#xff0c;docker0就是网桥&#xff0c;容器会把docker0当成路由&…

容联云发布容犀大模型应用,重塑企业“营销服”|WAIC 2024

7月6日&#xff0c;在2024世界人工智能大会上&#xff0c;容联云成功举办主题为“数智聚合 产业向上”的生成式应用与大模型商业化实践论坛。 论坛上&#xff0c;容联云发布了容犀智能大模型应用升级&#xff0c;该系列应用包括容犀Agent Copilot、容犀Knowledge Copilot、容犀…

User parameters 用户参数与Web监控

目录 一. 自定义键介绍 二. 制作步骤 1. 添加无可变部分参数 2. 添加有可变参数 3. 使用用户参数监控php-fpm 服务的状态 三. Web页面导入应用监控 四. Web监控 主要功能和操作&#xff1a; 开启方式 官方预定义监控项文档https://www.zabbix.com/documentation/6…

代码随想录(day1)二分法

if语句的基本语法 if 要判断的条件: 条件成立的时候&#xff0c;要做的事举例&#xff1a; if nums[middle]<target:leftmiddle1 while语句的基本语法&#xff1a; while 判断条件(condition)&#xff1a;执行语句(statements)举例&#xff1a; while left<right:midd…