监控参数变化(Python)

目标 学习使用 ParameterEventHandler 类监控和响应参数变化。

辅导水平: 中级

时间 20 分钟

背景介绍

通常情况下,节点需要对自身参数或其他节点参数的变化做出响应。通过 ParameterEventHandler 类,可以很容易地监听参数的变化,这样您的代码就可以对它们做出响应。本教程将向您展示如何使用 Python 版本的 ParameterEventHandler 类来监听节点自身参数的变化以及其他节点参数的变化。

先决条件

在开始本教程之前,您应首先完成以下教程:

任务

在本教程中,您将创建一个包含一些示例代码的新包,编写一些使用 ParameterEventHandler 类的 Python 代码,并测试生成的代码。

1 创建软件包

首先,打开一个新终端,然后 为您的 ROS 2 安装提供源代码 以便 玫瑰2 命令即可运行。

跟进 本说明 创建一个名为 ros2_ws.

回顾一下,软件包应在 来源 目录,而不是工作区的根目录。因此,导航到 ros2_ws/src 然后在那里创建一个新软件包:

ros2 pkg create --build-type ament_python --license Apache-2.0 python_parameter_event_handler --ependencies rclpy

您的终端将返回一条信息,验证是否创建了软件包 参数事件处理程序 及其所有必要的文件和文件夹。

"(《世界人权宣言》) --依赖 参数会自动在 package.xmlCMakeLists.txt.

1.1 更新 package.xml

因为您使用了 --依赖 选项,就不必在创建软件包时手动将依赖关系添加到 package.xml.不过,请务必一如既往地将说明、维护者电子邮件和姓名以及许可证信息添加到 package.xml.

<描述>;Python 规范 活动 客户 教程</description>;
维护者 电子邮件="[email protected]";>;您的 名称维护人员</maintainer>;
许可证Apache-2.0</license>;

2 编写 Python 节点

内部 ros2_ws/src/python_parameter_event_handler/python_parameter_event_handler 目录下,新建一个名为 parameter_event_handler.py 并粘贴以下代码:

