概要:这篇主要介绍如何创建ros2包

环境:ubuntu20.04,ros2-foxy,vscode

最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.

2.2.2创建自己第一个ros2包(原文:https://docs.ros.org/en/foxy/Tutorials/Creating-Your-First-ROS2-Package.html

>>教程>>创建自己第一个ros2包

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

创建自己第一个ros2包

目标:使用CMake或者python来创建一个新包,并且运行它的执行文件.

课程等级:初级

时长:15min

目录

1.背景
1.1什么是ros2包
1.2ros2包是由什么组成
1.3包在工作空间中
2.预备知识
3.步骤
3.1创建包
3.2编译包
3.3source配置文件
3.4使用包
3.5检查包内容
3.6定制化包.xml文件
4.总结
5.下一步

1.背景

1.1什么是ros2包

包可以视为你的ros2代码的容器.如果你想安装你的程序或者分享给别人,你需要(把代码)有组织放到一个包里面.有了包,你可以分享ros2工作内容,别人可以方便地编译以及使用.

ros2包创建使用ament作为编译系统,colcon作为编译工具.使用CMake或者python来创建一个包,这些是官方支持的,当然也存在其他构建方式.

1.2ros2包是由什么组成

CMake或者python ros2包都有各自的最低要求:

CMake:
package.xml:包含包的基本信息的文件

CMakeLists.txt :描述如何编译代码的文件

python:
package.xml:包含包的基本信息的文件

setup.py:安装该包的使用说明

setup.cfg:该文件的作用是,让ros2 run指令可以找到包里面的可执行文件

/<package_name>:一个和包名同名的目录,可让ros2工具用来找到你的包,其包含__init__.py

可能最简单的包文件结构如同:

CMake:

my_package/
     CMakeLists.txt
     package.xml

python:

my_package/
      setup.py
      package.xml
      resource/my_package

1.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

2.预备知识

学习了前面课程,你应该有了一个ros2工作空间,你会在里面构建你的包.

3.步骤

3.1创建包

首先,source一下ros2环境变量.

使用前面课程创建的工作空间dev_ws来放新包.

使用包创建指令之前,你确认你是在src文件夹下面:

linux:

cd ~/dev_ws/src

ros2创建新包的指令语法如下:

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:

ros2 pkg create --build-type ament_cmake --node-name my_node my_package

python:

ros2 pkg create --build-type ament_python --node-name my_node my_package

现在,你工作空间的src目录多了一个my_package文件夹.

运行完指令,你的终端会返回一下信息:

CMake:

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:

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_python
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source folder
creating folder ./my_package/my_package
creating ./my_package/setup.py
creating ./my_package/setup.cfg
creating folder ./my_package/resource
creating ./my_package/resource/my_package
creating ./my_package/my_package/__init__.py
creating folder ./my_package/test
creating ./my_package/test/test_copyright.py
creating ./my_package/test/test_flake8.py
creating ./my_package/test/test_pep257.py
creating ./my_package/my_package/my_node.py
你可以看到新包会自动生成这些文件.

3.2编译包

把(一堆)包放到一个工作空间里面是很有意义的,你可以在工作空间根目录使用colcon build指令一次性编译完成.否则,你得必须一个个单独编译.

返回工作空间根目录:

cd ~/dev_ws

现在编译你的包:

linux:

colcon build

回顾上一次课程,你也放了ros_tutorials到工作空间dev_ws.你可能注意到运行colcon build指令,也会编译turtlesim包.当你的工作空间包比较少时候,这么干没有问题,但是包多了,colcon build指令就得花费很长时间.

下次单独编译my_package包,可以运行:

colcon build --packages-select my_package

3.3source配置文件

为了使用新的包和执行文件,新开终端,并source一下ros2环境变量

然后,在dev_ws目录,运行下面指令来source一下工作空间环境变量:

linux:

. install/setup.bash

既然你的工作空间放到(可检索)的路径上,你可以使用新包的执行文件了.

3.4使用包

为了使用创建包时,使用--node-name参数创建的执行文件,输入指令:

ros2 run my_package my_node

终端会返回信息:

CMake:

hello world my_package package

python:

Hi from my_package.


3.5检查包内容

dev_ws/src/my_package目录下面,你会看到一些文件和文件夹使用指令ros2 pkg create自动生成:

CMake:

CMakeLists.txt  include  package.xml  src

my_node.cpp存在src目录,你以后需要要跑的c++编写的节点都是放这里.

python:

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

my_node.py文件放在my_package目录,你以后需要要跑的python编写的节点都是放这里

3.6定制化包.xml文件

创建完包后,你注意到返回信息里面,descriptionlicense域(标签)有TODO(字段)注释.那是因为报的描述和许可者声明并不是自动设置的,如果你想分享你的包却又是必须的(所以就有了).这个maintainer域(标签)也是应该填的.

进入dev_ws/src/my_package目录,用你喜欢的编辑器打开文件package.xml

CMake:

 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>

python:

 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 <test_depend>ament_copyright</test_depend>
13 <test_depend>ament_flake8</test_depend>
14 <test_depend>ament_pep257</test_depend>
15 <test_depend>python3-pytest</test_depend>
16
17 <export>
18   <build_type>ament_python</build_type>
19 </export>
20</package>
如果没有自动填充,在对应的行里面输入名字和邮箱.然后,在对应行编辑包的描述:
<description>Beginner client libraries tutorials practice package</description>

然后,对应行更新许可证.在这里(https://opensource.org/licenses/alphabetical),你可以了解更多关于开源许可证信息.

由于该包知识用来练习,使用任何许可者都是没有问题的.这里我们选择Apache License 2.0

<license>Apache License 2.0</license>

编辑结束后,别忘了保存文件.

许可证标签下方,你会看到很多标签名字以_depend结束.这些罗列的是你的包的所依赖的其他包,给colcon指令编译时可自动查找使用的.my_package包比较简单,并不需要很多依赖,但是在后面课程中,你会看到这些空间会被利用起来.

CMake:
你搞全了!(没啥要折腾的了)

python:
setup.py文件跟package.xml文件一样,有描述,维护器和许可证这些内容,所以你要也得设置.这两个需要匹配一致.这里的版本version=和包名package_name也是自动填充到两个文件里面,并且配对一致.

使用你喜欢的文本编辑器打开setup.py文件

 1 from setuptools import setup
 2
 3 package_name = 'my_py_pkg'
 4
 5 setup(
 6 name=package_name,
 7 version='0.0.0',
 8 packages=[package_name],
 9 data_files=[
10     ('share/ament_index/resource_index/packages',
11             ['resource/' + package_name]),
12     ('share/' + package_name, ['package.xml']),
13   ],
14 install_requires=['setuptools'],
15 zip_safe=True,
16 maintainer='TODO',
17 maintainer_email='TODO',
18 description='TODO: Package description',
19 license='TODO: License declaration',
20 tests_require=['pytest'],
21 entry_points={
22     'console_scripts': [
23             'my_node = my_py_pkg.my_node:main'
24     ],
25   },
26)

根据package.xml修改16到19行

别忘了保存文件

4.总结

你已经创建一个包来组织代码,并让它也方便别人使用.

你的包会自动填充重要文件,然后你可以使用colcon来编译它,因此你可以在本地环境中使用该包的执行文件.

5.下一步

接下来,添加一些有意思的内容到包里面.开始是简单的发布器或订阅器系统,你既可以选择c++也可以选择python来编写(这两者).

其他

个人认为重点:

cmakepython创建包的指令区别,python的配置文件多一些,ros2编译空间使用的是colcon指令.也学习了如何直接创建可执行文件.

个人练习只折腾c++版本(cmake

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