一个功能包可以被认为是ROS2代码的容器。如果希望能够管理代码或与他人共享代码,那么需要将其组织在一个包中。通过包,可以发布ROS2工作,并允许其他人轻松地构建和使用它。

在ROS2中,创建功能包使用ament作为其构建系统,colcon作为其编译工具。可以使用CMakePython来创建包,都是官方支持的,不过也存在其他构建类型,本文仅针对CMake,即采用C++编写程序进行讨论。

1.什么组成了ROS2功能包

ROS2 CMake包的最低要求内容为:

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

  • CMakeLists.txt 描述如何在包中编译代码

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

my_package/
CMakeLists.txt
package.xml

2.工作空间中的包

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

最好的工程经验是在工作空间中有一个src文件夹,并在其中创建包。这保持了顶层工作空间的“干净”。

一个简单的工作空间可能是这样的:

workspace_folder/
src/
package_1/
CMakeLists.txt
package.xml package_2/
setup.py
package.xml
resource/package_2
...
package_n/
CMakeLists.txt
package.xml

3.创建一个功能包

首先,确定ROS2环境已经配置好,如果未配置,可以参考:ROS2环境配置

然后,建立dev_ws工作空间,可以参考:ROS2工作空间建立

确保终端位于src目录下:

cd ~/dev_ws/src

ROS2中创建一个新的功能包的语法为:

ros2 pkg create --build-type ament_cmake <package_name>

在本文中,将使用可选参数——node-name,它将在包中创建一个简单的Hello World类型的可执行文件。在终端中输入如下命令:

ros2 pkg create --build-type ament_cmake --node-name my_node my_package

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

运行该命令后,终端将返回消息:

going to create a new package
package name: my_package
destination directory: /home/**/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['** <**@todo.todo>']
licenses: ['TODO: License declaration']
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

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

4.编译功能包

将包放到工作空间中特别有价值,因为可以通过在工作空间的根目录中运行colcon build来一次编译多个包。否则,将不得不单独编译每个包。

返回工作空间的根目录:

cd ~/dev_ws

现在编译功能包:

colcon build

当工作空间中有许多包时,colcon build可能需要很长时间,这是可以只编译某个包。

当只编译my_package时,可以执行:

colcon build --packages-select my_package

5.soure setup文件

要使用新的包和可执行文件,首先打开一个新的终端并source ROS2的安装空间。

然后,在dev_ws目录中,运行以下命令来source工作空间:

. install/setup.bash

现在工作空间已经添加到环境中,可以使用新包中的可执行文件。

6.使用功能包

为了运行刚刚创建的my_node节点,在终端执行:

ros2 run my_package my_node

此时终端输出:

hello world my_package package

7.查看包的内容

dev_ws/src/my_package中,会看到ros2 pkg create自动生成的文件和文件夹:

其中,my_node.cppsrc目录中。所有自定义的C++节点都存放在src中。

8.定制package.xml

在创建包之后的返回消息中,包括descriptionlicenseTODO说明。这是因为描述和许可声明并不是自动设置的,但是想要发布包,它们是必需的,可能还需要填写maintainer字段。

dev_ws/src/my_package目录下,打开package.xml文件:

 1<?xml version="1.0"?>
2<?xml-model
3 href="http://download.ros.org/schema/package_format3.xsd"
4 schematypens="http://www.w3.org/2001/XMLSchema"?>
5<package format="3">
6 <name>my_package</name>
7 <version>0.0.0</version>
8 <description>TODO: Package description</description>
9 <maintainer email="user@todo.todo">user</maintainer>
10 <license>TODO: License declaration</license>
11
12 <buildtool_depend>ament_cmake</buildtool_depend>
13
14 <test_depend>ament_lint_auto</test_depend>
15 <test_depend>ament_lint_common</test_depend>
16
17 <export>
18 <build_type>ament_cmake</build_type>
19 </export>
20</package>

在第9行输入姓名和电子邮件,然后,编辑第8行上的描述,以总结包的功能:

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

然后,在第10行更新license。

因为这个包仅用于练习,所以使用任何许可证都是安全的。这里使用Apache License 2.0

<license>Apache License 2.0</license>

不要忘记保存

在license标记下面,看到一些以_depend结尾的标记名称。在这里,package.xml将列出对其他包的依赖关系,让colcon进行搜索。my_package很简单,没有任何依赖项。

9.总结

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

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

如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。

都看到这了,点个推荐再走吧~

未经允许,禁止转载。

