监控参数变化(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.xml
和 CMakeLists.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
rosdep 只能在 Linux 上运行,因此可以跳到下一步。
rosdep 只能在 Linux 上运行,因此可以跳到下一步。
返回工作区的根目录、 ros2_ws
然后创建新软件包:
colcon build --packages-select python_parameter_event_handler
打开一个新终端,导航至 ros2_ws
并获取设置文件:
install/setup.bash
install/setup.bash
调用 install\setup.bat
现在运行节点:
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
install/setup.bash
调用 install\setup.bat
现在,要测试对远程参数的监控,首先运行新建的 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 是一种监控参数变化的便捷方法,这样您就可以对更新值作出响应。