使用事件处理程序

目标 了解 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

这将起到以下作用:

  1. 启动一个蓝色背景的海龟模拟节点

  2. 生成第二只乌龟

  3. 将颜色改为紫色

  4. 两秒钟后将颜色更改为粉红色,如果提供的 背景_r 论点是 200使用提供的红色 论点是 正确

  5. 关闭 turtlesim 窗口时关闭启动文件

此外,它还会在下列情况下向控制台记录信息

  1. 海龟模拟节点启动

  2. 执行产卵操作

  3. "(《世界人权宣言》) 更改背景 行动被执行

  4. "(《世界人权宣言》) 改变背景_r_conditioned 行动被执行

  5. 退出 turtlesim 节点

  6. 发射进程被要求关闭。

文件

发射文件 提供了有关可用事件处理程序的详细信息。

摘要

在本教程中,您将学习如何在启动文件中使用事件处理程序。您还了解了它们的语法和使用示例,以便定义一组复杂的规则来动态修改启动文件。