在launch文件中使用替换 [待校准@7737]

Goal目标: Learn了解ROS 2launch文件中的替换 [待校准@7738]

Tutorial教程级别: Advanced高级 [待校准@7643]

时间: 15分钟 [Alyssa@6755]

背景

[需手动修复的语法]Launch文件用于启动节点、服务和执行进程。这组动作可能有参数,这会影响他们的行为。替换可以在参数中使用,以便在描述可重复使用的launch文件时提供更大的灵活性。替换是仅在执行launch描述期间计算的变量,可用于获取特定信息,如launch配置、环境变量或计算任意Python表达式。 [待校准@7739]

本教程展示了ROS 2launch文件中替换的使用示例。 [待校准@7740]

先决条件

本教程使用 turtlesim package. This tutorial also assumes you have created a new package 构建类型 ament_python 调用ed launch_tutorial[待校准@7646]

使用替换 [待校准@7741]

1份父母launch档案 [待校准@7742]

首先,我们将创建一个launch文件,该文件将调用参数并将参数传递给另一个launch文件。为此,在 launch_tutorial 包的 /launch 文件夹中创建一个 example_main.launch.py 文件。 [待校准@7743]

from launch_ros.substitutions import FindPackageShare

from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import PathJoinSubstitution, TextSubstitution


def generate_launch_description():
    colors = {
        'background_r': '200'
    }

    return LaunchDescription([
        IncludeLaunchDescription(
            PythonLaunchDescriptionSource([
                PathJoinSubstitution([
                    FindPackageShare('launch_tutorial'),
                    'launch',
                    'example_substitutions.launch.py'
                ])
            ]),
            launch_arguments={
                'turtlesim_ns': 'turtlesim2',
                'use_provided_red': 'True',
                'new_background_r': TextSubstitution(text=str(colors['background_r']))
            }.items()
        )
    ])

example_main.launch.py 文件中, FindPackageShare 替代被用来找到 launch_tutorial 包的路径。然后使用 PathJoinSubstitution 替换将该包路径的路径与 example_substitutions.launch.py 文件名连接起来。 [待校准@7744]

PathJoinSubstitution([
    FindPackageShare('launch_tutorial'),
    'launch',
    'example_substitutions.launch.py'
])

带有 turtlesim_nsuse_provided_red 参数的 launch_arguments 词典被传递给 IncludeLaunchDescription 动作。的 TextSubstitution 替代用于定义 new_background_r 参数值的 background_r 关键 colors 字典。 [待校准@7745]

launch_arguments={
    'turtlesim_ns': 'turtlesim2',
    'use_provided_red': 'True',
    'new_background_r': TextSubstitution(text=str(colors['background_r']))
}.items()

2替换示例launch文件 [待校准@7746]

现在在同一文件夹中创建一个 example_substitutions.launch.py 文件。 [待校准@7747]

from launch_ros.actions import Node

from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction
from launch.conditions import IfCondition
from launch.substitutions import LaunchConfiguration, PythonExpression


def generate_launch_description():
    turtlesim_ns = LaunchConfiguration('turtlesim_ns')
    use_provided_red = LaunchConfiguration('use_provided_red')
    new_background_r = LaunchConfiguration('new_background_r')

    turtlesim_ns_launch_arg = DeclareLaunchArgument(
        'turtlesim_ns',
        default_value='turtlesim1'
    )
    use_provided_red_launch_arg = DeclareLaunchArgument(
        'use_provided_red',
        default_value='False'
    )
    new_background_r_launch_arg = DeclareLaunchArgument(
        'new_background_r',
        default_value='200'
    )

    turtlesim_node = Node(
        package='turtlesim',
        namespace=turtlesim_ns,
        executable='turtlesim_node',
        name='sim'
    )
    spawn_turtle = ExecuteProcess(
        cmd=[[
            'ros2 service call ',
            turtlesim_ns,
            '/spawn ',
            'turtlesim/srv/Spawn ',
            '"{x: 2, y: 2, theta: 0.2}"'
        ]],
        shell=True
    )
    change_background_r = ExecuteProcess(
        cmd=[[
            'ros2 param set ',
            turtlesim_ns,
            '/sim background_r ',
            '120'
        ]],
        shell=True
    )
    change_background_r_conditioned = ExecuteProcess(
        condition=IfCondition(
            PythonExpression([
                new_background_r,
                ' == 200',
                ' and ',
                use_provided_red
            ])
        ),
        cmd=[[
            'ros2 param set ',
            turtlesim_ns,
            '/sim background_r ',
            new_background_r
        ]],
        shell=True
    )

    return LaunchDescription([
        turtlesim_ns_launch_arg,
        use_provided_red_launch_arg,
        new_background_r_launch_arg,
        turtlesim_node,
        spawn_turtle,
        change_background_r,
        TimerAction(
            period=2.0,
            actions=[change_background_r_conditioned],
        )
    ])

