背景
launch文件用于启动节点、服务和执行进程,使用launch文件时可以添加相应的参数,并且可以替换参数,提供更多的灵活性,可用于获取特定信息,如launch配置、环境变量等。
替换launch文件
1 创建包
首先,创建一个名为launch_tutorial的新包:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 launch_tutorial
在这个包里面,创建一个名为launch的文件夹:
mkdir launch_tutorial/launch
最后,确保安装launch文件:
在ament_package()之前将以下代码添加到CMakeLists.txt:
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}/
)
2 父launch文件
创建一个launch文件,它将调用并传递参数给另一个launch文件。这个launch文件可以是Python的,也可以是YAML的。
为此,在launch_tutorial包的launch文件夹中创建以下文件:
新建launch/example_main.launch.yaml
文件,添加以下内容:
launch:
- let:
name: 'background_r'
value: '200'
- include:
file: '$(find-pkg-share launch_tutorial)/launch/example_substitutions.launch.yaml'
arg:
- name: 'turtlesim_ns'
value: 'turtlesim2'
- name: 'use_provided_red'
value: 'True'
- name: 'new_background_r'
value: '$(var background_r)'
$(find-pkg-share launch_tutorial)替换用于查找launch_tutorial包的路径。然后将路径替换与example_substitutions.launch.yaml
链接起来。
file: '$(find-pkg-share launch_tutorial)/launch/example_substitutions.launch.yaml'
带有turtlesim_ns和use_provided_red参数的background_r变量被传递给include操作。$(var background_r)替换用于用background_r变量的值定义new_background_r参数。
arg:
- name: 'turtlesim_ns'
value: 'turtlesim2'
- name: 'use_provided_red'
value: 'True'
- name: 'new_background_r'
value: '$(var background_r)'
3 替换launch文件示例
现在在同一文件夹中创建替换launch文件:
创建文件launch/example_substitutions.launch文件,并插入以下代码:
launch:
- arg:
name: 'turtlesim_ns'
default: 'turtlesim1'
- arg:
name: 'use_provided_red'
default: 'False'
- arg:
name: 'new_background_r'
default: '200'
- node:
pkg: 'turtlesim'
namespace: '$(var turtlesim_ns)'
exec: 'turtlesim_node'
name: 'sim'
- executable:
cmd: 'ros2 service call $(var turtlesim_ns)/spawn turtlesim/srv/Spawn "{x: 5, y: 2, theta: 0.2}"'
- executable:
cmd: 'ros2 param set $(var turtlesim_ns)/sim background_r 120'
- timer:
period: 2.0
children:
- executable:
cmd: 'ros2 param set $(var turtlesim_ns)/sim background_r $(var new_background_r)'
if: '$(eval "$(var new_background_r) == 200 and $(var use_provided_red)")'
定义了turtlesim_ns、use_provided_red和new_background_r启动配置,它们用于在上述变量中存储launch参数的值,并将它们传递给所需的操作。launch配置参数稍后可以与$(var <name>)一起使用,以获取launch文件中任何部分参数的值。
arg标签用于定义launch参数,该参数可以从上面的启动文件或控制台进行传递。
- arg:
name: 'turtlesim_ns'
default: 'turtlesim1'
- arg:
name: 'use_provided_red'
default: 'False'
- arg:
name: 'new_background_r'
default: '200'
以下的turtlesim_node节点使用$(var <name>)替换将命名空间设置为turtlesim_ns。
- node:
pkg: 'turtlesim'
namespace: '$(var turtlesim_ns)'
exec: 'turtlesim_node'
name: 'sim'
然后,使用相应的cmd tag定义可执行操作。该命令调用turtlesim节点的spawn服务。
此外,$(var <name>)替换用于获取turtlesim_ns launch参数的值,以构造命令字符串。
- executable:
cmd: 'ros2 service call $(var turtlesim_ns)/spawn turtlesim/srv/Spawn "{x: 5, y: 2, theta: 0.2}"'
同样的方法也用于ros2参数可执行动作,这些操作改变了乌龟背景的红色参数。不同之处在于,只有当提供的new_background_r参数等于200并且use_provided_red launch参数设置为True时,计时器内的第二个动作才会执行。
4 编译包
转到工作区的根目录,编译包:
colcon build
记得在编译之后对工作空间进行source。
ros2 launch launch_tutorial example_main.launch.yaml
这将做以下事情:
1.启动一个具有蓝色背景的turtlesim节点
2.Spawn第二只乌龟
3.将颜色改为紫色
4.如果提供的background_r参数为200并且use_provided_red参数为True,则在两秒后将颜色更改为粉红色。
修改launch参数
如果希望更改提供的launch参数,可以更新example_main.launch中的background_r变量。或启动example_substitution .launch,然后传递参数。要查看可能提供给launch文件的参数,运行以下命令:
ros2 launch launch_tutorial example_substitutions.launch.yaml --show-args
这将显示可能提供给launch文件的参数及其默认值。
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文件,如下所示:
ros2 launch launch_tutorial example_substitutions.launch.yaml turtlesim_ns:='turtlesim3' use_provided_red:='True' new_background_r:=200
参考资料:https://github.com/ros2/launch/blob/humble/launch/doc/source/architecture.rst
总结
在本教程中,学习了如何在launch文件中使用参数替换,增加灵活性。