# 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>`一般只設置一個參數,請看下例:
<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。
- 前言
- 第一章 ROS簡介
- 機器人時代的到來
- ROS發展歷程
- 什么是ROS
- 安裝ROS
- 安裝ROS-Academy-for-Beginners教學包
- 二進制與源碼包
- 安裝RoboWare Studio
- 單元測試一
- 第二章 ROS文件系統
- Catkin編譯系統
- Catkin工作空間
- Package軟件包
- CMakeLists.txt
- package.xml
- Metapacakge軟件元包
- 其他常見文件類型
- 單元測試二
- 第三章 ROS通信架構(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常見msg類型
- 單元測試三
- 第四章 ROS通信架構(二)
- Service
- Srv
- Parameter server
- Action
- 常見srv類型
- 常見action類型
- 單元測試四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 單元測試五
- 第六章 roscpp
- Client Library與roscpp
- 節點初始、關閉與NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 時鐘
- 日志與異常
- 第七章 rospy
- Rospy與主要接口
- Topic in rospy
- Service in rospy
- Param與Time
- 第八章 TF與URDF
- 認識TF
- TF消息
- tf in c++
- tf in python
- 統一機器人描述格式
- 附錄:TF數學基礎
- 三維空間剛體運動---旋轉矩陣
- 三維空間剛體運動---歐拉角
- 三維空間剛體運動---四元數
- 第九章 SLAM
- 地圖
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附錄:Navigation工具包說明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery