使用事件处理程序
目标 了解 ROS 2 启动文件中的事件处理程序
辅导水平: 中级
时间 15 分钟
背景介绍
ROS 2 中的 Launch 是一个执行和管理用户定义进程的系统。它负责监控所启动进程的状态,并对这些进程的状态变化做出报告和反应。这些变化被称为事件,可以通过向启动系统注册事件处理程序来处理。事件处理程序可针对特定事件注册,对于监控进程状态非常有用。此外,它们还可用于定义一组复杂的规则,以动态修改启动文件。
本教程展示了 ROS 2 启动文件中事件处理程序的使用示例。
先决条件
本教程使用 海龟 软件包。本教程还假设您拥有 创建了一个新软件包 建筑类型 ament_python
人称 启动教程
.
本教程扩展了 在启动文件中使用替换 教程。
使用事件处理程序
1 事件处理程序启动文件示例
创建一个名为 example_event_handlers_launch.py
文件中的 启动
文件夹中的 启动教程
包装
从 launch_ros.actions 舶来品 节点
从 启动 舶来品 启动说明
从 launch.actions 舶来品 (声明启动参数, 发射事件, 执行进程,
日志信息, 注册事件处理程序, 计时器动作)
从 启动条件 舶来品 如果条件
从 launch.event_handlers 舶来品 (执行完成时, 进程结束时,
OnProcessIO, 进程启动时, 关机时)
从 启动事件 舶来品 关闭
从 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';),
' 参数设置 ';,
turtlesim_ns,
'/sim background_r ';,
'120'
]],
外壳=正确
)
改变背景_r_conditioned = 执行进程(
条件=如果条件(
PythonExpression([
new_background_r,
' == 200',
' and ';,
使用提供的红色
])
),
cmd=[[
查找可执行(名字='ros2';),
' 参数设置 ';,
turtlesim_ns,
'/sim background_r ';,
new_background_r
]],
外壳=正确
)
返回 启动说明([
turtlesim_ns_launch_arg,
使用提供的红色启动参数,
new_background_r_launch_arg,
海龟模拟节点,
注册事件处理程序(
进程启动时(
target_action=海龟模拟节点,
on_start=[
日志信息(信息=';Turtlesim 启动,生成乌龟';),
海龟产卵
]
)
),
注册事件处理程序(
OnProcessIO(
target_action=海龟产卵,
on_stdout=羔羊 事件: 日志信息(
信息='产卵请求说";{}"';.格式(
事件.文本.译码().剥离())
)
)
),
注册事件处理程序(
执行完成时(
target_action=海龟产卵,
on_completion=[
日志信息(信息=';再生完成';),
更改背景,
计时器动作(
时间=2.0,
行动=[改变背景_r_conditioned],
)
]
)
),
注册事件处理程序(
进程结束时(
target_action=海龟模拟节点,
on_exit=[
日志信息(信息=(环境变量(名字='USER';),
';关闭海龟模拟窗口';)),
发射事件(事件=关闭(
理由='窗口已关闭';))
]
)
),
注册事件处理程序(
关机时(
on_shutdown=[日志信息(
信息=['启动被要求关闭:';,
本地替换('event.reason';)]
)]
)
),
])
注册事件处理程序
行动 进程启动时
, OnProcessIO
, 执行完成时
, 进程结束时
和 关机时
事件的定义见启动说明。
"(《世界人权宣言》) 进程启动时
事件处理程序用于注册一个回调函数,当 turtlesim 节点启动时执行该函数。它会向控制台记录一条信息,并执行 海龟产卵
动作。
注册事件处理程序(
进程启动时(
target_action=海龟模拟节点,
on_start=[
日志信息(信息=';Turtlesim 启动,生成乌龟';),
海龟产卵
]
)
),
"(《世界人权宣言》) OnProcessIO
事件处理程序用于注册一个回调函数,当 海龟产卵
操作会写入标准输出。它会记录生成请求的结果。
注册事件处理程序(
OnProcessIO(
target_action=海龟产卵,
on_stdout=羔羊 事件: 日志信息(
信息='产卵请求说";{}"';.格式(
事件.文本.译码().剥离())
)
)
),
"(《世界人权宣言》) 执行完成时
事件处理程序用于注册一个回调函数,当 海龟产卵
操作完成。它会向控制台记录一条信息,并执行 更改背景
和 改变背景_r_conditioned
动作。
注册事件处理程序(
执行完成时(
target_action=海龟产卵,
on_completion=[
日志信息(信息=';再生完成';),
更改背景,
计时器动作(
时间=2.0,
行动=[改变背景_r_conditioned],
)
]
)
),
"(《世界人权宣言》) 进程结束时
事件处理程序用于注册一个回调函数,当 turtlesim 节点退出时执行该函数。它会向控制台记录一条信息,并执行 发射事件
动作,以发出 关闭
事件。这意味着在关闭 turtlesim 窗口时,启动进程将关闭。
注册事件处理程序(
进程结束时(
target_action=海龟模拟节点,
on_exit=[
日志信息(信息=(环境变量(名字='USER';),
';关闭海龟模拟窗口';)),
发射事件(事件=关闭(
理由='窗口已关闭';))
]
)
),
最后 关机时
事件处理程序用于注册一个回调函数,在启动文件被要求关闭时执行该函数。它会向控制台记录启动文件被要求关闭的原因。它记录的信息包括关闭的原因,如关闭 turtlesim 窗口或 按住-c 用户发出的信号。
注册事件处理程序(
关机时(
on_shutdown=[日志信息(
信息=['启动被要求关闭:';,
本地替换('event.reason';)]
)]
)
),
构建软件包
转到工作区的根目录,然后构建软件包:
Colcon build
此外,请记住在创建工作区后要为其添加源代码。
启动示例
现在您可以启动 example_event_handlers_launch.py
文件,使用 玫瑰2 启动
指挥。
ros2 launch launch_tutorial example_event_handlers_launch.py turtlesim_ns:='turtlesim3' use_provided_red:='True' new_background_r:=200
这将起到以下作用:
启动一个蓝色背景的海龟模拟节点
生成第二只乌龟
将颜色改为紫色
两秒钟后将颜色更改为粉红色,如果提供的
背景_r
论点是200
和使用提供的红色
论点是正确
关闭 turtlesim 窗口时关闭启动文件
此外,它还会在下列情况下向控制台记录信息
海龟模拟节点启动
执行产卵操作
"(《世界人权宣言》)
更改背景
行动被执行"(《世界人权宣言》)
改变背景_r_conditioned
行动被执行退出 turtlesim 节点
发射进程被要求关闭。
文件
发射文件 提供了有关可用事件处理程序的详细信息。
摘要
在本教程中,您将学习如何在启动文件中使用事件处理程序。您还了解了它们的语法和使用示例,以便定义一组复杂的规则来动态修改启动文件。