声明:本文主要内容来自: MOOC 机器人操作系统入门.仅仅是为了查阅方便,做了个小结,侵权必删!

Table of Contents

零.param介绍

0.0 param有什么用

0.1参数类型

二.如何使用----三种维护方式

2.1命令行维护

2.2.launch文件

2.2.1 yaml文件

2.3node源码

三.命名空间对param的影响


零.param介绍

0.0 param有什么用

机器人工作时,我们有需要对机器人的参数(如传感器参数、算法的参数)进行设置。有些参数(如机器人的轮廓、传感器的高度)在机器人启动时就设定好就行了;有些参数则需要动态改变(特别是在调试的时候)。ROS提供了参数服务器来满足这一需求。我们可以将参数设置在参数服务器,在需要用到参数的时候再从参数服务器中获取。[1]

0.1参数类型

ROS参数服务器为参数值使用XMLRPC数据类型, 其中包括:strings, integers, floats,booleans, lists, dictionaries, iso8601 dates, and base64-encoded data

二.如何使用----三种维护方式

2.1命令行维护

2.2.launch文件

parameter是ROS系统中运行的参数,存储在参数服务器当中.在launch文件当中通过<param>元素加载parameter;launch文件执行后,parameter就加载到ROS的参数服务器上了.

launch文件中有很多标签, 而与参数服务器相关的标签只有两个, 一个是 <param> , 另一个是 <rosparam>rosparam可操作多个参数,以及yaml文件参数,param一次性只能指定一个参数,且是标准类型的参数。

  • <param>标签可用于直接设置参数,也可以从文件中读取
  • <rosparam>标签用于从yaml文件中读取并设置参数,也可以设置多个参数
  • roslaunch发现<param>和<rosparam>标签后会调用rosparam包来实现设置
<launch><!--param参数配置--><param name="param1" value="1" /><param name="param2" value="2" /><!--param name="table_description" command="$(find xacro)/xacro.py $(find gazebo_worlds)/objects/table.urdf.xacro" /--><!--rosparam参数配置  一次设置多个参数--><rosparam>   param3: 3param4: 4param5: 5</rosparam><!--以上写法将参数转成YAML文件加载,注意param前面必须为空格,不能用Tab,否则YAML解析错误--><!--rosparam file="$(find robot_sim_demo)/config/xbot-u_control.yaml" command="load" /--><node pkg="param_demo" type="param_demo" name="param_demo" output="screen" /></launch>

2.2.1 yaml文件

这个例子在自己创建的功能包param_meter下.

  • 如下图所示在功能包下创建新的文件夹param,再在这个文件夹下创建 yaml文件param.yaml.

  • 编写yaml文件
parammeter_test:param3: 56param4: 58param5: 96
  • 在launch文件中进行修改

加入

 <rosparam file="$(find param_meter)/param/param.yaml" command="load" />

变成

<launch><!--param参数配置--><param name="param1" value="1" /><param name="param2" value="2" /><!--param name="table_description" command="$(find xacro)/xacro.py $(find gazebo_worlds)/objects/table.urdf.xacro" /--><!--rosparam参数配置--><rosparam>   param3: 3param4: 12param5: 9</rosparam><!--以上写法将参数转成YAML文件加载,注意param前面必须为空格,不能用Tab,否则YAML解析错误--><rosparam file="$(find param_meter)/param/param.yaml" command="load" /><!--rosparam file="$(find robot_sim_demo)/config/xbot-u_control.yaml" command="load" /--><node pkg="param_meter" type="param_meter" name="param_meter" output="screen" /></launch>
  • 运行launch文件

得到了运行结果,param的值和自己设置的相同.

2.3node源码

关于param的API, roscpp为我们提供了两套, 一套是放在 ros::param namespace下, 另一套是在 ros::NodeHandle 下, 这
两套API的操作完全一样, 用哪一个取决于你的习惯。

  • ros::param namespace
  • ros::NodeHandle

和param相关的操作如下:

  • get param
  • set param
  • check param
  • delete param
#include<ros/ros.h>int main(int argc, char **argv){ros::init(argc, argv, "param_demo");ros::NodeHandle nh;int parameter1, parameter2, parameter3, parameter4, parameter5;//Get Param的三种方法//① ros::param::get()获取参数“param1”的value,写入到parameter1上bool ifget1 = ros::param::get("param1", parameter1);//② ros::NodeHandle::getParam()获取参数,与①作用相同bool ifget2 = nh.getParam("param2",parameter2);//③ ros::NodeHandle::param()类似于①和②//但如果get不到指定的param,它可以给param指定一个默认值(如33333)nh.param("param3", parameter3, 33333);if(ifget1)ROS_INFO("Get param1 = %d", parameter1);elseROS_WARN("Didn't retrieve param1");if(ifget2)ROS_INFO("Get param2 = %d", parameter2);elseROS_WARN("Didn't retrieve param2");if(nh.hasParam("param3"))ROS_INFO("Get param3 = %d", parameter3);elseROS_WARN("Didn't retrieve param3");//Set Param的两种方法//① ros::param::set()设置参数parameter4 = 4;ros::param::set("param4", parameter4);//② ros::NodeHandle::setParam()设置参数parameter5 = 5;nh.setParam("param5",parameter5);ROS_INFO("Param4 is set to be %d", parameter4);ROS_INFO("Param5 is set to be %d", parameter5);//Check Param的两种方法//① ros::NodeHandle::hasParam()bool ifparam5 = nh.hasParam("param5");//② ros::param::has()bool ifparam6 = ros::param::has("param6");if(ifparam5) ROS_INFO("Param5 exists");elseROS_INFO("Param5 doesn't exist");if(ifparam6) ROS_INFO("Param6 exists");elseROS_INFO("Param6 doesn't exist");//Delete Param的两种方法//① ros::NodeHandle::deleteParam()bool ifdeleted5 = nh.deleteParam("param5");//② ros::param::del()bool ifdeleted6 = ros::param::del("param6");}