example_substitutions.launch.py 文件中,定义了 turtlesim_nsuse_provided_rednew_background_r launch构型。它们用于存储上述变量中launch参数的值,并将其传递给所需的动作。这些 LaunchConfiguration 的替换使我们能够在launch描述的任何部分获得launch论点的价值。 [待校准@7748]

[需手动修复的语法]``DeclareLaunchArgument`` is用于定义可以从上述launch文件或控制台传递的launch参数。 [待校准@7749]

turtlesim_ns = LaunchConfiguration('turtlesim_ns')
use_provided_red = LaunchConfiguration('use_provided_red')
new_background_r = LaunchConfiguration('new_background_r')

turtlesim_ns_launch_arg = DeclareLaunchArgument(
    'turtlesim_ns',
    default_value='turtlesim1'
)
use_provided_red_launch_arg = DeclareLaunchArgument(
    'use_provided_red',
    default_value='False'
)
new_background_r_launch_arg = DeclareLaunchArgument(
    'new_background_r',
    default_value='200'
)

[需手动修复的语法] turtlesim_node 节点的 namespace 设置为 turtlesim_ns LaunchConfiguration 替代。 [待校准@7750]

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

之后, ExecuteProcess 动作调用 spawn_turtle 用相应的 cmd 参数来定义。此命令调用turtlesim节点的生成服务。 [待校准@7751]

此外, LaunchConfiguration 替代用于获得 turtlesim_ns launch参数的值,以构建命令string。 [待校准@7752]

spawn_turtle = ExecuteProcess(
    cmd=[[
        'ros2 service call ',
        turtlesim_ns,
        '/spawn ',
        'turtlesim/srv/Spawn ',
        '"{x: 2, y: 2, theta: 0.2}"'
    ]],
    shell=True
)

同样的方法也用于 change_background_rchange_background_r_conditioned 动作,它们改变了turtlesim背景的红色参数。差异是 change_background_r_conditioned 动作只执行如果提供 new_background_r 参数等于 200use_provided_red launch参数设置为 TrueIfCondition 内部的评估是使用 PythonExpression 替代进行的。 [待校准@7753]

change_background_r = ExecuteProcess(
    cmd=[[
        'ros2 param set ',
        turtlesim_ns,
        '/sim background_r ',
        '120'
    ]],
    shell=True
)
change_background_r_conditioned = ExecuteProcess(
    condition=IfCondition(
        PythonExpression([
            new_background_r,
            ' == 200',
            ' and ',
            use_provided_red
        ])
    ),
    cmd=[[
        'ros2 param set ',
        turtlesim_ns,
        '/sim background_r ',
        new_background_r
    ]],
    shell=True
)

Launch示例 [待校准@7657]

现在你可以launch的 example_main.launch.py 文件 ros2 launch 命令。 [待校准@7754]

ros2 launch launch_tutorial example_main.launch.py

这将执行以下操作: [待校准@7659]

  1. 启动蓝色背景的turtlesim节点 [待校准@7660]

  2. 产卵第二只乌龟 [待校准@7661]

  3. 将颜色更改为紫色 [待校准@7662]

  4. 如果提供的 background_r 参数是 200use_provided_red 参数是 True ,则在两秒后将颜色更改为粉红色。 [待校准@7663]

修改launch参数 [待校准@7755]

如果要更改提供launch参数,你可以更新他们 launch_arguments 字典在 example_main.launch.py 或launch的 example_substitutions.launch.py 首选参数。要查看可能提供给launch文件的参数,请运行以下命令: [待校准@7756]

ros2 launch launch_tutorial example_substitutions.launch.py --show-args

这将显示可能提供给launch文件的参数及其默认值。 [待校准@7757]

Arguments (pass arguments as '<name>:=<value>'):

    'turtlesim_ns':
        no description given
        (default: 'turtlesim1')

    'use_provided_red':
        no description given
        (default: 'False')

    'new_background_r':
        no description given
        (default: '200')

现在,您可以将所需的参数传递给launch文件,如下所示: [待校准@7758]

ros2 launch launch_tutorial example_substitutions.launch.py turtlesim_ns:='turtlesim3' use_provided_red:='True' new_background_r:=200

文档 [待校准@7638]

[需手动修复的语法] The launch documentation 提供了关于可用替代的详细信息。 [待校准@7759]

总结

在本教程中,您学习了在launch文件中使用替换。您了解了他们创建可重复使用的launch文件的可能性和能力。 [待校准@7760]

您现在可以了解更多关于 using event handlers in launch files 的信息, using event handlers in launch files 用于定义一组复杂的规则,这些规则可用于动态调用y修改launch文件。 [待校准@7761]