ROS2学习之旅(13)——创建ROS2 功能包的更多相关文章

  1. ROS2学习之旅(4)——理解ROS2 Graph中的节点

    ROS(2)图(ROS(2) graph)是一个同时处理数据的基于ROS2元素的网络,它包含了所有的可执行文件以及它们之间的连接.图中的基本元素包括:节点(nodes).话题(topics).服务(s ...

  2. ROS_Kinetic_24 使用catkin_create_qt_pkg快速创建qt-ros功能包

    使用catkin_create_qt_pkg快速创建qt-ros功能包 参考网址: qt_create:http://wiki.ros.org/qt_create qt_ros:https://git ...

  3. ROS2学习之旅(12)——创建工作空间

    workspace(工作空间)是包含ROS2 packages(包)的文件夹.在使用ROS 2之前,有必要在终端中source一下ROS 2的安装工作区,这样就可以在该终端中使用ROS 2的软件包. ...

  4. ROS2学习之旅(21)——创建一个动作服务和客户节点(C++)

    动作是ROS中的一种异步通信形式,动作客户端向动作服务器发送目标请求,目标服务器向操作客户端发送目标反馈和结果.本文基于前一篇自定义动作博文. 1.创建一个action_turtorials_cpp包 ...

  5. ROS2学习之旅(20)——创建一个动作消息

    本文用来自定义一个动作消息类型. 以下命令用来创建一个工作空间并建立一个功能包: mkdir -p action_ws/src cd action_ws/src ros2 pkg create act ...

  6. ROS2学习之旅(14)——编写简单的发布者和订阅者(C++)

    节点是通过ROS Graph进行通信的可执行进程.在本文中,节点将通过话题以字符串消息的形式相互传递信息.这里使用的例子是一个简单的"talker"和"listener& ...

  7. ROS2学习之旅(15)——编写简单的服务和客户节点(C++)

    当节点使用服务进行通信时,发送数据请求的节点称为客户节点,响应请求的节点称为服务节点.请求和响应的结构由.srv文件决定. 本文的例子是一个简单的整数加法系统:一个节点请求两个整数的和,另一个节点响应 ...

  8. ROS2学习之旅(1)——初识ROS2

    本系列用来记录ROS2的学习过程,有错误或者不合理的地方请大家指正.由于博主具有ROS1的学习经历,会添加一些与ROS1的一些对比,当然这对于ROS2本身的学习内容没有丝毫影响,欢迎大家积极与我在评论 ...

  9. 创建ROS功能包(四)

    为了方便直接用ROS的create-pkg命令行工具 roscreate-pkg chapter2_tutorials std_msgs rospy roscpp std_msgs 包含了常见的消息类 ...

随机推荐

  1. 使用python实现钉钉告警通知功能

    前言:日常工作中告警通知是必不可少的,一般会使用邮件.钉钉.企业微信等,今天分享一下使用python实现钉钉告警 一. 钉钉机器人创建 登录钉钉客户端,创建一个群,把需要收到报警信息的人员都拉到这个群 ...

  2. 【Python】神器:Streamlit,仅使用Python开发一个运维管理后台(不需要编写html,js,css)

    背景 作为SRE,我们有很多很多自动化的工具,大部分都是自动运行的,还有一部分是CLI,我们一直苦于没有一个自己的管理后台网站,受限于前端能力薄弱,开发出来的网页只能说凑活能用,但是不好用. 现在我们 ...

  3. SpringBoot 实现整合log4j2日志

    关于日志级别 共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF. ...

  4. GO学习-(33) Go实现日志收集系统2

    Go实现日志收集系统2   一篇文章主要是关于整体架构以及用到的软件的一些介绍,这一篇文章是对各个软件的使用介绍,当然这里主要是关于架构中我们agent的实现用到的内容 关于zookeeper+kaf ...

  5. Mysql索引创建及删除

    1.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...

  6. 国内操作系统OS分析(下)

    国内操作系统OS分析(下) 3.2 Android/iOS移动互联网时代 Android是一种基于Linux的自由及开放源代码的操作系统.主要使用于移动设备,如智能手机和平板电脑,由Google公司和 ...

  7. x86 cpu卷积网络的自动调谐

    x86 cpu卷积网络的自动调谐 这是一个关于如何为x86cpu调整卷积神经网络的文档. 本文不会在Windows或最新版本的macOS上运行.要让它运行,需要将主体包装在 if __name__ = ...

  8. MLIR多级中间表示概述

    MLIR多级中间表示概述 MLIR项目是构建可重用和可扩展的编译器基础设施的一种新方法.MLIR旨在解决软件碎片化问题,改进异构硬件的编译,显著降低构建特定领域编译器的成本,并帮助将现有编译器连接在一 ...

  9. [.NET Core知识点回顾]-自动内存管理

    自动内存管理是公共语言运行时在托管执行过程中提供的服务之一.公共语言运行时的垃圾回收器为应用程序管理内存 的分配和释放.对开发人员而言,在开发托管应用程序时不必编写执行内存管理任务代码. 分配内存 初 ...

  10. Message、Handler、Message Queue、Looper 之间的关系

    单线程模型中Message.Handler.Message Queue.Looper之间的关系 1.Message Message即为消息,可以理解为线程间交流的信息.处理数据后台线程需要更新UI,你 ...