ROS2学习笔记之创建自己的功能包
学习目标: 使用CMake或Python创建一个新的包,然后运行其可执行文件。
背景
- 什么是ROS2的一个包?
一个包可以认为是一个存放我们ROS2代码的容器。当我们希望使用自己的代码或者将代码和他人进行分享的时候,我们就需要将我们的代码组织为一个功能包。通过这种包的概念可以给我们使用ROS2、将代码与他人分享时带来很多的方便
ROS2的包使用ament作为构建系统,colcon为编译工具。尽管可以通过多种方式创建包,但是官方支持推荐使用CMake或Python的方式创建一个包 - 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
- 工作空间中的包
一个工作空间可以包含任意多的功能包,每一个包都有自己的文件夹。在一个工作空间内你可以有不同方式编译构建的包 (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版本
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 <dingchengke@mail.nwpu.edu.cn>']
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.cpp
在src
文件夹下面,通常我们将C++的源文件都放在这个文件夹内
在dev_ws/src/my_package_py
文件夹下面我们可以看到如下的内容
my_package_py package.xml resource setup.cfg setup.py test
my_node_py.py
在my_package_py
文件夹下面,通常我们将Python的执行脚本都饭在这个文件下。
6. 自定义 package.xml
在我们创建包的时候发现在终端输出的消息里面description
和license
都有一个TODO
的标签。这是因为一个包的描述和许可是不会自动生成的,但是如果当我们对外发布一个包的时候这又是必须的。而且maintainer
字段我们也必选写上。
虽然对于平时的使用这些不太重要,我们还是简单过一下。
我们打开dev_ws/src/my_package
文件夹下的package.xml
,Python版本的类似。
首先我们对第6行的关于这个包的描述进行修改,可以用一句简单的话对这个包进行一个概况。
<description>Beginner developer tutorials practice package</description>
接下来第7行是关于维护者联系邮箱的,如果没有自动填充信息我们可以进行相关修改。
<maintainer email="user@todo.todo">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差别还是挺大了。接下来我们就开始编写节点了。