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

1 参数服务器理论模型

参数服务器实现是最为简单的,该模型如下图所示,该模型中涉及到三个角色:

  • ROS Master (管理者)
  • Talker (参数设置者)
  • Listener (参数调用者)
    ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。

    整个流程由以下步骤实现:

1.1 Talker 设置参数

Talker 通过 RPC 向参数服务器发送参数(包括参数名与参数值),ROS Master 将参数保存到参数列表中。

1.2 Listener 获取参数

Listener 通过 RPC 向参数服务器发送参数查找请求,请求中包含要查找的参数名。

1.3 ROS Master 向 Listener 发送参数值

ROS Master 根据步骤2请求提供的参数名查找参数值,并将查询结果通过 RPC 发送给 Listener。

1.4 参数的数据类型:

  • 32-bit integers
  • booleans
  • strings
  • doubles
  • iso8601 data
  • lists
  • base64-encoded binary data
  • 字典

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

2 参数服务器操作(C++)

需求: 实现参数服务器参数的增删改查操作,可以通过两套 API 实现:

  • ros::NodeHandle
  • ros::param

2.1 参数服务器新增(修改)参数

/*参数服务器操作之新增与修改(二者API一样)_C++实现:在 roscpp 中提供了两套 API 实现参数操作ros::NodeHandlesetParam("键",值)ros::paramset("键","值")示例:分别设置整形、浮点、字符串、bool、列表、字典等类型参数修改(相同的键,不同的值)*/
#include "ros/ros.h"int main(int argc, char *argv[])
{ros::init(argc,argv,"set_update_param");std::vector<std::string> stus;stus.push_back("zhangsan");stus.push_back("李四");stus.push_back("王五");stus.push_back("孙大脑袋");std::map<std::string,std::string> friends;friends["guo"] = "huang";friends["yuang"] = "xiao";//NodeHandle--------------------------------------------------------ros::NodeHandle nh;nh.setParam("nh_int",10); //整型nh.setParam("nh_double",3.14); //浮点型nh.setParam("nh_bool",true); //boolnh.setParam("nh_string","hello NodeHandle"); //字符串nh.setParam("nh_vector",stus); // vectornh.setParam("nh_map",friends); // map//修改演示(相同的键,不同的值)nh.setParam("nh_int",10000);//param--------------------------------------------------------ros::param::set("param_int",20);ros::param::set("param_double",3.14);ros::param::set("param_string","Hello Param");ros::param::set("param_bool",false);ros::param::set("param_vector",stus);ros::param::set("param_map",friends);//修改演示(相同的键,不同的值)ros::param::set("param_int",20000);return 0;
}

2.2 参数服务器获取参数

/*参数服务器操作之查询_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 类似
*/#include "ros/ros.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"get_param");//NodeHandle--------------------------------------------------------/*ros::NodeHandle nh;// param 函数int res1 = nh.param("nh_int",100); // 键存在int res2 = nh.param("nh_int2",100); // 键不存在ROS_INFO("param获取结果:%d,%d",res1,res2);// getParam 函数int nh_int_value;double nh_double_value;bool nh_bool_value;std::string nh_string_value;std::vector<std::string> stus;std::map<std::string, std::string> friends;nh.getParam("nh_int",nh_int_value);nh.getParam("nh_double",nh_double_value);nh.getParam("nh_bool",nh_bool_value);nh.getParam("nh_string",nh_string_value);nh.getParam("nh_vector",stus);nh.getParam("nh_map",friends);ROS_INFO("getParam获取的结果:%d,%.2f,%s,%d",nh_int_value,nh_double_value,nh_string_value.c_str(),nh_bool_value);for (auto &&stu : stus){ROS_INFO("stus 元素:%s",stu.c_str());        }for (auto &&f : friends){ROS_INFO("map 元素:%s = %s",f.first.c_str(), f.second.c_str());}// getParamCached()nh.getParamCached("nh_int",nh_int_value);ROS_INFO("通过缓存获取数据:%d",nh_int_value);//getParamNames()std::vector<std::string> param_names1;nh.getParamNames(param_names1);for (auto &&name : param_names1){ROS_INFO("名称解析name = %s",name.c_str());        }ROS_INFO("----------------------------");ROS_INFO("存在 nh_int 吗? %d",nh.hasParam("nh_int"));ROS_INFO("存在 nh_intttt 吗? %d",nh.hasParam("nh_intttt"));std::string key;nh.searchParam("nh_int",key);ROS_INFO("搜索键:%s",key.c_str());*///param--------------------------------------------------------ROS_INFO("++++++++++++++++++++++++++++++++++++++++");int res3 = ros::param::param("param_int",20); //存在int res4 = ros::param::param("param_int2",20); // 不存在返回默认ROS_INFO("param获取结果:%d,%d",res3,res4);// getParam 函数int param_int_value;double param_double_value;bool param_bool_value;std::string param_string_value;std::vector<std::string> param_stus;std::map<std::string, std::string> param_friends;ros::param::get("param_int",param_int_value);ros::param::get("param_double",param_double_value);ros::param::get("param_bool",param_bool_value);ros::param::get("param_string",param_string_value);ros::param::get("param_vector",param_stus);ros::param::get("param_map",param_friends);ROS_INFO("getParam获取的结果:%d,%.2f,%s,%d",param_int_value,param_double_value,param_string_value.c_str(),param_bool_value);for (auto &&stu : param_stus){ROS_INFO("stus 元素:%s",stu.c_str());        }for (auto &&f : param_friends){ROS_INFO("map 元素:%s = %s",f.first.c_str(), f.second.c_str());}// getParamCached()ros::param::getCached("param_int",param_int_value);ROS_INFO("通过缓存获取数据:%d",param_int_value);//getParamNames()std::vector<std::string> param_names2;ros::param::getParamNames(param_names2);for (auto &&name : param_names2){ROS_INFO("名称解析name = %s",name.c_str());        }ROS_INFO("----------------------------");ROS_INFO("存在 param_int 吗? %d",ros::param::has("param_int"));ROS_INFO("存在 param_intttt 吗? %d",ros::param::has("param_intttt"));std::string key;ros::param::search("param_int",key);ROS_INFO("搜索键:%s",key.c_str());return 0;
}

