You're reading the documentation for a development version. For the latest released version, please have a look at Galactic.

创建 launch 文件

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

Tutorial level: Beginner

Time: 10 minutes

背景

到目前为止,在本教程中,您已经为运行的每个新节点打开了新的终端。当您创建同时运行越来越多节点的更复杂系统时,打开终端并重新输入配置细节将变得非常繁琐。

启动文件允许您同时启动和配置多个包含 ROS 2 节点的可执行文件。

使用 ros2 launch 命令运行单个启动文件将立即启动整个系统——所有节点及其配置。

先决条件

本教程使用 rqt_console 和 turtlesim 包。

您还需要使用您首选的文本编辑器。

和往常一样,不要忘记在你打开的每一个 新终端中都输入 ROS 2

任务

1 设置

创建一个新的目录来存储你的 launch 文件:

mkdir launch

在终端中输入以下命令,创建一个名为 turtlesim_mimic_launch.py 的启动文件:

touch launch/turtlesim_mimic_launch.py

您还可以使用 GUI 进入系统的文件目录,并以这种方式创建一个新文件。

在首选文本编辑器中打开新文件。

编写 launch 文件

让我们使用 turtlesim 包及其可执行文件来组合一个 ROS 2 启动文件。

将完整的代码复制并粘贴到 turtlesim_mimic_launch.py 文件中:

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 检查 launch 文件

这些导入语句会导入一些 Python launch 模块。

from launch import LaunchDescription
from launch_ros.actions import Node

接下来,开始描述 launch 本身:

def generate_launch_description():
   return LaunchDescription([

   ])

LaunchDescription 中有一个由三个节点组成的系统,所有节点都来自 turtlesim 包。该系统的目标是启动两个海龟模拟窗口,让一只海龟模仿另一只的动作。

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

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

注意,这两个节点之间的唯一区别是它们的名称空间值。唯一的名称空间允许系统启动两个没有节点名称或主题名称冲突的模拟器。

在这个系统中,两只海龟都接收关于同一主题的命令,并发布它们在同一主题上的姿势。如果没有惟一的名称空间,就没有办法区分海龟的消息。

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

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

该节点以重新映射的形式添加了配置细节。

mimic/input/pose 主题被映射到 /turtlesim1/turtle1/pose,它的 /output/cmd_vel 主题被映射到 /turtlesim2/turtle1/cmd_vel。这意味着 mimic 将订阅 /turtlesim1/simpose 主题,并为 /turtlesim2/sim 的 velocity 命令主题重新发布它。换句话说,turtlesim2 会模仿 turtlesim1 的动作。

3 ros2 launch

要启动 turtlesim_mimic_launch.py,请进入之前创建的目录并运行以下命令:

cd launch
ros2 launch turtlesim_mimic_launch.py

注解

可以直接启动 launch 文件(如上所述),也可以由包提供。当它由包提供时,语法是:

ros2 launch <package_name> <launch_file_name>

您将在后面的教程中了解更多关于 创建包 的内容。

注解

对于有启动文件的软件包,最好在你的软件包的 package.xml 中添加一个 exec_dependros2launch 软件包的依赖:

<exec_depend>ros2launch</exec_depend>

这有助于确保在构建你的软件包后,ros2 launch 命令是可用的。它还确保所有 launch文件格式 被识别

两个 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 节点订阅的。graph 的其余部分显示了前面描述的内容:mimic 订阅 /turtlesim1/simpose 主题,并发布 /turtlesim2/sim 的 velocity 命令主题。

小结

launch 文件简化了具有许多节点和特定配置细节的复杂系统的运行。您可以使用 Python 创建启动文件,并使用 ros2 launch 命令运行它们。

下一步

注解

你也可以使用 XML 和 YAML 来创建启动文件。你可以在 Using Python, XML, and YAML for ROS 2 Launch Files 中看到这些不同的 ROS 2 launch 格式的比较。

在下一个教程中,记录和回放数据,你将了解另一个有用的工具,ros2bag