参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场景如下:

导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径

上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:

  • 路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数

参数服务器,一般适用于存在数据共享的一些应用场景。

概念

以共享的方式实现不同节点之间数据交互的通信模式。

作用

存储一些多节点共享的数据,类似于全局变量。

案例

实现参数增删改查操作。

另请参考:

  • http://wiki.ros.org/Parameter%20Server

  • http://wiki.ros.org/roscpp/Overview/Parameter%20Server

  • http://wiki.ros.org/rospy/Overview/Parameter%20Server

1 参数服务器理论模型

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

  • ROS Master (管理者)

  • Talker (参数设置者)

  • Listener (参数调用者)

ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。

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

(1).Talker 设置参数

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

(2).Listener 获取参数

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

(3).ROS Master 向 Listener 发送参数值

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


参数可使用数据类型:

  • 32-bit integers

  • booleans

  • strings

  • doubles

  • iso8601 dates

  • lists

  • base64-encoded binary data

  • 字典

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

2 参数操作A(C++)

需求:实现参数服务器参数的增删改查操作。

在 C++ 中实现参数服务器数据的增删改查,可以通过两套 API 实现:

  • ros::NodeHandle

  • ros::param

下面为具体操作演示

(1).参数服务器新增(修改)参数

#include "ros/ros.h"/*实现参数的新增和修改需求:设置机器人的共享参数:类型和半径(0.15)再修改半径(0.2)实现:ros::NodeHandle     setParamros::Param          set*/int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");//初始化ros节点ros::init(argc,argv,"set_param");//创建节点句柄ros::NodeHandle nh;//参数增---------------------------------//方式1:nhnh.setParam("type","小黄车");nh.setParam("radius",0.15);//方式2:ros::Paramros::param::set("type_param","小黑车");ros::param::set("type_radius",0.15);//参数改---------------------------------//方式1:nh//方式2:ros::Paramreturn 0;
}

配置文件

测试

roscore
source ./devel/setup.bash
rosrun plumbing_param_server demo01_param_set
rosparam list

修改

保证键是要修改的,值会覆盖

//参数改---------------------------------//方式1:nhnh.setParam("radius",0.2);//方式2:ros::Paramros::param::set("type_radius",0.25);

(2)参数服务器获取参数

#include "ros/ros.h"/*演示参数查询   实现:ros::NodeHandle   --------------------------------------------------param(键,默认值) 存在,返回对应结果,否则返回默认值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 -----------------------------------------------------------*/int main(int argc, char  *argv[])
{//设置编码吗setlocale(LC_ALL,"");//初始化ros节点ros::init(argc,argv,"get_param");//创建节点句柄ros::NodeHandle nh;//   ros::NodeHandle   --------------------------------------------------//1 paramdouble radius = nh.param("radius",0.5);ROS_INFO("radius = %f",radius);return 0;
}

getParam(键,存储结果的变量)存在,返回 true,且将值赋值给参数2若果键不存在,那么返回值为 false,且不为参数2赋值//2  getParamdouble  radius2  = 0.0;bool result = nh.getParam("radius",radius2);if(result){ROS_INFO("获取的半径是%f",radius2);}else{ROS_INFO("被查询的变量不存在");}

  getParamCached键,存储结果的变量)--提高变量获取效率存在,返回 true,且将值赋值给参数2若果键不存在,那么返回值为 false,且不为参数2赋值//3    getParamCacheddouble  radius3  = 0.0;result = nh.getParamCached("radius",radius3);if(result){ROS_INFO("3获取的半径是%f",radius3);}else{ROS_INFO("被查询的变量不存在");}

  getParamNames(std::vector<std::string>)获取所有的键,并存储在参数 vector 中 //4 getParamNames(std::vector<std::string>)std::vector<std::string> names;nh.getParamNames(names);//遍历for(auto &&name:names){ROS_INFO("遍历到的元素是:%s",name.c_str());}

 hasParam(键)是否包含某个键,存在返回 true,否则返回 false//5  hasParam(键)result = nh.hasParam("radius");if(result){ROS_INFO("radius存在");}else{ROS_INFO("radius不存在");}

searchParam(参数1,参数2)搜索键,参数1是被搜索的键,参数2存储搜索结果的变量//6 searchParam(参数1,参数2)std::string key;nh.searchParam("radius",key);ROS_INFO("搜索结果是:%s",key.c_str());

ros::param的函数与ros::NodeHandle相似

(3)参数服务器删除参数

 参数服务器操作之删除_C++实现:ros::NodeHandledeleteParam("键")根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 falseros::paramdel("键")根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
