ROS2学习笔记之创建自己的功能包

学习目标: 使用CMake或Python创建一个新的包,然后运行其可执行文件。

背景

  1. 什么是ROS2的一个包?
    一个包可以认为是一个存放我们ROS2代码的容器。当我们希望使用自己的代码或者将代码和他人进行分享的时候,我们就需要将我们的代码组织为一个功能包。通过这种包的概念可以给我们使用ROS2、将代码与他人分享时带来很多的方便
    ROS2的包使用ament作为构建系统,colcon为编译工具。尽管可以通过多种方式创建包,但是官方支持推荐使用CMake或Python的方式创建一个包
  2. ROS2包的组成是什么?
    Python 和 CMake的包都有最小的结构要求.

CMake版本
package.xml 包含包的元信息(meta information)的文件
CMakeLists.txt 描述如何对包进行编译的文件

Python版本
package.xml 包含包的元信息(meta information)的文件
setup.py 如何对包进行安装的说明
setup.cfg 当包有可执行文件时需要,以便ros2 run可以找到它
your_package_name 一个用于Python执行脚本方便ROS2工具运行的文件夹

一个最简单的包的文件结构如下
CMake版本

 my_package/
     CMakeLists.txt
     package.xml

Python版本

my_package/
      setup.py
      package.xml
      resource/my_package
  1. 工作空间中的包
    一个工作空间可以包含任意多的功能包,每一个包都有自己的文件夹。在一个工作空间内你可以有不同方式编译构建的包 (CMake, Python, etc.)。但是不能有嵌套的包,就是不能包中含有另外一个包。
    一个好的习惯是一个工作空间有一个src文件夹用来放置功能包,这样会让整个工作空间看上去比较整洁。一个比较推荐的工作空间结构如下
workspace_folder/
    src/
      package_1/
          CMakeLists.txt
          package.xml

      package_2/
          setup.py
          package.xml
          resource/my_package
      ...
      package_n/
          CMakeLists.txt
          package.xml

前期准备

需要我们上一个教程建立的工作空间

学习内容

1. 创建一个包

首先我们需要source我们安装的ROS,之前我们已经把这一步加到了.bashrc中所以这一步跳过
然后我们需要进入到工作空间的src目录下,应为那个地方才是存储包的地方

cd dev_ws/src

创建包的命令如下
CMake版本

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

Python版本

扫描二维码关注公众号,回复: 9292878 查看本文章
ros2 pkg create --build-type ament_python <package_name>

在本教程中我们还会使用--node-name选项,创建一个简单的Hello World 可执行文件。我们首先以CMake版本为例。为了对CMake和Python都进行测试,我们将Python版本的相关名字加上_py后缀,防止两个版本有冲突
CMake版本

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/user/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
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

打开文件夹我们可以看到自动生成了很多的文件

Python版本

ros2 pkg create --build-type ament_python --node-name my_node_py my_package_py
node-name my_node_py my_package_py
going to create a new package
package name: my_package_py
destination directory: /home/user/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['dck <[email protected]>']
licenses: ['TODO: License declaration']
build type: ament_python
dependencies: []
node_name: my_node_py
creating folder ./my_package_py
creating ./my_package_py/package.xml
creating source folder
creating folder ./my_package_py/my_package_py
creating ./my_package_py/setup.py
creating ./my_package_py/setup.cfg
creating folder ./my_package_py/resource
creating ./my_package_py/resource/my_package_py
creating ./my_package_py/my_package_py/__init__.py
creating folder ./my_package_py/test
creating ./my_package_py/test/test_copyright.py
creating ./my_package_py/test/test_flake8.py
creating ./my_package_py/test/test_pep257.py
creating ./my_package_py/my_package_py/my_node_py.py

2. 编译新建的包

编译之前切换目录到工作空间的根目录。

cd ~/dev_ws

开始编译

colcon build

在前一个教程当中我们还往这个工作空间里面放入了一个ros_tutorials的包,编译的时候我们可以看到还对turtlesim进行了编译。如果包比较少问题到不是很大,但是如果有很多包的时候就比较花时间了。我们可以用下面的命令只编译my_package这一个包。

colcon build --packages-select my_package

3 Source工作空间的配置文件

为了测试我们刚刚的包,我新打开一个终端,然后source配置文件。

cd dev_ws
source install/setup.bash

4 使用新建的包

我们在创建包的时候使用了--node-name指定了节点名字,我们通过下面的,命令运行节点。
CMake版本

ros2 run my_package my_node

运行过后终端显示如下结果

hello world my_package package

Python版本

ros2 run my_package_py my_node_py

运行过后终端显示如下结果

Hi from my_package_py.

5. 查看包的内容

dev_ws/src/my_package文件夹下面我们可以看到如下的内容

CMakeLists.txt  include  package.xml  src

my_node.cppsrc文件夹下面,通常我们将C++的源文件都放在这个文件夹内

dev_ws/src/my_package_py文件夹下面我们可以看到如下的内容

my_package_py  package.xml  resource  setup.cfg  setup.py  test

my_node_py.pymy_package_py文件夹下面,通常我们将Python的执行脚本都饭在这个文件下。

6. 自定义 package.xml

在我们创建包的时候发现在终端输出的消息里面descriptionlicense都有一个TODO的标签。这是因为一个包的描述和许可是不会自动生成的,但是如果当我们对外发布一个包的时候这又是必须的。而且maintainer字段我们也必选写上。
虽然对于平时的使用这些不太重要,我们还是简单过一下。
我们打开dev_ws/src/my_package文件夹下的package.xml,Python版本的类似。
首先我们对第6行的关于这个包的描述进行修改,可以用一句简单的话对这个包进行一个概况。

<description>Beginner developer tutorials practice package</description>

接下来第7行是关于维护者联系邮箱的,如果没有自动填充信息我们可以进行相关修改。

<maintainer email="[email protected]">user</maintainer>

然后第8行是关于许可证的相关信息,对于练习我们选什么都无所谓,但是如果要对外发布的话这个还是得注意一下,这里我们选择Apache License 2.0

<license>Apache License 2.0</license>

在许可证的标签下面,有很多_depend后缀的标签,这是对这个包对其他包的依赖的描述,colcon会对这些依赖进行搜索。目前我们是一个最简单的例子,在后面的教程当中我们会慢慢使用这些标签。
对于Python版本还有为做完的工作,setup.py文件中同时也包含了刚刚这些需要填写的地方,这些信息需要和package.xml保持一致。我们修改16-19 行的内容和package.xml保持一致。

总结

通过本篇教程我们现在已经学会了创建一个ros2的包,为以后的开发打下基础。
在包的构建和编译ros2和ros1差别还是挺大了。接下来我们就开始编写节点了。

发布了66 篇原创文章 · 获赞 50 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38649880/article/details/104413866