(五)ROS通信编程——参数服务器

前言

参数服务器在ROS中主要用于实现不同节点之间的数据共享(P2P)。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场景如下:导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径。上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数(有些路径限宽限高)。参数服务器,一般适用于存在数据共享的一些应用场景。我们将小车尺寸放到一个参数服务器中,这样各个节点使用小车尺寸判断是否能通行直接从参数服务器里取就行

动作编程通信:数据共享模式

1.参数服务器的理论模型

1.演员列表

ROS管理者(其中有一个管理参数的公共容器)、参数的设置方、参数的调用方

2.流程

1.参数的设置方提交参数到管理者,管理者将参数保存至一个参数列表

2.参数的调用者向管理者发送一个参数调用请求

3.管理者到参数列表中查找相关参数,将参数值返回给调用者

3.注意

参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据。

参数服务器可以使用的数据类型:32-bit integers、booleans、strings、doubles、iso8601 dates、lists、base64-encoded binary data、字典。

2.参数服务器的实现(c++)

1.创建一个参数的实例

在工作空间下的源码空间src中建立功能包 plumbing_param_server,并建立依赖包 roscpp、rospy,std_msgs.定位到新建功能包下的src文件,新建文件 demo_param_set.cpp

1.参数新增
#include "ros/ros.h"/*
需要实现参数的新增和修改
1.需求:首先设置机器人的共享参数,类型、半径、再修改半径
2.通过两套api实现  ros::NodeHandle  setParam    ros::param set
*/int main(int argc, char  *argv[])
{ros::init(argc,argv,"setpara_c");ros::NodeHandle nh;//参数增加//方案1:参数名字,参数值nh.setParam("type","xiaoHuang");nh.setParam("radius",0.15);//方案2:参数名字,参数值ros::param::set("type_param","xiaobai");ros::param::set("radius_param",0.1);return 0;
}
2.参数修改

直接在原有的基础上进行修改

   //修改 方案一:参数覆盖nh.setParam("radius",0.2);//修改 方案二ros::param::set("radius_param",0.25);
#include "ros/ros.h"/*
需要实现参数的新增和修改
1.需求:首先设置机器人的共享参数,类型、半径、再修改半径
2.通过两套api实现  ros::NodeHandle  setParam    ros::param set
*/int main(int argc, char  *argv[])
{ros::init(argc,argv,"setpara_c");ros::NodeHandle nh;//参数增加//方案1:参数名字,参数值nh.setParam("type","xiaoHuang");nh.setParam("radius",0.2);//方案2:参数名字,参数值ros::param::set("type_param","xiaobai");ros::param::set("radius_param",0.25);return 0;
}
 3.参数获取

在功能包的源码空间src下创建文件demo_param_get.cpp

#include "ros/ros.h"/*
演示参数查询
*/int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"get_param_c");ros::NodeHandle nh;//ros::NodeHandle----------------------------------------//1.param(键,默认值)   存在,返回对应结果,否则返回默认值(0.5)double radius = nh.param("radius",0.5);ROS_INFO("radius = %.2f",radius);//2.getParam(键,存储结果的变量):键存在返回值是true,并且将值赋给参数2。不存在为false,不为参数二赋值double radius2;bool result = nh.getParam("radius",radius2);if(result){ROS_INFO("获取的半径是 radius = %.2f",radius2);}else{ROS_INFO("被查询的变量不存在");}//3.getParamCached(键,存储结果的变量)  --从缓存获取,效率更高,结果与3一样的//4.getParamNames(std::vector<std::string>) 获取所有的键名称,并存储在参数 vector 中std::vector<std::string> names;nh.getParamNames(names);for(auto && name:names){ROS_INFO("遍历到的元素:%s",name.c_str());}//5.hasParam(键) 是否包含某个键 是返回true 否则返回falsebool flag1  = nh.hasParam("radius");bool flag2 = nh.hasParam("sjsjsjs");ROS_INFO("参数一存在吗?%d",flag1);ROS_INFO("参数二存在吗?%d",flag2);//6.searchParam(参数一,参数二)  参数一是搜索的键,参数二存储键的名称std::string key ;nh.searchParam("radius",key);ROS_INFO("搜索结果%s",key.c_str());return 0;
}

一些修改的API模板

