使用替换
目标 了解 ROS 2 启动文件中的替换。
辅导水平: 中级
时间 15 分钟
背景介绍
启动文件用于启动节点、服务和执行进程。这组操作可能有参数,参数会影响它们的行为。在描述可重复使用的启动文件时,可以在参数中使用替代变量,以提供更大的灵活性。替换变量仅在执行启动描述时进行评估,可用于获取特定信息,如启动配置、环境变量或评估任意 Python 表达式。
本教程展示了在 ROS 2 启动文件中使用替换的示例。
先决条件
与往常一样,别忘了在 您打开的每个新终端.
使用替换
1 创建和设置软件包
首先,创建一个新软件包,名称为 启动教程
:
创建一个 build_type 的新软件包 ament_python
:
ros2 pkg create --build-type ament_python --license Apache-2.0 launch_tutorial
创建一个 build_type 的新软件包 ament_cmake
:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 launch_tutorial
在该软件包中,创建一个名为 启动
:
mkdir launch_tutorial/launch
mkdir launch_tutorial/launch
医学博士 launch_tutorial/launch
最后,确保安装启动文件:
对 setup.py
的:
舶来品 os
从 水珠 舶来品 水珠
从 设置工具 舶来品 查找软件包, 设置
包名 = 'launch_tutorial';
设置(
# 其他参数 ...
数据文件=[
# ...其他数据文件
# 包括所有启动文件。
(os.路.加入('分享';, 包名, 'launch';), 水珠(os.路.加入('launch';, '*launch.[pxy][yma]*')))
]
)
在 CMakeLists.txt
临 ament_package()
:
安装(目录
启动
目的地 分享/${项目名称}/
)
2 父启动文件
让我们创建一个启动文件,它将调用另一个启动文件并向其传递参数。这个启动文件可以是 Python 格式,也可以是 YAML 格式。
为此,请在 启动
文件夹中的 启动教程
包装
将完整的代码复制并粘贴到 launch/example_main_launch.py
锉刀
从 launch_ros.substitutions 舶来品 查找软件包共享
从 启动 舶来品 启动说明
从 launch.actions 舶来品 包含启动描述
从 launch.launch_description_sources 舶来品 PythonLaunchDescriptionSource
从 launch.substitutions 舶来品 路径连接替换, 文本替换
捍卫 生成发射描述():
颜色 = {
'background_r': '200'
}
返回 启动说明([
包含启动描述(
PythonLaunchDescriptionSource([
路径连接替换([
查找软件包共享('launch_tutorial';),
'launch';,
'example_substitutions_launch.py';
])
]),
启动参数={
'turtlesim_ns': 'turtlesim2';,
'use_provided_red': '真实';,
'new_background_r': 文本替换(文本=字符串(颜色['background_r']))
}.项目()
)
])
"(《世界人权宣言》) 查找软件包共享
的路径。 启动教程
一揽子计划该 路径连接替换
替换,然后使用 example_substitutions_launch.py
文件名。
路径连接替换([
查找软件包共享('launch_tutorial';),
'launch';,
'example_substitutions_launch.py';
])
"(《世界人权宣言》) 启动参数
词典 turtlesim_ns
和 使用提供的红色
参数传递给 包含启动描述
行动。行动 文本替换
替换用于定义 new_background_r
参数的值。 背景_r
键中的 颜色
字典
启动参数={
'turtlesim_ns': 'turtlesim2';,
'use_provided_red': '真实';,
'new_background_r': 文本替换(文本=字符串(颜色['background_r']))
}.项目()
将完整的代码复制并粘贴到 launch/example_main_launch.yaml
锉刀
启动:
- 告诉:
名字: 'background_r'
价值: '200'
- 包括:
文件: '$(find-pkg-share launch_tutorial)/launch/example_substitutions_launch.yaml';
雅格:
- 名字: 'turtlesim_ns'
价值: 'turtlesim2';
- 名字: 'use_provided_red'
价值: '真实';
- 名字: 'new_background_r'
价值: '$(var background_r)';
"(《世界人权宣言》) $(find-pkg-share launch_tutorial)
的路径。 启动教程
软件包。然后将路径替换与 example_substitutions_launch.yaml
文件名。
文件: '$(find-pkg-share launch_tutorial)/launch/example_substitutions_launch.yaml';
"(《世界人权宣言》) 背景_r
变量 turtlesim_ns
和 使用提供的红色
参数传递给 包括
行动。行动 $(var background_r)
替换用于定义 new_background_r
参数的值。 背景_r
变量。
雅格:
- 名字: 'turtlesim_ns'
价值: 'turtlesim2';
- 名字: 'use_provided_red'
价值: '真实';
- 名字: 'new_background_r'
价值: '$(var background_r)';
3 替换示例启动文件
现在在同一文件夹中创建替换启动文件:
创建文件 launch/example_substitutions_launch.py
并插入以下代码:
从 launch_ros.actions 舶来品 节点
从 启动 舶来品 启动说明
从 launch.actions 舶来品 声明启动参数, 执行进程, 计时器动作
从 启动条件 舶来品 如果条件
从 launch.substitutions 舶来品 启动配置, PythonExpression
捍卫 生成发射描述():
turtlesim_ns = 启动配置('turtlesim_ns')
使用提供的红色 = 启动配置('use_provided_red')
new_background_r = 启动配置('new_background_r')
turtlesim_ns_launch_arg = 声明启动参数(
'turtlesim_ns',
默认值='turtlesim1';
)
使用提供的红色启动参数 = 声明启动参数(
'use_provided_red',
默认值='假';
)
new_background_r_launch_arg = 声明启动参数(
'new_background_r',
默认值='200'
)
海龟模拟节点 = 节点(
包装='turtlesim';,
命名空间=turtlesim_ns,
可执行='turtlesim_node',
名字='sim';
)
海龟产卵 = 执行进程(
cmd=[[
ROS2服务呼叫';,
turtlesim_ns,
'/spawn ';,
'turtlesim/srv/Spawn';,
'"{x:2,y:2,θ:0.2}"';
]],
外壳=正确
)
更改背景 = 执行进程(
cmd=[[
'ros2 param set ';,
turtlesim_ns,
'/sim background_r ';,
'120'
]],
外壳=正确
)
改变背景_r_conditioned = 执行进程(
条件=如果条件(
PythonExpression([
new_background_r,
' == 200',
' and ';,
使用提供的红色
])
),
cmd=[[
'ros2 param set ';,
turtlesim_ns,
'/sim background_r ';,
new_background_r
]],
外壳=正确
)
返回 启动说明([
turtlesim_ns_launch_arg,
使用提供的红色启动参数,
new_background_r_launch_arg,
海龟模拟节点,
海龟产卵,
更改背景,
计时器动作(
时间=2.0,
行动=[改变背景_r_conditioned],
)
])
"(《世界人权宣言》) turtlesim_ns
, 使用提供的红色
和 new_background_r
定义了启动配置。它们用于在上述变量中存储启动参数值,并将其传递给所需的操作。这些 启动配置
替换可以让我们在发射描述的任何部分获取发射参数的值。
声明启动参数
用于定义启动参数,该参数可从上述启动文件或控制台传递。
turtlesim_ns = 启动配置('turtlesim_ns')
使用提供的红色 = 启动配置('use_provided_red')
new_background_r = 启动配置('new_background_r')
turtlesim_ns_launch_arg = 声明启动参数(
'turtlesim_ns',
默认值='turtlesim1';
)
使用提供的红色启动参数 = 声明启动参数(
'use_provided_red',
默认值='假';
)
new_background_r_launch_arg = 声明启动参数(
'new_background_r',
默认值='200'
)
"(《世界人权宣言》) 海龟模拟节点
节点的 命名空间
设为 turtlesim_ns
启动配置
替换的定义。
海龟模拟节点 = 节点(
包装='turtlesim';,
命名空间=turtlesim_ns,
可执行='turtlesim_node',
名字='sim';
)
之后 执行进程
行动称为 海龟产卵
与相应的 cmd
参数。该命令调用 turtlesim 节点的 spawn 服务。
此外 启动配置
的值。 turtlesim_ns
启动参数,用于构建命令字符串。
海龟产卵 = 执行进程(
cmd=[[
ROS2服务呼叫';,
turtlesim_ns,
'/spawn ';,
'turtlesim/srv/Spawn';,
'"{x:2,y:2,θ:0.2}"';
]],
外壳=正确
)
同样的方法也用于 更改背景
和 改变背景_r_conditioned
的操作,可更改海龟模拟背景的红色参数。不同之处在于 改变背景_r_conditioned
只有当所提供的 new_background_r
参数等于 200
和 使用提供的红色
启动参数设置为 正确
.内部评估 如果条件
是使用 PythonExpression
换人。
更改背景 = 执行进程(
cmd=[[
'ros2 param set ';,
turtlesim_ns,
'/sim background_r ';,
'120'
]],
外壳=正确
)
改变背景_r_conditioned = 执行进程(
条件=如果条件(
PythonExpression([
new_background_r,
' == 200',
' and ';,
使用提供的红色
])
),
cmd=[[
'ros2 param set ';,
turtlesim_ns,
'/sim background_r ';,
new_background_r
]],
外壳=正确
)
创建文件 launch/example_substitutions_launch.yaml
并插入以下代码:
启动:
- 雅格:
名字: 'turtlesim_ns'
默认: 'turtlesim1';
- 雅格:
名字: 'use_provided_red'
默认: '假';
- 雅格:
名字: 'new_background_r'
默认: '200'
- 网站:
包: 'turtlesim';
命名空间: '$(var turtlesim_ns)';
执行: 'turtlesim_node'
名字: 'sim';
- 可执行:
cmd: 'ros2 服务 致电 $(var turtlesim_ns)/spawn turtlesim/srv/Spawn "{x: 5, y: 2, θ: 0.2}"';
- 可执行:
cmd: 'ros2 停止 设置 $(var 乌龟模拟ns)/模拟 背景_r 120'
- 定时器:
时间: 2.0
儿童:
- 可执行:
cmd: 'ros2 停止 设置 $(var 乌龟模拟ns)/模拟 背景_r $(var new_background_r)';
如果: '$(eval "$(var new_background_r) == 200 和 $(var 使用_provided_red)")';
"(《世界人权宣言》) turtlesim_ns
, 使用提供的红色
和 new_background_r
定义了启动配置。它们用于在上述变量中存储启动参数值,并将其传递给所需的操作。启动配置参数随后可与 $(var <name>)
在发射描述的任何部分中,都可以通过替换来获取发射参数的值。
"(《世界人权宣言》) 雅格
标签用于定义启动参数,该参数可从上述启动文件或控制台中传递。
- 雅格:
名字: 'turtlesim_ns'
默认: 'turtlesim1';
- 雅格:
名字: 'use_provided_red'
默认: '假';
- 雅格:
名字: 'new_background_r'
默认: '200'
"(《世界人权宣言》) 海龟模拟节点
节点的 命名空间
设置为 turtlesim_ns
使用 $(var <name>)
替换的定义。
- 网站:
包: 'turtlesim';
命名空间: '$(var turtlesim_ns)';
执行: 'turtlesim_node'
名字: 'sim';
之后,一个 可执行
动作定义了相应的 cmd
标签。该命令将调用 turtlesim 节点的 spawn 服务。
此外 $(var <name>)
的值。 turtlesim_ns
启动参数,用于构建命令字符串。
- 可执行:
cmd: 'ros2 服务 致电 $(var turtlesim_ns)/spawn turtlesim/srv/Spawn "{x: 5, y: 2, θ: 0.2}"';
同样的方法也用于 玫瑰2 停止
可执行
动作,可更改 turtlesim 背景的红色参数。不同之处在于,只有当提供的 new_background_r
参数等于 200
和 使用提供的红色
启动参数设置为 正确
.评估 如果
谓词是使用 $(评估 <python-expression>)
换人。
- 可执行:
cmd: 'ros2 停止 设置 $(var 乌龟模拟ns)/模拟 背景_r 120'
- 定时器:
时间: 2.0
儿童:
- 可执行:
cmd: 'ros2 停止 设置 $(var 乌龟模拟ns)/模拟 背景_r $(var new_background_r)';
如果: '$(eval "$(var new_background_r) == 200 和 $(var 使用_provided_red)")';
4 构建软件包
转到工作区的根目录,然后构建软件包:
Colcon build
此外,请记住在创建工作区后要为其添加源代码。
启动示例
现在,您可以使用 玫瑰2 启动
指挥。
ros2 launch launch_tutorial example_main_launch.py
ros2 launch launch_tutorial example_main_launch.yaml
这将起到以下作用:
启动一个蓝色背景的海龟模拟节点
生成第二只乌龟
将颜色改为紫色
两秒钟后将颜色更改为粉红色,如果提供的
背景_r
论点是200
和使用提供的红色
论点是正确
修改启动参数
如果要更改所提供的启动参数,可以在 启动参数
词典中的 example_main_launch.py
或启动 example_substitutions_launch.py
首选参数。要查看启动文件的参数,请运行以下命令:
ros2 launch launch_tutorial example_substitutions_launch.py --show-args
如果要更改所提供的启动参数,可以更新 背景_r
变量中的 example_main_launch.yaml
或启动 example_substitutions_launch.yaml
首选参数。要查看启动文件的参数,请运行以下命令:
ros2 launch launch_tutorial example_substitutions_launch.yaml --show-args
这将显示可以给启动文件提供的参数及其默认值。
参数(将参数传递为 '<name>:=<value>'):
'turtlesim_ns':
无描述
(默认值:'turtlesim1')。
'use_provided_red':
无描述
(默认值:'假')。
'new_background_r':
无描述
(默认值:'200')。
现在,您可以向启动文件传递所需的参数,如下所示:
ros2 launch launch_tutorial example_substitutions_launch.py turtlesim_ns:='turtlesim3' use_provided_red:='True' new_background_r:=200
ros2 launch launch_tutorial example_substitutions_launch.yaml turtlesim_ns:='turtlesim3' use_provided_red:='True' new_background_r:=200
文件
发射文件 提供了有关可用替代品的详细信息。
摘要
在本教程中,你学习了在启动文件中使用替换。你还了解了创建可重复使用的启动文件的可能性和功能。
您现在可以进一步了解 在启动文件中使用事件处理程序 用于定义一组复杂的规则,这些规则可用于动态修改启动文件。