三.命名空间对param的影响

在实际的项目中, 实例化句柄时, 经常会看到两种不同的写法 ros::NodeHandle n;  ros::NodeHandle nh("~");` 这两种写法有什么不同呢? launch文件夹的demo.launch定义两个参数, 一个全局serial 他的数值是5,一个是局部的serial, 他的数值是10.在launch 标签内的是全局参数值, node 标签内的是局部参数其有效域是当前节点。[2]

<launch><!--全局参数serial--><param name="serial" value="5" /><node name="name_demo" pkg="name_demo" type="name_demo"output="screen"><!--局部参数serial--><param name="serial" value="10" /></node>
</launch>

在name_demo.cpp中, 我们分别尝试了, 利用全局命名空间句柄提取全局的param和局部的param以及在局部命名空间下的句柄提取全局的param和局部的param, 详细的代码如下 :

#include <ros/ros.h>int main(int argc, char* argv[])
{int serial_number = -1;//serial_number初始化ros::init(argc, argv, "name_demo");//node初始化/*创建命名空间*///n 是全局命名空间ros::NodeHandle n;//nh 是局部命名空间ros::NodeHandle nh("~");/*全局命名空间下的Param*/ROS_INFO("global namespace");//提取全局命名空间下的参数serialn.getParam("serial", serial_number);ROS_INFO("global_Serial was %d", serial_number);//提取局部命名空间下的参数serialn.getParam("name_demo/serial", serial_number);//在全局命名空间下,要提取局部命名空间下的参数,需要添加node nameROS_INFO("global_to_local_Serial was %d", serial_number);/*局部命名空间下的Param*/ROS_INFO("local namespace");//提取局部命名空间下的参数serialnh.getParam("serial", serial_number);ROS_INFO("local_Serial was %d", serial_number);//提取全局命名空间下的参数serialnh.getParam("/serial", serial_number);//在局部命名空间下,要提取全局命名空间下的参数,需要添加“/”ROS_INFO("local_to_global_Serial was %d", serial_number);ros::spin();return 0;
}

参考:

1.https://blog.csdn.net/u014695839/article/details/78348600

2.MOOC 机器人操作系统入门

param参数服务器相关推荐

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

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

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

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

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

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

  4. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (5) 嵌入式hash表

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器- (5) 嵌入式hash表 文章目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (5) 嵌入式hash表 ...

  5. ROS——一文读懂:param参数

    文章目录 获取参数 设置参数 删除参数 检查参数 搜索参数 获取参数 通过NodeHandle,有两种方式获取参数: 下面的例子,n是NodeHandle实例对象 getParam()函数说明: ge ...

  6. ROS(四)参数服务器C++实现

    参数服务器是什么呢,就相当于我们有一个参数容器,然后我们要从中获取一些数据,或者对数据进行增删查改的操作.比如我们要对机器人进行路径规划,那有些地方是限制大小才能允许通过的,这个时候我们就需要知道机器 ...

  7. 【ROS】参数服务器

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

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

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

  9. [源码解析] 机器学习参数服务器ps-lite (1) ----- PostOffice

    [源码解析] 机器学习参数服务器ps-lite (1) ----- PostOffice 文章目录 [源码解析] 机器学习参数服务器ps-lite (1) ----- PostOffice 0x00 ...

最新文章

  1. 少儿python编程培训-全国少儿人工智能Python编程兴趣班
  2. java基础知识回顾之javaIO类总结
  3. iOS H264,H265视频编码(Video encode)
  4. intellij中出現java.lang.NoClassDefFoundError: org/apache/commons/configuration/Configuration解決方案
  5. upload-labs_pass20-move_uploaded_file函数特性
  6. Hive的内置数据类型
  7. 常见错误Delegate already added to touch dispatcher.的解决方案
  8. Spring Bean配置默认为单实例 pring Bean生命周期
  9. iTunes,一个不断侵蚀C盘的大虫
  10. [转载] python - map()解析
  11. Java反编译工具Luyten
  12. 文本比较/文本对比在线工具
  13. html前端页面的字体大小,JQuery 改变页面字体大小的实现代码(实时改变网页字体大小)...
  14. 【百度大脑新品体验】行驶证识别
  15. 数据结构中confusing的地方整理
  16. 关于核磁共振图像的命名原则及含义(总结自用)
  17. ANSYS workbench 根据坐标施加载荷- external data载荷映射
  18. 无分类编址CIDR(构造超网)
  19. 数据分析 EXCEL
  20. 大系统观:1.4时间之矢

热门文章

  1. (数学)最小二乘的几何意义及投影矩阵
  2. 计算两个日期相差的天数,Calendar用法
  3. 如何编译sqlite-3.5.9
  4. PowerDesigner(一)-PowerDesigner概述(系统分析与建模)
  5. 微信开发工具button跳转页面_小程序的button跳转
  6. 1、【转载】Python yield 使用浅析
  7. 0.3:Before We Start
  8. oracle中创建一个用户,只能查看指定的视图,如何授权,创建别名
  9. JAVA程序设计:接受数字并求和
  10. PHP 使网站进行跨域访问