玩转ROS2系列03--创建并运行一个你自己的功能包

玩转ROS2系列:

玩转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来进行操作

创建一个python版本的功能包

首先我们跳转到工作空间的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'
        ],
    },
)

其他的几个文件在官方教程中也没有提及具体作用,这里暂时也不做分析,以后有机会再回来补充。

你可能感兴趣的:(ROS2,ROS)