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.mzph.cn/news/821032.shtml

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

相关文章

【Python基础】—— scipy.spatial.KDTree、matplotlib.pyplot、imageio

scipy.spatial参考博客&#xff1a;Python点云处理——建立KDtree 1 KDtree算法原理 KDtree构建出了一种类似于二叉树的树形数据存储结构&#xff0c;每一层都对应原始数据中相应的维度&#xff0c;以K层为一个循环&#xff0c;因此被称为KDtree。 每一层的左右子树的划分依据…

视频自定义字幕,中英文,彩色的,你也可以,不会不知道吧

前言 关于【SSD系列】&#xff1a; 前端一些有意思的内容&#xff0c;旨在3-10分钟里&#xff0c;有所获&#xff0c;又不为所累。 字幕&#xff0c;大家见过吧&#xff0c;其实你也可以&#xff0c;真的可以&#xff0c;真的真的可以。不难&#xff0c;不难&#xff0c;真的…

如何评估一个RAG(检索增强生成)系统

本文首发自博客文章 如何评估一个RAG&#xff08;检索增强生成&#xff09;系统 RAG 概念最初来源于 2020 年 Facebook 的一篇论文&#xff0c;这是 Facebook 博客对论文内容的进一步解释 &#x1f449;《检索增强生成&#xff1a;简化智能自然语言处理模型的创建》。大家都知…

【C++对于C语言的扩充】函数重载、引用以及内联函数

文章目录 &#x1f680;前言&#x1f680;函数重载注意&#xff1a;✈️为什么C可以实现函数重载&#xff0c;而C语言却不行呢&#xff1f; &#x1f680;引用✈️引用的特性✈️C中为什么要引入引用✈️引用与指针的区别 &#x1f680;内联函数✈️内联函数特性 &#x1f680;…

GitHub提交PR

本教程只做开源代码库Github工程提交pr的教程&#xff0c;不做其他的深入的讲解 Github和Gitlab的操作类似&#xff0c;只不过Github叫PR&#xff0c;GitLab叫MR&#xff0c;基本上做法是一致的 以开源项目QuickChat为例 https://github.com/Binx98/QuickChat https://github…

C++项目 -- 负载均衡OJ(一)comm

C项目 – 负载均衡OJ&#xff08;一&#xff09;comm 文章目录 C项目 -- 负载均衡OJ&#xff08;一&#xff09;comm一、项目宏观结构1.项目功能2.项目结构 二、comm公共模块1.util.hpp2.log.hpp 一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ&#xff0c;实现类似…

研发岗-统信UOS系统配置npm git等前端常用配置

第一步 获取root权限 配置环境等都需要用到root权限&#xff0c;所以我们先获取到root权限&#xff0c;方便下面的操作 下载软件 在UOS应用商店下载的所需应用 版本都比较低 安装node 官网下载了【arm64】的包&#xff0c;解压到指定文件夹&#xff0c;设置链接&#xff0…

苹果电脑启动磁盘是什么意思 苹果电脑磁盘清理软件 mac找不到启动磁盘 启动磁盘没有足够的空间来进行分区

当你一早打开苹果电脑&#xff0c;结果系统突然提示&#xff1a; “启动磁盘已满&#xff0c;需要删除部分文件”。你会怎么办&#xff1f;如果你认为单纯靠清理废纸篓或者删除大型文件就能释放你的启动磁盘上的空间&#xff0c;那就大错特错了。其实苹果启动磁盘的清理技巧有很…

STM32之HAL开发——CubeMX配置串行Flash文件系统

配置流程 在开始配置FATFS前&#xff0c;需要提前配置好RCC的时钟&#xff0c;以及时钟的频率&#xff0c;另外还要配置好Debug选项&#xff08;选择串行&#xff09; 选项介绍 文件系统适用于SD卡&#xff0c;Disk磁盘等&#xff0c;需要我们将对应的驱动打开才可以使用。 …

【vue】Pinia-2 安装Pinia,使用store

1. 安装Pinia 在项目路径下执行npm install pinia 在package.json中查看 2. 使用store 在main.js中添加 import { createPinia } from pinia const pinia createPinia()修改createApp方法 最后示例如下&#xff08;三处修改&#xff09; import { createApp } from vue //…

SimpleImputer缺失数据处理报错解决方案

作者Toby&#xff0c;来源公众号&#xff1a;Python风控建模&#xff0c;SimpleImputer缺失数据处理报错解决方案 今天有学员反馈缺失值代码报错&#xff0c;由于sklearn缺失值处理的包升级&#xff0c;下面把官网最新的缺失值处理代码奉上。 参考https://scikit-learn.org/st…

请把「睡一个好觉」,当成一天里最重要的事来管理

我发现许多人都有这么一种情况&#xff1a;明明知道睡眠很重要&#xff0c;但却总是有意无意地熬夜。 比如&#xff1a; 给自己排了太多的学习和工作量&#xff0c;一不小心就到了凌晨一两点&#xff1b; 总觉得过去的一天什么都没干&#xff0c;宁愿在网上闲逛&#xff0c;也不…

低代码开发平台权威推荐:创新开发、领跑市场!

Gartner是低代码领域的一家权威机构&#xff0c;该机构常常通过"魔力象限"的研究方法&#xff0c;评选全球范围内IT细分领域的产品&#xff0c;来帮助决策者提供重要的咨询建议。本文盘点了Gartner机构推荐的6款低代码平台&#xff1a;Zoho Creator、Mendix、Oracle、…

JVM结构化体系

目录 目录 1.JVM 简介 1.1. 如何理解 JVM 呢&#xff1f; 1.2. 市场主流 JVM 分析&#xff1f; 1.3. 为什么要学习 JVM&#xff1f; 1.4. 字节码底层是如何执行呢&#xff1f; 如何理解 JIT 呢&#xff1f; 为什么 JVM 中解释执行与编译执行的并存&#xff08;混合模式&…

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容&#xff1a;类的6个默认成员函数中的拷贝构造函数…

el-drawer二次封装进行可拖拽

1.想要的效果 鼠标放到上面出现箭头显示可拖拽得图标 2.代码实现 2.1封装成自定义指令 // drawerDragDirective.js // 定义指令 const drawerDragDirective {// 指令绑定时的处理函数bind(el, ) {const minWidth 300;const dragDom el.querySelector(.el-drawer);// 创…

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么&#xff1f;二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送&#x1f6aa;&#xff1a;hardhat入门 与 hardhat进阶 在之前的文章中&#xff0c;我们已经探讨了使用Har…

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS二次开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 定义 特点 使用场景 优缺点 (1) 优点…

故障转移-redis

4.4.故障转移 集群初识状态是这样的&#xff1a; 其中7001、7002、7003都是master&#xff0c;我们计划让7002宕机。 4.4.1.自动故障转移 当集群中有一个master宕机会发生什么呢&#xff1f; 直接停止一个redis实例&#xff0c;例如7002&#xff1a; redis-cli -p 7002 sh…

保持微软Microsoft Teams始终在线的方案

保持微软Microsoft Teams始终在线的方案 背景方案 背景 目前使用微软Teams办公的小伙伴很多&#xff0c;但是长时间不操作电脑就被自动设置成离线状态。对于在电脑前学习书本或者在思考问题的小伙伴就显得不太友好&#xff0c;因为即使我们不操作电脑我们也时刻在电脑前&#…