ROS2入门教程—创建ROS2功能包(C++版)
功能包是ROS2中组织代码的基本容器,方便我们编译、安装、分发开发的代码,一般来讲,每个功能包都是用来完成某项具体的功能相对完整的单元。
1 ROS2中的功能包
ROS2中的功能包可以使用CMake或者Python两种方式来编译(本篇文章主要介绍CMake),其本身是一个“文件夹”,但和文件夹不同的是,每个功能包中都会有这些文件:
∙
\bullet
∙ package.xml
功能包的描述信息
∙
\bullet
∙ CMakeLists.txt
描述CMake编译该功能包的规则
每个工作空间中可以有多个功能包,CMake或者Python包都可以,但是功能包是不能嵌套的。典型的一个工作空间内功能包的结构如下:
workspace_folder/
src/
package_1/
CMakeLists.txt
package.xml
package_2/
setup.py
package.xml
resource/package_2
...
package_n/
CMakeLists.txt
package.xml
2 创建功能包
还是使用之前已经创建好的dev_ws
工作空间,我们在其中的src
文件夹中来创建新功能包。打开终端后进入到dev_ws/src
路径下:
cd ~/dev_ws/src
然后就可以使用如下语法来创建功能包了:
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/libo/dev_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['libo <libo@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
3 编译功能包
将功能包放在工作空间中特别有价值,因为您可以通过在工作空间根目录中运行colcon build
一次构建多个包。否则,您将不得不单独构建每个包。
回到工作空间的根目录:
cd ~/dev_ws
执行编译命令:
colcon build
这个命令会编译工作空间中的所有功能包,如果只想编译某一个包的话,可以执行如下命令:
colcon build --packages-select my_package
4 设置环境变量
要使用新的功能包和可执行文件,请首先打开一个新的终端,进入到工作空间的根目录dev_ws
,然后执行以下命令:
. install/setup.bash
现在您的工作空间已添加到路径中,这样才能让该终端找到新创建的包,接下来就可以在该终端中运行新建功能包的可执行文件了。
5 运行功能包
使用如下命令运行上面创建的可执行文件:
ros2 run my_package my_node
在终端中可以看到:
hello world my_package package
6 功能包中的内容
在dev_ws/src/my_package
中,您将看到ros2 pkg
命令自动生成的文件和文件夹:
CMakeLists.txt include package.xml src
my_node.cpp
位于src
目录中。这是所有您的自定义C++节点将来都会用到的地方。
7 修改package.xml文件
新建功能包中的package.xml
文件需要我们手动完善一下,包括其中的description
、license
等,默认都有加“TODO”
标志。这是因为功能包描述和使用许可证不是自动设置的,但是如果您想要发布功能包,则必须设置。可能还需要填写maintainer
字段。
<?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="libo@todo.todo">libo</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>
如果第7行没有为您自动填充,请在第7行输入您的姓名和电子邮件。然后,编辑第6行上的描述,简单介绍一下该功能包的作用:
<description>Beginner client libraries tutorials practice package</description>
然后,在第8行更新许可证。您可以在这里阅读更多关于开放源代码许可证的信息。
由于此功能包仅用于学习使用,因此使用任何许可证都是安全的。我们使用Apache License 2.0
:
<license>Apache License 2.0</license>
除了这些基本信息之外,还可以看到不少以“_depend”
结尾的标签,这些就是用来描述功能包依赖的,如果我们在编写代码过程中新增加了什么依赖,都可以手动添加到这里来。my_package
很简单,没有任何依赖项,但您将在接下来的教程中看到这个空间的使用。