ROS2与launch入门教程-launch文件中使用事件处理程序
ROS2与launch入门教程-launch文件中使用事件处理程序
说明:
- 本教程展示了ROS2launch文件中事件处理程序的使用示例
背景:
- ROS2 中的 Launch 是一个执行和管理用户定义流程的系统。
- 它负责监控它启动的进程的状态,以及报告和响应这些进程的状态变化。
- 这些更改称为事件,可以通过向启动系统注册事件处理程序来处理。
- 可以为特定事件注册事件处理程序,并可用于监视进程的状态。
- 此外,它们可用于定义一组复杂的规则,可用于动态修改启动文件。
使用事件处理
- 新建example_event_handlers.launch.py文件
cd ~/launch_ws/src/launch_tutorial/launch
vim example_event_handlers.launch.py
- 内容如下
from launch_ros.actions import Node
from launch import LaunchDescription
from launch.actions import (DeclareLaunchArgument, EmitEvent, ExecuteProcess,
LogInfo, RegisterEventHandler, TimerAction)
from launch.conditions import IfCondition
from launch.event_handlers import (OnExecutionComplete, OnProcessExit,
OnProcessIO, OnProcessStart, OnShutdown)
from launch.events import Shutdown
from launch.substitutions import (EnvironmentVariable, FindExecutable,
LaunchConfiguration, LocalSubstitution,
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=[[
FindExecutable(name='ros2'),
' service call ',
turtlesim_ns,
'/spawn ',
'turtlesim/srv/Spawn ',
'"{x: 2, y: 2, theta: 0.2}"'
]],
shell=True
)
change_background_r = ExecuteProcess(
cmd=[[
FindExecutable(name='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=[[
FindExecutable(name='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,
RegisterEventHandler(
OnProcessStart(
target_action=turtlesim_node,
on_start=[
LogInfo(msg='Turtlesim started, spawning turtle'),
spawn_turtle
]
)
),
RegisterEventHandler(
OnProcessIO(
target_action=spawn_turtle,
on_stdout=lambda event: LogInfo(
msg='Spawn request says "{}"'.format(
event.text.decode().strip())
)
)
),
RegisterEventHandler(
OnExecutionComplete(
target_action=spawn_turtle,
on_completion=[
LogInfo(msg='Spawn finished'),
change_background_r,
TimerAction(
period=2.0,
actions=[change_background_r_conditioned],
)
]
)
),
RegisterEventHandler(
OnProcessExit(
target_action=turtlesim_node,
on_exit=[
LogInfo(msg=(EnvironmentVariable(name='USER'),
' closed the turtlesim window')),
EmitEvent(event=Shutdown(
reason='Window closed'))
]
)
),
RegisterEventHandler(
OnShutdown(
on_shutdown=[LogInfo(
msg=['Launch was asked to shutdown: ',
LocalSubstitution('event.reason')]
)]
)
),
])
- 启动描述中定义了 OnProcessStart、OnProcessIO、OnExecutionComplete、OnProcessExit 和 OnShutdown 事件的 RegisterEventHandler 操作。
- OnProcessStart 事件处理程序用于注册一个回调函数,该函数在 turtlesim 节点启动时执行。
- 它会向控制台记录一条消息,并在 turtlesim 节点启动时执行 spawn_turtle 操作。
- 代码块:
RegisterEventHandler(
OnProcessStart(
target_action=turtlesim_node,
on_start=[
LogInfo(msg='Turtlesim started, spawning turtle'),
spawn_turtle
]
)
),
- OnProcessIO 事件处理程序用于注册一个回调函数,该回调函数在 spawn_turtle 操作写入其标准输出时执行。
- 它记录生成请求的结果。
- 代码块:
RegisterEventHandler(
OnProcessIO(
target_action=spawn_turtle,
on_stdout=lambda event: LogInfo(
msg='Spawn request says "{}"'.format(
event.text.decode().strip())
)
)
),
- OnExecutionComplete 事件处理程序用于注册在 spawn_turtle 操作完成时执行的回调函数。
- 它将一条消息记录到控制台并在 spawn 操作完成时执行 change_background_r 和 change_background_r_condition 操作。
- 代码块:
RegisterEventHandler(
OnExecutionComplete(
target_action=spawn_turtle,
on_completion=[
LogInfo(msg='Spawn finished'),
change_background_r,
TimerAction(
period=2.0,
actions=[change_background_r_conditioned],
)
]
)
),
- OnProcessExit 事件处理程序用于注册一个回调函数,该函数在 turtlesim 节点退出时执行。
- 它向控制台记录一条消息并执行 EmitEvent 操作以在 turtlesim 节点退出时发出 Shutdown 事件。
- 这意味着当turtlesim窗口关闭时启动过程将关闭。
- 代码块:
RegisterEventHandler(
OnProcessExit(
target_action=turtlesim_node,
on_exit=[
LogInfo(msg=(EnvironmentVariable(name='USER'),
' closed the turtlesim window')),
EmitEvent(event=Shutdown(
reason='Window closed'))
]
)
),
- 最后,OnShutdown 事件处理程序用于注册一个回调函数,该函数在启动文件被要求关闭时执行。
- 它会向控制台记录为什么要求关闭启动文件的消息。
- 它会记录关闭原因的消息,例如关闭 turtlesim 窗口或用户发出的 ctrl-c 信号。
- 代码块:
RegisterEventHandler(
OnShutdown(
on_shutdown=[LogInfo(
msg=['Launch was asked to shutdown: ',
LocalSubstitution('event.reason')]
)]
)
),
- 指定构建test_launch_py包,并使用symlink的方式
cd ~/launch_ws/
colcon build --symlink-install --packages-select launch_tutorial
- 加载工作空间
. ~/launch_ws/install/local_setup.bash
测试:
- 启动example_event_handlers.launch.py
ros2 launch launch_tutorial example_event_handlers.launch.py turtlesim_ns:='turtlesim3' use_provided_red:='True' new_background_r:=200
这将执行以下操作:
- 启动一个蓝色背景的turtlesim节点
- 生成第二只海龟
- 将颜色更改为紫色
- 如果提供的 background_r 参数为 200 且 use_provided_red 参数为 True,则在两秒后将颜色更改为粉红色
- 当turtlesim窗口关闭时关闭启动文件
此外,它会在以下情况下将消息记录到控制台:
- turtlesim 节点启动
- 执行生成动作
- 执行 change_background_r 动作
- 执行 change_background_r_condition 动作
- turtlesim 节点退出
- 启动过程被要求关闭。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号