将启动文件集成到 ROS 2 包中

目标: 在 ROS 2 包中添加启动文件。

教程等级: 中级

预计时长: 10 分钟

前提条件

你应该已经学习了如何 创建 ROS 2 包

别忘记在 每个新终端中都要 source ROS 2 环境

背景

上一个教程 中,我们知道了如何编写单独的启动文件。 本教程将会展示如何将启动文件添加到现有的包中,以及在使用中一些约定俗成的习惯。

任务

1 创建包

为这个包创建一个工作空间:

mkdir -p launch_ws/src
cd launch_ws/src
ros2 pkg create --build-type ament_python --license Apache-2.0 py_launch_example

2 为启动文件配置好文件结构

习惯上,一个包的所有启动文件都放在包内的 launch 文件夹中。 请确保你创建的 launch 文件夹在包的最顶层目录下。

对于 Python 包,文件结构应该如下所示:

src/
  py_launch_example/
    launch/
    package.xml
    py_launch_example/
    resource/
    setup.cfg
    setup.py
    test/

为了让 colcon 能够定位到启动文件,我们需要让 Python 的 setup tools 知道它们的存在。 为此,打开 setup.py 文件,在顶部添加必要的 import 语句,并将启动文件包含到 setupdata_files 参数中:

import os
from glob import glob
# Other imports ...

package_name = 'py_launch_example'

setup(
    # Other parameters ...
    data_files=[
        # ... Other data files
        # Include all launch files.
        (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*launch.[pxy][yma]*')))
    ]
)

3 编写启动文件

launch 文件夹中创建一个名为 my_script_launch.py 的新启动文件。 推荐使用 _launch.py 作为 Python 启动文件的文件后缀,但不是必须的。 不过,启动文件的名称必须以 launch.py 结尾,以便被 ros2 launch 识别和自动补全。

你的启动文件应该定义 generate_launch_description() 函数,该函数返回一个 launch.LaunchDescription(),供 ros2 launch 命令使用。

import launch
import launch_ros.actions

def generate_launch_description():
    return launch.LaunchDescription([
        launch_ros.actions.Node(
            package='demo_nodes_cpp',
            executable='talker',
            name='talker'),
  ])

4 构建并运行启动文件

回到工作空间的最顶层,构建它:

colcon build

构建成功后,source 工作空间,就能够运行启动文件了:

ros2 launch py_launch_example my_script_launch.py

文档

launch 文档 提供了更多关于 launch_ros 中使用到的概念的详细信息。

更多的文档/示例将会在不久后发布。 在此期间,可以查看源代码 (https://github.com/ros2/launchhttps://github.com/ros2/launch_ros)。