目标 使用CMake或者Python创建你的第一个软件包,并且运行它的可执行文件。
背景知识
1. 什么是ROS 2 包?
一个包可以被看做是你的ROS2的代码的容器。如果你想让你的代码可以安装或者分享给其他人,那么你将需要将它组织成一个包。通过软件包,你可以发布你的ROS 2 工作,同时其它人可以很容易地构建并使用它。
在ROS 2 中,软件包是用ament作为编译系统,将colon作为编译工具。你可以使用CMake或者Python来创建一个包,这些是官方支持的,虽然也还有其它的编译的类型存在。
2. 什么组成了一个ROS 2的软件包?
ROS 2 中,使用Python和CMake各自有它们最少要求的内容:
package.xml
文件包含了该软件包的属性信息CMakeLists.txt
文件描述了如何编译包里面的代码
可能存在的最简单的包大概是拥有类似下面的文件结构:
my_package/
CMakeLists.txt
package.xml
3. 在一个工作空间中的包
一个工作空间可以包含任意多个软件包,只要每个包都在它们各自的文件夹中。你还可以在一个工作空间中有不同编译类型的包(比如,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
前提条件
根据前面的讲解工作空间的教程,你应该已经有一个ROS 2的工作空间了。你可以在这个工作空间中创建你的软件包。
任务
1. 创建一个软件包
首先,source你所安装的ROS 2。
让我们使用咱们在前一个教程中创建的工作空间,dev_ws,里面,创建你的新软件包。
保证你现在处于你的工作空间的根目录的src文件夹下,然后运行下面的创建命令。
cd ~/dev_ws/src
在ROS 2中创建一个新包的命令的语法如下:
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/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
你可以在新的文件夹中看到这些自动生成的文件。
2. 编译一个包
将软件包放在一个工作空间中是特别有价值的,因为你可以通过在工作空间的根目录运行colon build
来一次性编译多个软件包, 否则的话,需要逐个软件包进行编译。
通过下面的命令,返回到你的工作空间的根目录。
cd ~/dev_ws
现在你可以编译你的软件包了。
colcon build
记得在前一个教程中,你的工作空间中已经有了一个软件包ros_tutorials
,你或许已经注意到在你运行的时候,同时也编译了该软件包。 当你的工作空间中,只有少量几个包的时候,这是没有问题的。 但是,如果你的工作空间中,有大量的软件包,编译的过程,将会耗费大量的时间。
如果在工作的时候,你想只编译一个软件包,你可以使用下面的命令,也就是使用--packages-select
这个参数。
colcon build --packages-select my_package
3. source 设置文件
为了使用你的心软件包及其可执行文件,首先打开一个新的终端,然后source你的ros 2。
然后source你的工作空间,也就是,进入工作空间的根目录运行接下来的命令。
. install/setup.bash
现在你的工作空间已经添加到你的环境变量中了,你可以使用你的新软件包的可执行文件。
注意,上面的命令默认你使用的是bash,如果你使用的是zsh,则需要运行以.zsh结尾的文件。
4. 使用软件包
为了运行,你通过命令创建的软件包中的可执行文件,输入下面的指令。
ros2 run my_package my_node
将会在你的终端中返回以下的消息。
hello world my_package package
5. 查看包的内容
在软件包dev_ws/src/my_package
中,你将可以看到自动生成的文件以及文件夹。
CMakeLists.txt include package.xml src
my_node.cpp
是在 src
文件夹中
这将是你所有的C + +文件存储的地方。
6. 修改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>
如果第7行的姓名,以及邮箱没有自动为你填充上,请你输入你的姓名,以及你的电子邮箱,然后编辑第六行, 填写上软件包的描述。
<description>Beginner client libraries tutorials practice package</description>
然后在第八行,更新license。你可以通过这个链接,了解更多关于源码的条款。
因为这个软件包只是用于练习,所以使用任何条款都是安全的这里,我们使用的是 Apache License 2.0
:
<license>Apache License 2.0</license>
不要忘记了,在你完成编辑之后保存文件。
在license这个标签的下面,你会看到一些标签的名字是使用这个来结尾的, 这里将列出你的软件包是依赖于哪一些其他的软件包的一提供给编译器去寻找。 当前,这个软件包非常的简单,并不需要任何的依赖,但是你会在接下来的教程中会使用到这一块的内容。
这次的教程到此为止。
总结
你通过创建一个软件包将你的代码组织了起来,使得它容易被其他人使用。
你的软件包会自动的填充需要的文件,然后你使用colon编译它,你便可以在本地环境中使用它的可执行文件了。
下一步
接下来,让我们增加一些有意义的内容到包里面。我们从一个简单的发布器和订阅器系统开始,然后分别使用C++和Python实现它。
关注我或者订阅我的专栏:ROS 2专栏。