/*参数服务器操作之查询_C++实现:在 roscpp 中提供了两套 API 实现参数操作ros::NodeHandleparam(键,默认值) 存在,返回对应结果,否则返回默认值getParam(键,存储结果的变量)存在,返回 true,且将值赋值给参数2若果键不存在,那么返回值为 false,且不为参数2赋值getParamCached键,存储结果的变量)--提高变量获取效率存在,返回 true,且将值赋值给参数2若果键不存在,那么返回值为 false,且不为参数2赋值getParamNames(std::vector<std::string>)获取所有的键,并存储在参数 vector 中 hasParam(键)是否包含某个键,存在返回 true,否则返回 falsesearchParam(参数1,参数2)搜索键,参数1是被搜索的键,参数2存储搜索结果的变量ros::param ----- 与 NodeHandle 类似
*/
4.参数删除

在功能包的源码空间src下创建文件demo_param_delete.cpp

#include "ros/ros.h"
/*
仍然两种方式实现
*/int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"param_del");ros::NodeHandle nh;//删除一bool flag1 = nh.deleteParam("radius");if(flag1){ROS_INFO("success");}else{ROS_INFO("Failed");}//删除二bool flag2 = ros::param::del("radius_param");if(flag2){ROS_INFO("success");}else{ROS_INFO("Failed");}return 0;
}

2.修改CmakeLists.txt配置文件

3.编译catkin_make

4.运行可执行文件

别忘了source

5.检验

rosparam list命令:列出所有参数列表

结束语

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。

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

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

相关文章

使用Keil创建FreeRTOS工程

之前记录了使用Keil创建Keil自带的RTX5的RTOS和使用CubeMX创建FreeRTOS。这次来记录下使用Keil创建FreeRTOS。使用CMSIS-RTOS2将FreeRTOS封装好 1.Pack增加CMSIS-FreeRTOS 2.CMSIS配置为FreeRTOS 点击Resolve后再点击OK即可 3.屏蔽相关文件 4.屏蔽3个中断 将void PendSV_Han…

LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型&#xff0c;包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型&#xff0c;支持…

Unity + Firebase + GoogleSignIn 导入问题

我目前使用 Unity版本&#xff1a;2021.3.33f1 JDK版本为&#xff1a;1.8 Gradle 版本为&#xff1a;6.1.1 Firebase 版本: 9.6.0 Google Sign In 版本为&#xff1a; 1.0.1 问题1 &#xff1a;手机点击登录报错 apk转化成zip&#xff0c;解压&#xff0c;看到/lib/armeabi-v…

安卓投屏电脑最详细教程

安卓手机投屏到电脑的操作可以通过多种方式实现&#xff0c;最常见的方法有使用 Scrcpy、911投屏 或者 Windows 10/11 自带的投屏功能。下面是几个常用方法的详细教程&#xff1a; 方法 1&#xff1a;使用 Scrcpy &#xff08;推荐&#xff0c;免费的开源工具&#xff09; Sc…

VSCode配置php开发环境

我偷偷地告诉你&#xff0c; 有一个地方叫做稻城&#xff0c;我要和我最心爱的人一起去到那里... 2025.1.10 声明 仅作为个人学习使用&#xff0c;仅供参考 不知道如何配置php本地环境的&#xff0c;请翻阅 笔者的上一篇文章 正文 VSCode安装 官网&#xff1a;Download Vis…

StarRocks Awards 2024 年度贡献人物

在过去一年&#xff0c;StarRocks 在 Lakehouse 与 AI 等关键领域取得了显著进步&#xff0c;其卓越的产品功能极大地简化和提升了数据分析的效率&#xff0c;使得"One Data&#xff0c;All Analytics" 的愿景变得更加触手可及。 虽然实现这一目标的道路充满挑战且漫…

python学习笔记—17—数据容器之字符串

1. 字符串 (1) 字符串能通过下标索引来获取其中的元素 (2) 旧字符串无法修改特定下标的元素 (3) index——查找字符串中任意元素在整个字符串中的起始位置(单个字符或字符串都可以) tmp_str "supercarrydoinb" tmp_position1 tmp_str.index("s") tmp_p…

跟着逻辑先生学习FPGA-第八课 基于 I2C 协议的 EEPROM 驱动控制

