在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_ns
和 use_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_ns
、 use_provided_red
和 new_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_r
和 change_background_r_conditioned
动作,它们改变了turtlesim背景的红色参数。差异是 change_background_r_conditioned
动作只执行如果提供 new_background_r
参数等于 200
和 use_provided_red
launch参数设置为 True
。 IfCondition
内部的评估是使用 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]
启动蓝色背景的turtlesim节点 [待校准@7660]
产卵第二只乌龟 [待校准@7661]
将颜色更改为紫色 [待校准@7662]
如果提供的
background_r
参数是200
,use_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]