2.3 参数服务器删除参数

/* 参数服务器操作之删除_C++实现:ros::NodeHandledeleteParam("键")根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 falseros::paramdel("键")根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false*/
#include "ros/ros.h"int main(int argc, char *argv[])
{   setlocale(LC_ALL,"");ros::init(argc,argv,"delete_param");ros::NodeHandle nh;bool r1 = nh.deleteParam("nh_int");ROS_INFO("nh 删除结果:%d",r1);bool r2 = ros::param::del("param_int");ROS_INFO("param 删除结果:%d",r2);return 0;
}

ROS系列(四):ROS通信机制系列(3):参数服务器相关推荐

  1. ROS的四种通信架构

    ROS的通信方式是ROS最为核心的概念,ROS系统的精髓就在于它提供的通信架构.ROS的通信方式有以下四种: Topic 主题 Service 服务 Parameter Service 参数服务器 A ...

  2. ROS的四种通信架构(转载)

    转载自:https://blog.csdn.net/sru_alo/article/details/100100761 如果有侵权请联系删除 ROS的通信方式是ROS最为核心的概念,ROS系统的精髓就 ...

  3. ROS系列教程三:roslaunch文件及参数服务器

    一.标签简介 1.<launch> ... </launch> : 根标签,一般写在整个launch文件的头尾,斜杠/代表结束: 2.<node> :启动节点,如果 ...

  4. 摄像头 保存到外网服务器_【小喵科技】物联网教程系列四:喵家外网IOT服务器...

    HOT新品热卖中■■■■■ 双向海量教学课程 无论是家长还是老师,都可以给孩子一个更好的未来 分享给更多的人 加入我们吧! 夏至の时光 ▼往期精彩课程在文章末尾 ▼喵家外网IOT服务器--快速上手 在 ...

  5. Chapter2 ROS通信机制----基础篇(Ⅰ)vs配置及通信基础

    目录 一.复习及launch 1.1 深入理解配置信息(非常重要) 1.2 launch文件演示 二.ROS通信机制-----基础 2.1 本节导论 2.2 话题通信 2.2.1 话题通信概述 2.2 ...

  6. ROS自主导航学习———ROS通信机制

    前言 前面ROS很多都忘记了 ,现在来重新回顾一下内容 ROS 中的基本通信机制主要有如下三种实现策略: 话题通信(发布订阅模式) 服务通信(请求响应模式) 参数服务器(参数共享模式) Action通 ...

  7. ROS通信机制一---话题通信

    文章目录 总述 1. 话题通信模型 2. 话题通信基本实现示例 2.1 发布者 2.1.1 创建发布者topic_pub.cpp文件 2.1.2 修改CMakeLists.txt文件 2.1.3 编译 ...

  8. ROS入门跟着我就够了(二)上 ROS通信机制

    由于这一章东西比较多,我分了上下两篇,下部分可以在< ROS 入门跟着我就够了>专辑中查看 ROS 中的基本通信机制主要有如下三种实现策略: 话题通信(发布订阅模式)服务通信(请求响应模式 ...

  9. 【ROS理论与实践-赵虚左老师】Chap2 ROS通信机制

    第二章 ROS通信机制 通信是ROS中的核心 Core 机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达.摄像头.GPS-)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是 ...

最新文章

  1. Difference between expressions and statements?
  2. 文档自动排序长短_css 文档流
  3. JavaScript数据结构与算法——基本排序算法
  4. java读取文件方法
  5. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
  6. 玩转oracle 11g(32):plsql版本低需到配置文件中添加配置
  7. 漂亮的不太像手机!三星Galaxy S11最新渲染图曝光
  8. easui Pagination Layout
  9. 推荐 | 自然语言处理、计算机视觉等机器学习实战项目练手平台
  10. layui 自定义排序_layui使用心得
  11. xml中的if和截取字符串
  12. Mac环境变量配置(Java)
  13. Github上热搜的Java开源商城项目合集,这个是真的好
  14. SQL server 数据库分离成功后,但还是压缩不了,.mdf和.ldf文件拒绝访问
  15. 寒江独钓:键盘的过滤 学习笔记
  16. WAF绕过-漏洞发现之代理池指纹被动探针
  17. [转]ModSecurity for Apache 1.8.7 用户手册
  18. javaEE开发如何在oracle官网下载安装jdk?(java SE 8u5 JDK 和 Java EE 7 SDK with JDK 7 U45的区别 )
  19. 麻省理工科技评论:AI预言的七宗罪(上)
  20. 批归一化作用_为什么数据要做归一化处理,什么是批归一化?

热门文章

  1. QT中窗口置顶失效问题解决方案
  2. 计算机维修主板电容谷包维修,计算机主板维修之电容篇
  3. Windows 7国家语言支持
  4. AI赐子?!学习数百万个胚胎发育过程,算法可将试管婴儿成功率提高3倍
  5. 计算机的表白隐藏功能,微信隐藏符号功能大全 情人节可以发这些表白
  6. html盒子移动动画代码,详解盒子端CSS动画性能提升
  7. 基于kintex UltraScale XCKU040的双路QSFP+光纤PCIe卡383 光纤PCIe卡
  8. web前端工程师做什么
  9. 【Tableau 设计提示16】如何在 Tableau 中使用标记(批注)
  10. Godot4补间动画Tween