🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 4.3 Parameter server ## 4.3.1 简介 前文介绍了ROS中常见的两种通信方式——主题和服务,这节介绍另外一种通信方式——参数服务器(parameter server)。与前两种通信方式不同,参数服务器也可以说是特殊的“通信方式”。特殊点在于参数服务器是节点存储参数的地方、用于配置参数,全局共享参数。参数服务器使用互联网传输,在节点管理器中运行,实现整个通信过程。 参数服务器,作为ROS中另外一种数据传输方式,有别于topic和service,它更加的静态。参数服务器维护着一个数据字典,字典里存储着各种参数和配置。 ### 字典简介 何为字典,其实就是一个个的键值对,我们小时候学习语文的时候,常常都会有一本字典,当遇到不认识的字了我们可以查部首查到这个字,获取这个字的读音、意义等等,而这里的字典可以对比理解记忆。键值kay可以理解为语文里的“部首”这个概念,每一个key都是唯一的,参照下图: ![](../pics/dictionaries _kay.png) 每一个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>`一般只设置一个参数,请看下例: <launch> <!--读取机器人参数模型--> (1)<param name="robot_description" command="$(find xacro)/xacro.py $(find robot_sim_demo)/urdf/robot.xacro" /> <!--在Gazebo中启动机器人模型--> <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -x $(arg x) -y $(arg y) -z $(arg z) -Y $(arg yaw) -model xbot2 -param robot_description"/> <!--把关节控制的配置信息读到参数服务器--> (2)<rosparam file="$(find robot_sim_demo)/config/xbot2_control.yaml" command="load"/> <!--启动关节控制器--> <node name="spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" ns="/xbot2" args="joint_state_controller yaw_platform_position_controller pitch_platform_position_controller "/> <!--mobile_base_controller--> <!-- 将关节状态转换为TF变--> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" ns="/xbot2" respawn="false" output="screen"> (3)<param name="publish_frequency" value="100.0"/> </node--> </launch> 观察上例比如序号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 操作实例 1. 首先依然是打开我们教材的模拟场景`roslaunch robot_sim_demo robot_spawn.launch`。 2. 输入`rosparam list`查看参数服务器上的param。 3. 查询参数信息,例如查询竖直方向重力参数。输入`rosparam get /gazebo/gravity_z`回车得到参数值value=-9.8。 4. 尝试保存一个参数到文件输入`rosparam dump param.yaml `之后就可以在当前路径看到该文件,也就能打开去查看到相关的参数信息。 5. 参数服务器的其他命令操作方式大致相同,我们可以多多练习,巩固对参数服务器的理解和应用。 ### 参数类型 ROS参数服务器为参数值使用XMLRPC数据类型,其中包括:strings, integers, floats, booleans, lists, dictionaries, iso8601 dates, and base64-encoded data。