玩转ROS2系列01–Ubuntu下ROS 2 版本选择和安装
玩转ROS2系列02–创建一个工作空间并编译功能包
玩转ROS2系列03–创建并运行一个你自己的功能包
玩转ROS2系列04–在功能包中实现一个订阅节点和发布节点
在上一篇博文中,我们已经创建好了一个ROS2的工作空间并且测试过了可以正常编译和运行工作空间中的功能包,这一篇中我们会试着创建并编译运行我们自己的一个功能包;
主要过程参考官网教程Creating Your First ROS 2 package
ROS2中的功能包有Python和CMake两种,这里我们使用python版本的,如果使用C++,请移步官网教程或者将下文中的ament_python
替换为ament_cmake
来进行操作
首先我们跳转到工作空间的src目录下
cd ~/ros2_example_ws/src/
ROS2中创建一个功能包的基本语法如下(不要执行这一条指令),其中package_name
就是你的功能包名称,ament_python
是创建一个Python的功能包,如果需要创建CMake功能包,将其修改为ament_cmake
即可
ros2 pkg create --build-type ament_python <package_name>
为了演示,我们在这里传入一个--node-name
的参数,传入这个参数会在包中生成一个可执行的node以便我们测试,这里my_package
就是我们的包名,my_node
是节点的名称
ros2 pkg create --build-type ament_python --node-name `my_node` my_package
输入指令后终端会输出一段提示信息,可以看到在这个操作过程中创建了那些文件
ubuntu@ubuntu:~/ros2_example_ws/src$ ros2 pkg create --build-type ament_python --node-name my_node my_package
going to create a new package
package name: my_package
destination directory: /home/ubuntu/ros2_example_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['ubuntu ' ]
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
创建完成后回到工作空间的根目录试着编译一下,这里我们只希望编译我们刚创建的包,所以才编译时指定包名称避免编译其他包导致编译时间过长
cd ~/ros2_example_ws/
colcon build --packages-select my_package
编译完成后可以试着运行一下my_package包中的my_node节点
ros2 run my_package my_node
可以看到终端输出了Hi from my_package.
,这就是刚刚我们创建的功能包中的节点所输出的信息
ubuntu@ubuntu:~/ros2_example_ws$ ros2 run my_package my_node
Hi from my_package.
看一下创建完包会产生哪些文件,为了更直观的显示,这里我们用一下tree
工具来显示当前目录的树形结构,首先需要安装一下这个工具sudo apt-get install tree
ubuntu@ubuntu:~/ros2_example_ws/src$ tree my_package/
my_package/
├── my_package
│ ├── __init__.py
│ └── my_node.py
├── package.xml
├── resource
│ └── my_package
├── setup.cfg
├── setup.py
└── test
├── test_copyright.py
├── test_flake8.py
└── test_pep257.py
3 directories, 9 files
可以看到package目录下一共是3个文件夹9个文件。这里我们讲一下my_package
文件夹和package.xml
setup.py
这两个文件
可以看到my_package
文件夹下有一个my_node.py
文件,这个文件就是我们刚刚通过--node-name my_node
参数所产生的节点,所以也就不难想到,后续你自己创建其他node和python文件都应该是放在这里文件夹下的。
之前有接触过ROS1的同学对package.xml
这个文件肯定不会陌生,这个文件主要是包含了这个功能包的相关信息,版本,作者联系方式,开源证书和依赖等,打开看一下是这样的,这里需要用户自己来修改version
maintainer
license
等信息,因为这个包很简单没有额外的依赖项需要添加,所以暂时不用修改depend
的相关内容。
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
>
>my_package >
>0.0.0 >
TODO : Package description>
>ubuntu >
TODO : License declaration>
>ament_python >
>ament_copyright >
>ament_flake8 >
>ament_pep257 >
>python3-pytest >
>
>ament_python >
>
>
setup.py
文件和package.xml
包含的信息基本内容一样,在修改时需要保持两个文件中的信息一致
from setuptools import setup
package_name = 'my_package'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='ubuntu',
maintainer_email='[email protected]',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'my_node = my_package.my_node:main'
],
},
)
其他的几个文件在官方教程中也没有提及具体作用,这里暂时也不做分析,以后有机会再回来补充。