硬件平台&#xff1a;征战Pro开发板 软件平台&#xff1a;Vivado2018.3 仿真软件&#xff1a;Modelsim10.6d 文本编译器&#xff1a;Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1知识背景 I2C 通讯协议&#xf…

Mac上鸿蒙配置HDC报错:zsh: command not found: hdc -v

这个问题困扰了好久&#xff0c;按照官方文档去配置的&#xff0c;就是会一直报错&#xff0c;没有配置成功&#xff0c;主要原因是官网ide的路径可能和你本地的ide的路径不一致&#xff0c;因为官网的ide版本可能是最新的 一.先查找你本地的toolchains目录在哪里&#xff0c;…

基于华为ENSP的OSPF状态机、工作过程、配置保姆级别详解(2)

本篇技术博文摘要 &#x1f31f; 基于华为enspOSPF状态机、OSPF工作过程、.OSPF基本配置等保姆级别具体详解步骤&#xff1b;精典图示举例说明、注意点及常见报错问题所对应的解决方法 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我…

【Rust自学】11.1. 编写和运行测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.1.1. 什么是测试 在Rust里一个测试就是一个函数&#xff0c;它被用于验证非测试代码的功能是否和预期一致。 在一个测试的函数体里通…

计算机网络 (31)运输层协议概念

一、概述 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。运输层的一个核心功能是提供从源端主机到目的端主机的可靠的、与实际使用的网络无关的信息传输。它向高层用…

cache原理

理论基础 时间局部性空间局部性 存储结构 存储器 ROMRAM SRAM->CACHEDRAM->MEM CACHE与主存映射 直接映射 假定主存储器32位地址&#xff0c;cache行64B&#xff0c;cache容量512B&#xff0c;则cache有8行 全相联映射 假定主存储器32位地址&#xff0c;cache…

嵌入式入门Day38

C Day1 第一个C程序C中的输入输出输出操作coutcin练习 命名空间使用方法自定义命名空间冲突问题 C对字符串的扩充C风格字符串的使用定义以及初始化C风格字符串与C风格字符串的转换C风格的字符串的关系运算常用的成员变量输入方法 布尔类型C对堆区空间使用的扩充作业 第一个C程序…

流浪猫流浪狗领养PHP网站源码

源码介绍 流浪猫流浪狗领养PHP网站源码&#xff0c;适合做猫狗宠物类的发信息发布。当然其他信息发布也是可以的。 导入数据库&#xff0c;修改数据库配置/application/database.php 设置TP伪静态&#xff0c;设置运行目录&#xff0c; 后台&#xff1a;/abcd.php/dashboard?…

深度学习|表示学习|一个神经元可以干什么|02

如是我闻&#xff1a; 如果我们只有一个神经元&#xff08;即一个单一的线性或非线性函数&#xff09;&#xff0c;仍然可以完成一些简单的任务。以下是一个神经元可以实现的功能和应用&#xff1a; 1. 实现简单的线性分类 输入&#xff1a;一组特征向量 x x x 输出&#xff…

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起&#xff0c;正向定位到当前行的首个字符 b2 从光标位置起&#xff0c;反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…

使用 SQL 和表格数据进行问答和 RAG(7)—将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中

将表格数据&#xff08;CSV 或 Excel 文件&#xff09;加载到向量数据库&#xff08;ChromaDB&#xff09;中。这里定义的类 PrepareVectorDBFromTabularData&#xff0c;它的主要功能是读取表格数据文件到DataFrame中、生成嵌入向量、并将这些数据存储在向量数据库的集合中&am…

【git】-2 分支管理

目录 一、分支的概念 二、查看、创建、切换分支 1、查看分支-git branch 2、创建分支- git branch 分支名 3、切换分支- git checkout 分支名 三、git指针 -实现分支和版本间的切换 四、普通合并分支 git merge 文件名 五、冲突分支合并 ​​​​​​【git】-初始gi…

搜广推面经五

饿了么推荐算法 一、介绍InfoNCE Loss、InfoNCE温度系数的作用 InfoNCE Loss&#xff08;Information Noise Contrastive Estimation Loss&#xff09;是一种常用于自监督学习和对比学习中的损失函数&#xff0c;特别是在信息论和无监督学习中有广泛应用。 它的核心思想是通过…