ROS 2边学边练(26)-- 监测参数变化(C++)

前言

        通常,一个节点需要对其自身参数或另一个节点的参数的更改做出响应。ParameterEventHandler类使监听参数更改变得容易,这样代码就可以对它们做出响应。

动动手

创建一个包

        进入工作空间根路径的src下(ros2_ws/src),创建名为ParameterEventHandler的功能包:

$ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_parameter_event_handler --dependencies rclcpp

        如有需要可再更新下package.xml的一些信息(最好还是养成一种更新的习惯):

<description>C++ parameter events client tutorial</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>

码个码

        在刚创建的功能包ParameterEventHandler的src路径下创建parameter_event_handler.cpp,将下面C++代码复制进去:

#include <memory>#include "rclcpp/rclcpp.hpp"class SampleNodeWithParameters : public rclcpp::Node
{
public:SampleNodeWithParameters(): Node("node_with_parameters"){this->declare_parameter("an_int_param", 0);// Create a parameter subscriber that can be used to monitor parameter changes// (for this node's parameters as well as other nodes' parameters)param_subscriber_ = std::make_shared<rclcpp::ParameterEventHandler>(this);// Set a callback for this node's integer parameter, "an_int_param"auto cb = [this](const rclcpp::Parameter & p) {RCLCPP_INFO(this->get_logger(), "cb: Received an update to parameter \"%s\" of type %s: \"%ld\"",p.get_name().c_str(),p.get_type_name().c_str(),p.as_int());};cb_handle_ = param_subscriber_->add_parameter_callback("an_int_param", cb);}private:std::shared_ptr<rclcpp::ParameterEventHandler> param_subscriber_;std::shared_ptr<rclcpp::ParameterCallbackHandle> cb_handle_;
};int main(int argc, char ** argv)
{rclcpp::init(argc, argv);rclcpp::spin(std::make_shared<SampleNodeWithParameters>());rclcpp::shutdown();return 0;
}
代码解释

        头文件#include<memory>,以使代码可以使用std::make_shared模板。接下来,#include“rclcpp/crccpp.hpp”,以允许代码引用rclcpp接口提供的各种功能,包括ParameterEventHandler类。

        在类声明之后,代码定义了一个类SampleNodeWithParameters。该类的构造函数声明一个整数参数an_int_param,默认值为0。接下来,该代码创建一个ParameterEventHandler,用于监视参数的更改。最后,该代码创建一个lambda函数,并将其设置为每当更新_int_param时要调用的回调。

        在类声明之后,代码定义了一个类SampleNodeWithParameters。该类的构造函数声明一个整数参数an_int_param,默认值为0。接下来,该代码创建一个ParameterEventHandler,用于监视参数的更改。最后,该代码创建一个lambda函数,并将其设置为每当更新_int_param时要调用的回调。

修改CMakeLists.txt

        将下面内容复制到find_package(rclcpp REQUIRED)之后:

add_executable(parameter_event_handler src/parameter_event_handler.cpp)
ament_target_dependencies(parameter_event_handler rclcpp)install(TARGETSparameter_event_handlerDESTINATION lib/${PROJECT_NAME}
)

构建运行

        首先依然是最好检查下依赖,进入工作空间根路径下:

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

        构建一下:

$colcon build --packages-select cpp_parameter_event_handler

        在新的终端source下环境:

$source install/setup.bash

        开始运行:

$ros2 run cpp_parameter_event_handler parameter_event_handler

        我们打开另外一个终端,source环境,并运行下面修改参数的命令,看看parameter_event_handler终端会打印出什么内容:

$ros2 param set node_with_parameters an_int_param 43

 

 

监视另一个节点参数更改事件

        我们来修改下SampleNodeWithParameters类的构造函数,添加一个回调函数,实现对另外一个节点参数改变事件的监视。我们将使用parameter_blackboard例子应用程序来托管一个双参数,监视该双参数的更新。按下面内容对构造函数进行修改:

// Now, add a callback to monitor any changes to the remote node's parameter. In this
// case, we supply the remote node name.
auto cb2 = [this](const rclcpp::Parameter & p) {RCLCPP_INFO(this->get_logger(), "cb2: Received an update to parameter \"%s\" of type: %s: \"%.02lf\"",p.get_name().c_str(),p.get_type_name().c_str(),p.as_double());};
auto remote_node_name = std::string("parameter_blackboard");
auto remote_param_name = std::string("a_double_param");
cb_handle2_ = param_subscriber_->add_parameter_callback(remote_param_name, cb2, remote_node_name);
private:std::shared_ptr<rclcpp::ParameterEventHandler> param_subscriber_;std::shared_ptr<rclcpp::ParameterCallbackHandle> cb_handle_;std::shared_ptr<rclcpp::ParameterCallbackHandle> cb_handle2_;  // Add this
};

        再次回到工作空间根路径重新构建包:

$colcon build --packages-select cpp_parameter_event_handler

        source一下环境:

$source install/setup.bash

        运行parameter_event_handler:

$ros2 run cpp_parameter_event_handler parameter_event_handler

        打开另外一个终端(记得source环境),运行parameter_blackboard例子:

$ros2 run demo_nodes_cpp parameter_blackboard

 

        我们再打开另外一个终端,设置下parameter_blackboard例子中的参数:

