学习目标: 使用CMake或Python创建一个新的包,然后运行其可执行文件。
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
workspace_folder/
src/
package_1/
CMakeLists.txt
package.xml
package_2/
setup.py
package.xml
resource/my_package
...
package_n/
CMakeLists.txt
package.xml
需要我们上一个教程建立的工作空间
首先我们需要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: [' ' ]
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 ' ]
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
编译之前切换目录到工作空间的根目录。
cd ~/dev_ws
开始编译
colcon build
在前一个教程当中我们还往这个工作空间里面放入了一个ros_tutorials
的包,编译的时候我们可以看到还对turtlesim
进行了编译。如果包比较少问题到不是很大,但是如果有很多包的时候就比较花时间了。我们可以用下面的命令只编译my_package
这一个包。
colcon build --packages-select my_package
为了测试我们刚刚的包,我新打开一个终端,然后source配置文件。
cd dev_ws
source install/setup.bash
我们在创建包的时候使用了--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.
在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的执行脚本都饭在这个文件下。
在我们创建包的时候发现在终端输出的消息里面description
和license
都有一个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差别还是挺大了。接下来我们就开始编写节点了。