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

news2025/1/11 3:47:02

前言

参数服务器在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 否则返回false
    bool 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::NodeHandle
        param(键,默认值) 
            存在,返回对应结果,否则返回默认值
        getParam(键,存储结果的变量)
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值
        getParamCached键,存储结果的变量)--提高变量获取效率
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值
        getParamNames(std::vector<std::string>)
            获取所有的键,并存储在参数 vector 中 
        hasParam(键)
            是否包含某个键,存在返回 true,否则返回 false
        searchParam(参数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.coloradmin.cn/o/2274682.html

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

相关文章

《零基础Go语言算法实战》【题目 1-18】切片的反转

《零基础Go语言算法实战》 【题目 1-18】切片的反转 请编写一个名为 reverse 的函数&#xff0c;采用整数切片并在不使用临时切片的情况下将切片反转。 【解答】 可以通过 for 循环交换切片中每个元素的值&#xff0c;使其从左向右滑动。最终&#xff0c;所有元素都将 被反转。…

Elasticsearch:搜索相关性

这里写目录标题 一、相关性的概述二、自定义评分策略1、TF-IDF算法2、BM25算法 三、自定义评分策略1、Index Boost&#xff1a;在索引层面修改相关性2、boosting&#xff1a;修改文档相关性3、negative_boost&#xff1a;降低相关性4、function_score&#xff1a;自定义评分5、…

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a; 期待您的关注 题目描述&#xff1a; 原题链接&#xff1a; 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; …

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向&#xff0c;有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念&#xff1a; Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio&#xff0c;區別是前者是cocos2djs專用的開發工具&#xff0c;後者則是coco…

概率论与数理统计总复习

复习课本&#xff1a;中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布&#xff08;两点分布&#xff09; 7.二项分布 8.帕斯卡分布&#xff08;负二项分布&am…

el-table自定义按钮控制扩展expand

需求&#xff1a;自定义按钮实现表格扩展内容的展开和收起&#xff0c;实现如下&#xff1a; 将type“expand”的表格列的宽度设置为width"1"&#xff0c;让该操作列不展示出来&#xff0c;然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…

大语言模型训练的数据集从哪里来?

继续上篇文章的内容说说大语言模型预训练的数据集从哪里来以及为什么互联网上的数据已经被耗尽这个说法并不专业&#xff0c;再谈谈大语言模型预训练数据集的优化思路。 1. GPT2使用的数据集是WebText&#xff0c;该数据集大概40GB&#xff0c;由OpenAI创建&#xff0c;主要内…

【C++习题】22.随机链表的复制

文章目录 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09;代码&#xff1a; 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 链接&#x1f517;&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&…

C# 或 .NetCore 如何使用 NPOI 导出图片到 Excel 文件

今天在本文中&#xff0c;我们将尝试使用NPOI库将图像插入到 Excel 文件的特定位置。请将以下逻辑添加到您的写作方法中&#xff0c;在 Excel 文件中添加图像&#xff08;JPEG、PNG&#xff09;,我已经有一个示例 jpeg 文件 - Read-write-excel-npoi.jpg &#xff0c;我们将尝试…

Photon最新版本PUN 2.29 PREE,在无网的局域网下,无法连接自己搭建的本地服务器

1.图1为官方解答 2.就是加上这一段段代码&#xff1a;PhotonNetwork.NetworkingClient.SerializationProtocol SerializationProtocol.GpBinaryV16; 完美解决 unity 商店最新PUN 2 插件 不能连接 &#xff08;环境为&#xff1a;本地局域网 无外网情况 &#xff09; …

Python 爬虫验证码识别

在我们进行爬虫的过程中&#xff0c;经常会碰到有些网站会时不时弹出来验证码识别。我们该如何解决呢&#xff1f;这里分享 2 种我尝试过的方法。 0.验证码示例 1.OpenCV pytesseract 使用 Python 中的 OpenCV 库进行图像预处理&#xff08;边缘保留滤波、灰度化、二值化、…

【Rust自学】10.7. 生命周期 Pt.3:输入输出生命周期与3规则

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.7.1. 深入理解生命周期 1.指定生命周期参数的方式依赖于函数所做的事情 以上一篇文章的代码为例子&#xff1a; fn longest<a&g…

创建并配置华为云虚拟私有云

目录 私有云 创建虚拟私有云 私有云 私有云是一种云计算模式&#xff0c;它将云服务部署在企业或组织内部的私有基础设施上&#xff0c;仅供该企业或组织内部使用&#xff0c;不对外提供服务.私有云的主要特点包括&#xff1a; 私密性&#xff1a;私有云的资源&#xff08;如…

子父组件传值

Angular 2 及以上版本中的父子组件通信方式 在 Angular 2 及以上版本中&#xff0c;父子组件通信主要通过以下几种方式实现&#xff1a; 一、使用Input()进行父向子通信 父组件通过属性绑定的方式将数据传递给子组件&#xff0c;子组件使用Input()装饰器来接收这些数据。 二…

wireshark排除私接小路由

1.wireshark打开&#xff0c;发现了可疑地址&#xff0c;合法的地址段DHCP是192.168.100.0段的&#xff0c;打开后查看发现可疑地址段&#xff0c;分别是&#xff0c;192.168.0.1 192.168.1.174 192.168.1.1。查找到它对应的MAC地址。 ip.src192.168.1.1 2.通过show fdb p…

机器学习实战——决策树:从原理到应用的深度解析

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​ ​​ 决策树&#xff08;Decision Tree&#xff09;是一种简单而直观的分类与回归模型&#xff0c;在机器学习中广泛应用。它的…

2025年01月09日Github流行趋势

1. 项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;22750今日star数&#xff1a;1272项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, eltociear项目简介&#xff1a;你…

用python实现烟花代码,完整代码拿走不谢

有时候用python实现一些有趣的代码&#xff0c;既有趣&#xff0c;又能提升知识 使用Python实现动态烟花代码 效果如下&#xff1a; 不废话&#xff0c;直接上代码&#xff1a; import pygame from random import randint, uniform, choice import mathvector pygame.math…

Python机器学习笔记(十八、交互特征与多项式特征)

添加原始数据的交互特征&#xff08;interaction feature&#xff09;和多项式特征&#xff08;polynomial feature&#xff09;可以丰富特征表示&#xff0c;特别是对于线性模型。这种特征工程可以用统计建模和许多实际的机器学习应用中。 上一次学习&#xff1a;线性模型对w…

数据结构——栈的实现

今天&#xff0c;我们来写一下关于栈的博文。 1.首先我们先了解一下什么是栈&#xff1f; 一&#xff1a;概念&#xff1a; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另…