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

在ROS2中,创建功能包使用ament作为其构建系统,colcon作为其编译工具。可以使用CMake或Python来创建包,都是官方支持的,不过也存在其他构建类型,本文仅针对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.cpp在src目录中。所有自定义的C++节点都存放在src中。

8.定制package.xml

在创建包之后的返回消息中,包括description、license和TODO说明。这是因为描述和许可声明并不是自动设置的,但是想要发布包,它们是必需的,可能还需要填写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. docker中ubuntu源更新慢加速 换为国内源 Debian10源

    本来以为是Ubuntu打包的镜像,换了阿里源老是报错100公钥不可用,结果发现是Debian的操作系统,换位Debian的操作系统打包的,换位Debian的源即可 #源如果使用错误也会报错,没有Deb ...

  2. 在Docker中安装MongoDB

    在Docker中安装MongoDB docker run -p 27017:27017 -v /data/mongodb:/data/db --name mongodb -d mongo --auth ...

  3. Git如何下载clone指定的tag

    Git如何下载clone指定的tag 如上图,我想下载Tags标签为solution-4 的代码,如何处理呢? 命令如下: git clone --branch solution-4 git@gith ...

  4. Docker学习(2) 安装

    1 在Ubanru中安装 简单安装: 2 windows安装docker 3 OS X 安装docker

  5. windows使用attrib来简单隐藏文件

    效果如下: 详细命令说明: ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [+O | -O] [+I | -I] [+X | -X] [+P | -P] ...

  6. 激光雷达Lidar Architecture and Lidar Design(上)

    激光雷达Lidar Architecture and Lidar Design(上) 介绍 激光雷达结构: 基本条件 构型和基本布置 激光雷达设计: 基本思想和基本原则 总结 介绍 激光雷达结构是激光 ...

  7. 5G和AI机器人平台

    5G和AI机器人平台 Qualcomm Launches 5G and AI Robotics Platform 高通技术公司(Qualcomm Technologies)周三推出了一款高级5G和人工 ...

  8. .Net Redis实战指南——常用命令

    本问主要介绍rabbitmqctl工具的常用命令. vhost 一个RabbitMQ服务器可以创建多个虚拟的消息服务器,称之为虚拟主机(virtual host),简称为vhost.vhost之间是绝 ...

  9. 【NX二次开发】Block UI 线型

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  10. 如何使用perf进行程序分析

    1.安装. sudo apt-get install linux-tools 如果提示没有可安装候选.请输入: sudo apt-get install linux-perf-version 其中ve ...