【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.txt
     include/my_package/
     package.xml
     src/

Python:

my_package/
      package.xml
      resource/my_package
      setup.cfg
      setup.py
      my_package/

3. 工作区中的包

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

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

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

workspace_folder/
    src/
      cpp_package_1/
          CMakeLists.txt
          include/cpp_package_1/
          package.xml
          src/


      py_package_1/
          package.xml
          resource/py_package_1
          setup.cfg
          setup.py
          py_package_1/
      ...
      cpp_package_n/
          CMakeLists.txt
          include/cpp_package_n/
          package.xml
          src/

 先决条件

您在遵循上一教程的指导后,应该有一个 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。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个关于ROS Noetic软件依赖关系的问题。其中,下列软件的依赖关系尚不足够满足要求,无法安装: ros-noetic-desktop-full: 依赖于 ros-noetic-desktop,但它不会被安装。 依赖于 ros-noetic-perception,但它不会被安装。 依赖于 ros-noetic-simulators,但它不会被安装。 依赖于 ros-noetic-urdf-sim-tu,但它不会被安装。 ### 回答2: 这个错误提示是说明在安装 ros-noetic-desktop-full 软件时,发现它需要依赖一些其他的软件,但是这些软件未被安装。其中,ros-noetic-desktop、ros-noetic-perception、ros-noetic-simulators 和 ros-noetic-urdf-sim-tu 是四个未满足依赖关系的软件。 这个错误提示一般是由于软件源的问题所导致的。在安装软件时,系统会从软件源中查找该软件以及它所需的依赖关系。如果软件源中不存在某个软件的依赖关系,则会提示这个错误信息。 要解决这个问题,可以尝试以下几个方法: 1. 更新软件源:可通过修改软件源配置文件或使用软件源管理工具来更新软件源。更新后再次尝试安装软件,看是否能够解决依赖关系问题。 2. 手动安装依赖关系:如果更新软件源后仍然无法解决依赖关系问题,可以尝试手动安装依赖关系。按照依赖关系的提示,逐个安装这四个软件。安装完成后再次尝试安装 ros-noetic-desktop-full 软件,看是否能够正常安装。 3. 使用 aptitude 命令安装:aptitude 命令可以自动处理依赖关系,可能会更好地解决这个问题。可以通过运行以下命令安装 ros-noetic-desktop-full 软件: sudo aptitude install ros-noetic-desktop-full 以上是我的回答,希望能对你有所帮助。如果你还有其他问题,请随时回复。 ### 回答3: 这个问题意味着在安装 ros-noetic-desktop-full 软件时,计算机无法满足所有需要的依赖关系。这些依赖关系ros-noetic-desktop、ros-noetic-perception、ros-noetic-simulators 和 ros-noetic-urdf-sim-tu。 在解决这个问题之前,我们需要了解什么是依赖关系。在软件工程中,依赖关系指的是一个软件需要另一个软件才能正常运行的情况。例如,在 ROS 中,ros-noetic-desktop-full 需要依赖其他的软件才能提供完整的功能。 为了解决这个问题,我们可以使用以下方法: 1. 更新软件源列表。我们可以更新软件源列表,这有助于计算机查找所需的软件。在 Ubuntu 系统中,我们可以使用以下命令更新软件源列表:sudo apt-get update。 2. 安装依赖关系。我们可以尝试单独安装缺失的依赖关系。在 ROS 中,我们可以使用以下命令安装缺失的软件:sudo apt-get install ros-noetic-desktop ros-noetic-perception ros-noetic-simulators ros-noetic-urdf-sim-tu。 3. 检查软件仓库。某些情况下,软件源可能已经过时或不再受支持。我们可以检查软件仓库,查看软件是否可用。在 Ubuntu 系统中,我们可以使用以下命令查看软件仓库:apt-cache search ros-noetic-desktop-full。 总之,无法满足依赖关系的问题是常见的,在解决这个问题之前,我们需要了解依赖关系的概念,并掌握一些解决方法。在 ROS 中,我们可以使用更新软件源列表、安装依赖关系和检查软件仓库等方法解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值