ROS2 学习笔记13:创建 ROS2 包

Background 背景

1 什么是ROS2 包

包可以视为你的ros2代码的容器.如果你想安装你的程序或者分享给别人,你需要(把代码)有组织放到一个包里面。有了包,你可以分享ros2工作内容,别人可以方便地编译以及使用。

ros2包创建使用ament作为编译系统,colcon作为编译工具。使用CMake或者python来创建一个包,这些是官方支持的,当然也存在其他构建方式。

2 ROS2包的组成

ROS2 CMake或者python 包 应至少包含以下相关文件:

CMake
CMakeLists.txt :描述如何编译代码的文件
include/<package_name> :包含包的公共头文件的目录
package.xml:包含包的基本信息的文件
src:包含包源代码的目录

python
package.xml:包含包的基本信息的文件
resource/<package_name>:包的标记文件
setup.cfg:该文件的作用是,让ros2 run指令可以找到包里面的可执行文件
setup.py:安装该包的使用说明
/<package_name>:一个和包名同名的目录,可让ros2工具用来找到你的包,其包含__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 工作空间的包

一个工作区可以包含任意数量的软件包,每个软件包都有自己的文件夹。您也可以在一个工作区中包含不同构建类型的软件包(CMakePython 等)。但不能嵌套软件包。

最佳做法是在工作区中建立一个 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/

Prerequisites 前提

按照上一教程中的说明操作后,您应该拥有一个 ROS 2 工作区。您将在此工作区中创建软件包。

Tasks 任务

1 Create a package

首先,source一下ros2环境变量.

使用前面课程创建的工作空间dev_ws来放新包.

使用包创建指令之前,确认你是在src文件夹下面:

cd ~/ros2_ws/src     

ros2创建新包的指令语法如下:

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

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

在终端中输入以下命令

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

现在,你工作空间的src目录多了一个my_package文件夹.

运行完指令,你的终端会返回一下信息:

going to create a new package
package name: my_package
destination directory: /home/user/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
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 Build a package

将软件包放在工作区中尤为重要,因为通过在工作区根目录下运行 colcon build,可以一次性构建多个软件包。否则,您将不得不单独构建每个软件包。

返回工作区的根目录:

cd ~/ros2_ws     

现在,您可以构建软件包了:

colcon build

在上一个教程中,您的 ros2_ws 中还包含了 ros_tutorials 软件包。你可能已经注意到,运行 colcon build 时也会生成 turtlesim 软件包。当你的工作区中只有几个软件包时,这没什么问题,但当有很多软件包时,colcon build 就会耗费很长的时间。

要想下次只编译 my_package 软件包,可以运行

colcon build --packages-select my_package   

3 Source the setup file

为了使用新的包和执行文件,新开终端,并source一下ros2环境变量

然后,在dev_ws目录,运行下面指令来source一下工作空间环境变量:

source install/local_setup.bash

现在工作区已添加到路径中,您就可以使用新软件包的可执行文件了。

4 Use the package

为了使用创建包时,使用--node-name参数创建的执行文件,输入指令:

ros2 run my_package my_node

终端会返回信息:

hello world my_package package  

5 Examine package contents

dev_ws/src/my_package目录下面,你会看到一些文件和文件夹使用指令ros2 pkg create自动生成:

CMakeLists.txt  include  package.xml  src

my_node.cpp存在src目录,以后需要要运行的c++编写的节点都是放这里

6 Customize package.xml

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

进入dev_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="user@todo.todo">user</maintainer>
 <license>TODO: License declaration</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 License 2.0

<license>Apache License 2.0</license>

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

在许可证标签下面,您会看到一些以 _depend 结尾的标签名称。my_package 很简单,没有任何依赖关系,但你会在接下来的教程中看到这个的使用。

Summary 总结

您创建了一个软件包来组织您的代码,方便他人使用。

您的软件包会自动填充必要的文件,然后您使用 colcon 构建它,这样您就可以在本地环境中使用它的可执行文件。

Next steps 下一步

接下来,让我们为软件包添加一些有意义的东西。您将从一个简单的发布者/订阅者系统开始,可以选择用C++Python 编写。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值