舶来品 rclpy
舶来品 rclpy.node
舶来品 rclpy.parameter

 rclpy.parameter_event_handler 舶来品 参数事件处理程序


 带参数的样本节点(rclpy.网站.节点):
    捍卫 启动(自我):
        棒极了().启动('node_with_parameters';)

        自我.declare_parameter('an_int_param', 0)

        自我.商人 = 参数事件处理程序(自我)

        自我.回调句柄 = 自我.商人.添加参数回调(
            参数名="an_int_param";,
            节点名="node_with_parameters";,
            回调=自我.回调,
        )

    捍卫 回调(自我, p: rclpy.规范.参数) ->; :
        自我.get_logger().信息(f收到参数更新: {p.名字}: {rclpy.规范.参数值到 python(p.价值)}";)


捍卫 主要():
    rclpy.启动()
    网站 = 带参数的样本节点()
    rclpy.后旋(网站)
    rclpy.关闭()

2.1 检查代码

"(《世界人权宣言》) 舶来品 语句用于导入软件包依赖项。

舶来品 rclpy
舶来品 rclpy.node
舶来品 rclpy.parameter

 rclpy.parameter_event_handler 舶来品 参数事件处理程序

下一段代码创建了 带参数的样本节点 和构造函数。该类的构造函数声明了一个整数参数 参数的默认值为 0。 接下来,代码会创建一个 参数事件处理程序 用于监控参数的变化。

 带参数的样本节点(rclpy.网站.节点):
    捍卫 启动(自我):
        棒极了().启动('node_with_parameters';)

        自我.declare_parameter('an_int_param', 0)

        自我.商人 = 参数事件处理程序(自我)

最后,我们为新回调添加参数回调并获取回调处理程序。

备注

保存由 添加参数回调否则,将无法正确注册回调。

自我.回调句柄 = 自我.商人.添加参数回调(
    参数名="an_int_param";,
    节点名="node_with_parameters";,
    回调=自我.回调,
)

对于回调函数,我们使用 回调 的方法 带参数的样本节点 类。

捍卫 回调(自我, p: rclpy.规范.参数) ->; :
    自我.get_logger().信息(f收到参数更新: {p.名字}: {rclpy.规范.参数值到 python(p.价值)}";)

带参数的样本节点 是一个典型的 主要 函数初始化 ROS,启动样本节点使其可以发送和接收信息,然后在用户在控制台输入 ^C 后关闭。

捍卫 主要():
    rclpy.启动()
    网站 = 带参数的样本节点()
    rclpy.后旋(网站)
    rclpy.关闭()

2.2 添加入口

打开 setup.py 文件。同样,匹配 维护者, 维护者电子邮件, 描述许可 字段到您的 package.xml:

维护者='YourName';,
维护者电子邮件='[email protected]';,
描述='Python 参数教程';,
许可='Apache-2.0';,

控制台脚本 括号内的 入口 field:

入口={
    'console_scripts';: [
        'node_with_parameters = python_parameter_event_handler.parameter_event_handler:main';,
    ],
},

3 构建和运行

运行 rosdep 在工作区的根目录 (ros2_ws) 在构建前检查是否缺少依赖项:

rosdep install -i --from-path src --rosdistro $ROS_DISTRO -y

返回工作区的根目录、 ros2_ws然后创建新软件包:

colcon build --packages-select python_parameter_event_handler

打开一个新终端,导航至 ros2_ws并获取设置文件:

install/setup.bash

现在运行节点:

ros2 run python_parameter_event_handler node_with_parameters

该节点现在处于活动状态,只有一个参数,每当该参数更新时就会打印一条信息。要测试这一点,请打开另一个终端,像以前一样输入 ROS 设置文件,然后执行以下命令:

ros2 param set node_with_parameters an_int_param 43

运行节点的终端将显示类似下面的信息:

[INFO] [1698483083.315084660] [node_with_parameters]:收到更新参数:an_int_param: 43

我们之前在节点中设置的回调已被调用,并显示了新的更新值。现在,您可以在终端中使用 ^C 终止正在运行的 parameter_event_handler 示例。

3.1 监控另一节点参数的变化

您还可以使用 ParameterEventHandler 监控另一个节点的参数变化。让我们更新 SampleNodeWithParameters 类,以监控另一个节点中参数的变化。我们将使用 parameter_blackboard 演示应用程序来托管一个双参数,并对其更新进行监控。

首先更新构造函数,在现有代码后添加以下代码:

捍卫 启动(...):
    ...
    自我.回调句柄 = 自我.商人.添加参数回调(
        参数名="a_double_param";,
        节点名="parameter_blackboard";,
        回调=自我.回调,
    )

在终端中,返回工作区的根目录、 ros2_ws然后像以前一样编译更新的软件包:

colcon build --packages-select python_parameter_event_handler

然后获取设置文件:

install/setup.bash

现在,要测试对远程参数的监控,首先运行新建的 parameter_event_handler 代码:

ros2 run python_parameter_event_handler node_with_parameters

接下来,从另一个模板(ROS 已初始化)运行 parameter_blackboard 演示程序,如下所示:

ros2 run demo_nodes_cpp parameter_blackboard

最后,让我们从第三个终端(ROS 已初始化)在 parameter_blackboard 节点上设置一个参数:

ros2 参数设置参数_黑板 a_double_param 3.45

执行该命令后,您应该会在 parameter_event_handler 窗口中看到输出,表明参数更新时调用了回调函数:

[INFO] [1699821958.757770223] [node_with_parameters]:接收到参数 a_double_param 的更新: 3.45

摘要

您创建了一个带有参数的节点,并使用 ParameterEventHandler 类设置了一个回调,以监控该参数的变化。您还使用了相同的类来监控远程节点的变化。ParameterEventHandler 是一种监控参数变化的便捷方法,这样您就可以对更新值作出响应。