$ros2 param set parameter_blackboard a_double_param 3.45

        我们再看看返回:

(关于C++的一些新特性,ROS(2)中用的挺多的,如果对此不熟悉,比如我本人,挺影响ROS的后续学习,不过可以找些书籍充个电,工欲善其事必先利其器嘛,我这有两本电子书《深入应用C++11:代码优化与工程级应用》、《Effective Modern C++(中文版)》,如有需要可以私信或评论区留下邮箱,免费发放)

本篇完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624530.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于区块链Hyperledger FabricV2.5的农产品溯源/商品/通用溯源应用系统模板

本项目所有相关文档包括区块链设计、后端设计、前端设计、结合IPFS改进以及简易的二次开发步骤收录于&#xff1a;《Fabric项目学习笔记》&#xff0c;当前本项目文档已全部发布。 购买专栏前请认真阅读&#xff1a;《Fabric项目学习笔记》专栏介绍 本项目的代码讲解与二次开发…

Unity 左右折叠显示与隐藏UI的简单实现

要实现一个简单的UI左右折叠显示与隐藏&#xff0c;可以结合遮罩&#xff0c;通过代码控制UI区块的宽度和位移来实现。 具体可以按以下步骤实现&#xff1a; 1、新建一个Image组件&#xff0c;并添加精灵&#xff0c;调整大小后&#xff0c;复制一份作为该UI的父物体&#xf…

光纤不够用怎么办?使用DWDM波分进行低成本扩容光纤容量

光通信行业一直有CWDM/DWDM/LWDM&#xff0c;波分复用&#xff08;WDM&#xff09;是一种光纤传输技术&#xff0c;可以使用多种光波长&#xff08;或颜色&#xff09;在同一介质上发送数据。两个或多个波长可以在一根光纤上传播&#xff0c;并且可以在光波导中以不同的波长或光…

阿赵UE学习笔记——28、粒子系统Niagara简介

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次开始学习粒子系统的使用。 一、Cascade系统 在介绍UE5的Niagara系统之前&#xff0c;必须先介绍一下旧版本的粒子系统。   在UE4的时候&#xff0c;虚幻引擎的粒子系统叫做Cascade&#x…

大数据平台搭建2024(一)

一&#xff1a;基础配置 创建虚拟机并查出ip地址进行连接 ip a1.配置node01静态ip地址与主机名 vi /etc/sysconfig/network-scripts/ifcfg-ens33修改或添加如下内容&#xff1a; BOOTPROTO"static" ONBOOTyes #根据虚拟机网卡信息配置 IPADDR192.168.200.141 NET…

Sonatype Nexus 的使用参数

在最近安装的 Sonatype Nexus 版本中提供了一个使用参数情况界面。 这个使用情况的界面主要是针对当前 Sonatype Nexus 的安装实例出现的系统接入和调用情况。 上面提供了一个限制&#xff0c;这个限制不是说达到了限制后拒绝提供服务了&#xff0c;而是因为在默认的 Sonatype…

强化学习(三)基于动态规划 Dynamic Programming 的求解方法

文章目录 1. 动态规划与强化学习的联系2. 利用动态规划求解最优价值函数2.1 案例背景2.2 策略评估&#xff08;预测&#xff09;2.3 策略迭代&#xff08;控制&#xff09; 在前文《强化学习的数学框架&#xff1a;马尔科夫决策过程 MDP》中&#xff0c;我们用马尔可夫过程抽象…

Android JetPack Compose+Room----实现搜索记录功能

文章目录 需求概述功能展示实现搜索功能使用的技术1.Android Jetpack room2.Android JetPack Compose 代码实现编写搜索界面接入Room实现搜索功能的管理引入依赖定义包结构定义操作表的Dao类定义数据库的基础配置定义数据库的Dao管理类使用数据库升级 源码地址 需求概述 搜索功…

Mac搭建Java环境【环境搭建】

Mac搭建Java环境【环境搭建】 1 安装Java SDK 官网地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 下载dmg&#xff0c;双击之后无脑安装即可。 # 进入 JDK 安装目录 cd /Library/Java/JavaVirtualMachines# 查看文件 ls# 输入 cd ~# 打开环…

基于CNN的棉花不同病害叶识别(Python代码,pytorch框架,代码有详细中文注释,准确率在90%以上)

1.效果视频&#xff08;训练过程&#xff1a;基于CNN模型的棉花不同病害叶识别&#xff08;Python代码&#xff0c;pytorch框架&#xff09;_哔哩哔哩_bilibili&#xff08;为减小视频时长&#xff0c;epoch为30&#xff0c;准确率在85%左右&#xff0c;epoch为60后&#xff0c…

goland2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Goland 是一款由 JetBrains 公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于 Go 语言的开发。它提供了丰富的功能和工具&#xff0c;帮助开发者更高效地编写、调试和管理 Go 语言项目。 功能特点&#x…

李沐-动手学深度学习-Pytorch神经网络基础总结

注&#xff1a;1. 沐神对应章节视频出处 2.代码使用Jupyter Notebook运行更方便 3.文章笔记出处 一、层和块 层&#xff1a;层&#xff08;1&#xff09;接受一组输入&#xff0c; &#xff08;2&#xff09;生成相应的输出&#xff0c; &#xff08;3&#xff09;由一组可调整…