#include "ros/ros.h"/*参数服务器操作之删除_C++实现:ros::NodeHandledeleteParam("键")根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 falseros::paramdel("键")根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
*/int main(int argc, char  *argv[])
{setlocale(LC_ALL,"");//初始化ros节点ros::init(argc,argv,"param_del");//创建节点句柄ros::NodeHandle nh;//删除,使用NodeHandle----------------------------------------bool flag1 = nh.deleteParam("radius");if(flag1){ROS_INFO("删除成功");}else{ROS_INFO("删除失败");}//删除,使用param-------------------------------------------------bool flag2 = ros::param::del("type_radius");if(flag2){ROS_INFO("type_radius删除成功");}else{ROS_INFO("type_radius删除失败");}return 0;
}

只能删一次

【ROS】参数服务器相关推荐

  1. rosparam和ROS参数服务器的使用(C++ Python)

    1. Prob. 在一个项目里经常会处理很多不同的参数,同时有很多参数是共用的,每个节点都分别定义的话,某一次修改容易造成不同步的问题.为了方便统一和同步,可以使用ROS的参数服务器来完成上述的事情, ...

  2. ROS参数服务器(参数使用详细介绍)

    参数服务器是可通过网络访问的共享的多变量字典.它是节点存储参数的地方.用于配置参数.全局共享参数.参数服务器使用互联网传输,在节点管理器中运行,实现整个通信过程.它使用XMLRPC数据类型为参数赋值, ...

  3. Linux Ubuntu 16.04 安装 yaml-cpp ROS 下参数服务器及yaml-cpp实现参数读写

    Linux Ubuntu 16.04 安装 yaml-cpp & ROS 下使用.yaml文件实现参数读写 0. 准备工作 1. 安装yaml-cpp 2. ROS中使用.yaml文件实现参数 ...

  4. [ROS](12)ROS通信 —— 参数服务器(Parameter Server)通信

      文章只是个人学习过程中学习笔记,主要参考ROS教程1 2 . [ROS](01)创建ROS工作空间 [ROS](02)创建&编译ROS软件包Package [ROS](03)CMakeLi ...

  5. param参数服务器

    声明:本文主要内容来自: MOOC 机器人操作系统入门.仅仅是为了查阅方便,做了个小结,侵权必删! Table of Contents 零.param介绍 0.0 param有什么用 0.1参数类型 ...

  6. rosparam和ROS参数服务

    机器人工作时,我们有需要对机器人的参数(如传感器参数.算法的参数)进行设置. 有些参数(如机器人的轮廓.传感器的高度)在机器人启动时就设定好就行了: 有些参数则需要动态改变(特别是在调试的时候). R ...

  7. ROS机器人程序设计(原书第2版)2.4.8 使用参数服务器

    2.4.8 使用参数服务器 参数服务器用于存储所有节点均可访问的共享数据.ROS中用来管理参数服务器的工具称为rosparam.接受的参数如下所示: rosparam set parameter va ...

  8. ROS学习小笔记(Topic通信 ,service通信,参数服务器)

    (菜鸡整理的学习笔记,原文链接已经挂上,不小心过来的朋友建议去博主那边学习,谢谢) 原文链接:https://blog.csdn.net/LoongEmbedded/article/details/1 ...

  9. ROS系列(四):ROS通信机制系列(3):参数服务器

    参数服务器在ROS中主要用于实现不同节点之间的数据共享.参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的 ...

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

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

最新文章

  1. Android sudio Day01-1
  2. 精简版开发工具使用手记2(图解)
  3. centos安装mysql密码_centos 安装mysql并设置密码
  4. 为什么国内SaaS很难爆发
  5. #个人博客作业week2——结对编程伙伴代码复审
  6. 接收率高达29%的ICLR 2021有哪些论文入榜呢?
  7. 四、CXF WebService中传递复杂类型对象
  8. C语言:替换字符串中某一段子字符串
  9. 树上启发式合并算法概述及习题
  10. react实现动画电子倒计时组件
  11. Ogre 合成器 compositor
  12. 微服务Feign调用后开启Schedule报错No thread-bound request found: Are you referring to request attributes outsid
  13. java.io.IOException:Permission denied
  14. android studio jni.h 红色报错
  15. 土地利用覆盖数据(欧空局CCI300m)数据分享
  16. 青岛大学计算机科学技术学院图灵班,北京大学计算机实验班(图灵班)介绍
  17. Dronekit 搭配使用Ardupilot 和 PX4
  18. java修饰符(转)
  19. 基金老鼠仓调查云端稽查发力 大数据堪比淘宝
  20. 一份能帮助到你的2021年终总结

热门文章

  1. 文献综述计算机辅助药物设计,科普小文:计算机辅助药物设计之“分子对接技术”...
  2. halcon——设置字体大小
  3. 英语谚语500句(二)
  4. JDBC、MAVEN概述
  5. host 问题 和 证书问题
  6. EPC 1000HE 多点触摸板Smart-Pad使用总结
  7. 【CF771A】Bear and Friendship Condition(并查集加深理解)
  8. 最强OLAP分析引擎-Clickhouse快速精通-上
  9. js二进制文件流上传到后台
  10. 导航--一个基本的垂直导航