创建启动文件

目标: 创建启动文件来运行复杂的 ROS 2 系统。

教程级别: 中级

时间: 10 分钟

先决条件

本教程使用 rqt_graph 和 turtlesim 包。

您还需要使用您喜欢的文本编辑器。

与往常一样,不要忘记在 每次打开新终端 中获取 ROS 2。

背景

ROS 2 中的启动系统负责帮助用户描述其系统的配置,然后按照描述执行。 系统配置包括要运行哪些程序、在哪里运行它们、向它们传递哪些参数以及 ROS 特定的约定,通过为每个组件提供不同的配置,可以轻松地在整个系统中重用组件。 它还负责监视已启动进程的状态,并报告和/或对这些进程状态的变化做出反应。

用 Python、XML 或 YAML 编写的启动文件可以启动和停止不同的节点,以及触发和响应各种事件。 有关不同格式的描述,请参阅 使用 Python、XML 和 YAML 生成 ROS 2 启动文件。 提供此框架的软件包是 launch_ros,它使用非 ROS 特定的 launch 框架。

设计文档 详细说明了 ROS 2 启动系统的设计目标(目前并非所有功能都可用)。

任务

1 设置

创建一个新目录来存储您的启动文件:

mkdir launch

2 编写启动文件

让我们使用“turtlesim”包及其可执行文件组合一个 ROS 2 启动文件。 如上所述,它可以是 Python、XML 或 YAML。

Copy and paste the complete code into the launch/turtlesim_mimic_launch.py file:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            namespace='turtlesim1',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            namespace='turtlesim2',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            executable='mimic',
            name='mimic',
            remappings=[
                ('/input/pose', '/turtlesim1/turtle1/pose'),
                ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
            ]
        )
    ])

2.1 检查启动文件

上述所有启动文件都在启动一个由三个节点组成的系统,这些节点均来自 turtlesim 包。

该系统的目标是启动两个 turtlesim 窗口,并让一只海龟模仿另一只海龟的动作。

启动两个 turtlesim 节点时,它们之间的唯一区别是它们的命名空间值。

唯一的命名空间允许系统启动两个节点,而不会发生节点名称或主题名称冲突。

该系统中的两只海龟都通过同一主题接收命令,并通过同一主题发布其姿势。

使用唯一的命名空间,可以区分针对不同海龟的消息。

最后一个节点也来自 turtlesim 包,但可执行文件不同:mimic

此节点已以重新映射的形式添加了配置详细信息。 mimic/input/pose 主题被重新映射到 /turtlesim1/turtle1/pose,而它的 /output/cmd_vel 主题被重新映射到 /turtlesim2/turtle1/cmd_vel。 这意味着 mimic 将订阅 /turtlesim1/sim 的姿势主题,并将其重新发布给 /turtlesim2/sim 的速度命令主题进行订阅。 换句话说,turtlesim2 将模仿 turtlesim1 的动作。

These import statements pull in some Python launch modules.

from launch import LaunchDescription
from launch_ros.actions import Node

Next, the launch description itself begins:

def generate_launch_description():
   return LaunchDescription([

   ])

启动描述中的前两个操作启动两个 turtlesim 窗口:

Node(
    package='turtlesim',
    namespace='turtlesim1',
    executable='turtlesim_node',
    name='sim'
),
Node(
    package='turtlesim',
    namespace='turtlesim2',
    executable='turtlesim_node',
    name='sim'
),

最后的操作是使用重新映射启动模拟节点:

Node(
    package='turtlesim',
    executable='mimic',
    name='mimic',
    remappings=[
      ('/input/pose', '/turtlesim1/turtle1/pose'),
      ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
    ]
)

3 ros2 launch

要运行上面创建的启动文件,请进入您之前创建的目录并运行以下命令:

cd launch
ros2 launch turtlesim_mimic_launch.py

Note

可以直接启动启动文件(如上所示),也可以通过包提供启动文件。 当由包提供启动文件时,语法为:

ros2 launch <package_name> <launch_file_name>

您学习了如何创建包 创建包.

Note

对于带有启动文件的软件包,最好在软件包的“package.xml”中添加对“ros2launch”包的“exec_depend”依赖项:

<exec_depend>ros2launch</exec_depend>

这有助于确保在构建包后可以使用“ros2 launch”命令。 它还确保所有:doc:启动文件格式<../../../How-To-Guides/Launch-file-different-formats>都被识别。

将打开两个 turtlesim 窗口,您将看到以下“[INFO]”消息,告诉您启动文件已启动哪些节点:

[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [turtlesim_node-1]: process started with pid [11714]
[INFO] [turtlesim_node-2]: process started with pid [11715]
[INFO] [mimic-3]: process started with pid [11716]

要查看系统运行情况,打开一个新终端并在“/turtlesim1/turtle1/cmd_vel”主题上运行“ros2 topic pub”命令,以使第一只海龟移动:

ros2 topic pub -r 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"

你会看到两只乌龟沿着同一条路径行走。

../../../_images/mimic.png

4 使用 rqt_graph 检查系统

在系统仍在运行时,打开一个新终端并运行“rqt_graph”以更好地了解启动文件中节点之间的关系。

运行命令:

rqt_graph
../../../_images/mimic_graph.png

一个隐藏节点(您运行的 ros2 topic pub 命令)正在将数据发布到左侧的 /turtlesim1/turtle1/cmd_vel 主题,/turtlesim1/sim 节点订阅了该主题。

图表的其余部分显示了前面描述的内容:mimic 订阅了 /turtlesim1/sim 的姿势主题,并发布到 /turtlesim2/sim 的速度命令主题。

摘要

启动文件简化了运行具有许多节点和特定配置详细信息的复杂系统。

您可以使用 Python、XML 或 YAML 创建启动文件,并使用 ros2 launch 命令运行它们。