4.3 Parameter server
4.3.1 简介
前文介绍了ROS中常见的两种通信方式——主题和服务,这节介绍另外一种通信方式——参数服务器(parameter server)。与前两种通信方式不同,参数服务器也可以说是特殊的“通信方式”。特殊点在于参数服务器是节点存储参数的地方、用于配置参数,全局共享参数。参数服务器使用互联网传输,在节点管理器中运行,实现整个通信过程。
参数服务器,作为ROS中另外一种数据传输方式,有别于topic和service,它更加的静态。参数服务器维护着一个数据字典,字典里存储着各种参数和配置。
字典简介
何为字典,其实就是一个个的键值对,我们小时候学习语文的时候,常常都会有一本字典,当遇到不认识的字了我们可以查部首查到这个字,获取这个字的读音、意义等等,而这里的字典可以对比理解记忆。键值kay可以理解为语文里的“部首”这个概念,每一个key都是唯一的,参照下图:
每一个key不重复,且每一个key对应着一个value。也可以说字典就是一种映射关系,在实际的项目应用中,因为字典的这种静态的映射特点,我们往往将一些不常用到的参数和配置放入参数服务器里的字典里,这样对这些数据进行读写都将方便高效。
维护方式
参数服务器的维护方式非常的简单灵活,总的来讲有三种方式:
- 命令行维护
- launch文件内读写
- node源码
下面我们来一一介绍这三种维护方式。
4.3.2 命令行维护
使用命令行来维护参数服务器,主要使用rosparam
语句来进行操作的各种命令,如下表:
rosparam 命令 | 作用 |
---|---|
rosparam set param_key param_value |
设置参数 |
rosparam get param_key |
显示参数 |
rosparam load file_name |
从文件加载参数 |
rosparam dump file_name |
保存参数到文件 |
rosparam delete |
删除参数 |
rosparam list |
列出参数名称 |
load&&dump文件
load和dump文件需要遵守YAML格式,YAML格式具体示例如下:
name:'Zhangsan'
age:20
gender:'M'
score{Chinese:80,Math:90}
score_history:[85,82,88,90]
简明解释。就是“名称+:+值”这样一种常用的解释方式。一般格式如下:
key : value
遵循格式进行定义参数。其实就可以把YAML文件的内容理解为字典,因为它也是键值对的形式。
4.3.3 launch文件内读写
launch文件中有很多标签,而与参数服务器相关的标签只有两个,一个是<param>
,另一个是<rosparam>
。这两个标签功能比较相近,但<param>
一般只设置一个参数,请看下例:
观察上例比如序号3的param就定义了一个key和一个value,交给了参数服务器维护。而序号1的param只给出了key,没有直接给出value,这里的value是由后没的脚本运行结果作为value进行定义的。序号(2)就是rosparam的典型用法,先指定一个YAML文件,然后施加command,其效果等于rosparam load file_name
。
4.3.4 node源码
除了上述最常用的两种读写参数服务器的方法,还有一种就是修改ROS的源码,也就是利用API来对参数服务器进行操作。具体内容我们学习完后面章节再进行介绍。
4.3.5 操作实例
- 首先依然是打开我们教材的模拟场景
roslaunch robot_sim_demo robot_spawn.launch
。 - 输入
rosparam list
查看参数服务器上的param。 - 查询参数信息,例如查询竖直方向重力参数。输入
rosparam get /gazebo/gravity_z
回车得到参数值value=-9.8。 - 尝试保存一个参数到文件输入
rosparam dump param.yaml
之后就可以在当前路径看到该文件,也就能打开去查看到相关的参数信息。 - 参数服务器的其他命令操作方式大致相同,我们可以多多练习,巩固对参数服务器的理解和应用。
参数类型
ROS参数服务器为参数值使用XMLRPC数据类型,其中包括:strings, integers, floats, booleans, lists, dictionaries, iso8601 dates, and base64-encoded data。