[ROS](12)ROS通信 —— 参数服务器(Parameter Server)通信
??文章只是個人學習過程中學習筆記,主要參考ROS教程1 2 。
[ROS](01)創建ROS工作空間
[ROS](02)創建&編譯ROS軟件包Package
[ROS](03)CMakeLists.txt詳解
[ROS](04)package.xml詳解
目錄
- 1、概述
- 2、參數服務器通信機制
- 3、參數命令rosparam
- 4、參數服務器通信實操 -- 修改海龜模擬器的背景顏色
- 4.1 調試工具實現
- 4.2 編程實現(C++)
- 4.2.1 程序代碼(turtle_set_param.cpp)
- 4.2.2 配置CMakeLists.txt
- 4.2.3 編譯、運行
- 4.3 編程實現(Python)
- 4.3.1 程序代碼(turtle_set_param.py)
- 4.3.2 配置CMakeLists.txt
- 4.3.3 編譯、運行
- 5、rosparam實操
- 5.1 rosparam list
- 5.2 rosparam get
- 5.3 rosparam set
- 5.4 rosparam dump
- 5.5 rosparam load
- 5.6 rosparam delete
1、概述
??參數服務器(Parameter Server 3):是可以通過網絡 API 訪問的共享的多變量字典。在運行時節點(Nodes)使用此服務器去存儲和檢索參數。(類似于全局變量,存儲多個節點共享的數據。)
Tips:參數服務器不是為高性能(high-performance)而設計的,因此最好用于靜態、非二進制的數據,如配置參數。
2、參數服務器通信機制
??參數服務器通信 是ROS通信中一種比較特殊又比較簡單的通信方式。參數服務器在ROS Master內部運行。
3、參數命令rosparam
?? rosparam 4 能讓我們在ROS參數服務器(Parameter Server)上存儲和操作數據。參數服務器能夠存儲整型(integer)、浮點(float)、布爾(boolean)、字典(dictionaries)和列表(list)等數據類型。
| rosparam set | 設置參數 |
| rosparam get | 獲取參數 |
| rosparam load | 從文件中加載參數 |
| rosparam dump | 向文件中轉儲參數 |
| rosparam delete | 刪除參數 |
| rosparam list | 列出參數名 |
Tips:rosparam使用YAML標記語言的語法。一般而言,YAML的表述很自然:1是整型,1.0是浮點型,one是字符串,true是布爾型,[1, 2, 3]是整型組成的列表,{a: b, c: d}是字典。
4、參數服務器通信實操 – 修改海龜模擬器的背景顏色
??通過ROS內置的 海龜模擬器(turtlesim) 來進行參數服務器通信的實操,這里我們以修改海龜模擬器背景顏色舉例:背景顏色修改為紫色(RGB: 160 32 240)。
??實現的步驟如下:
??步驟1:在新終端中啟動roscore
??步驟2:在新終端中啟動海龜模擬器的節點turtlesim_node
rosrun turtlesim turtlesim_node??步驟3:在新終端中使用rosparam命令獲取參數列表。
rosparam list 圖4-1 修改海龜模擬器的背景顏色步驟1-3??步驟4:通過調試工具rqt工具箱和編程的方式修改海龜模擬器的背景顏色。
4.1 調試工具實現
??在新終端中輸入rqt命令打開rqt工具箱,然后在菜單欄中打開參數和服務插件,分別為Plugins/Configuration/Param Edit和Plugins/Services/Service Caller,如圖4-3所示。
??在Param Edit中將海龜模擬器turtlesim的背景顏色background_x的值改為紫色,如圖4-4所示①;然后在Service Caller中選擇調用clear服務,如圖4-4所示②;最后點擊右上角Call使已被修改的參數生效。
4.2 編程實現(C++)
??在beginner_tutorials軟件包的src目錄下創建修改海龜模擬器的背景顏色的源文件:
roscd beginner_tutorials cd src touch turtle_set_param.cpp4.2.1 程序代碼(turtle_set_param.cpp)
#include "ros/ros.h" #include <std_srvs/Empty.h>int main(int argc, char **argv) {setlocale(LC_ALL,"");/* 初始化ROS節點 */ros::init(argc,argv,"turtle_set_param");/* 為這個節點創建句柄 */ros::NodeHandle nh("turtlesim");int red, green, blue;/* 讀取海龜模擬器背景顏色參數 */ros::param::get("/turtlesim/background_r",red);ros::param::get("/turtlesim/background_g",green);ros::param::get("/turtlesim/background_b",blue);ROS_INFO("Get turtlesim background color[%3d, %3d, %3d]",red ,green,blue);/* 設置海龜模擬器背景顏色參數,設置為紫色(160,32,240) */ros::param::set("/turtlesim/background_r",160);ros::param::set("/turtlesim/background_g",32);ros::param::set("/turtlesim/background_b",240);ROS_INFO("Set turtlesim background color[%3d, %3d, %3d]",160 ,32,240);/* 讀取海龜模擬器背景顏色參數 */ros::param::get("/turtlesim/background_r",red);ros::param::get("/turtlesim/background_g",green);ros::param::get("/turtlesim/background_b",blue);ROS_INFO("Again get turtlesim background color[%3d, %3d, %3d]",red ,green,blue);/* 調用 /clear 服務,使已被修改的參數生效 */ros::service::waitForService("/clear");ros::ServiceClient client = nh.serviceClient<std_srvs::Empty>("/clear"); // 參數為空的服務std_srvs::Empty srvs;/* 服務調用 */if(client.call(srvs)){ROS_INFO("海龜模擬器turtlesim已修改的背景顏色已生效!");}else{ROS_INFO("調用服務失敗!");}return 0; }4.2.2 配置CMakeLists.txt
??只需將這幾行添加到CMakeLists.txt文件的底部:
add_executable(turtle_set_param src/turtle_set_param.cpp) target_link_libraries(turtle_set_param ${catkin_LIBRARIES})4.2.3 編譯、運行
??在你的工作空間下執行catkin_make編譯,將turtle_set_param.cpp編譯成可執行文件turtle_set_param。編譯后,在終端中執行過程如下所示。
4.3 編程實現(Python)
??在beginner_tutorials軟件包的scripts目錄下創建修改海龜模擬器的背景顏色源文件:
roscd beginner_tutorials cd scripts touch turtle_set_param.py chmod +x turtle_set_param.py4.3.1 程序代碼(turtle_set_param.py)
#!/usr/bin/env python # encoding: utf-8import rospy from std_srvs.srv import Emptydef turtle_set_param():# 初始化ROS節點rospy.init_node("turtle_set_param")# 讀取海龜模擬器背景顏色參數red = rospy.get_param("/turtlesim/background_r")green = rospy.get_param("/turtlesim/background_g")blue = rospy.get_param("/turtlesim/background_b")rospy.loginfo("Get turtlesim background color[%3d, %3d, %3d]",red ,green,blue)# 設置海龜模擬器背景顏色參數,設置為紫色(160,32,240)rospy.set_param("/turtlesim/background_r",160)rospy.set_param("/turtlesim/background_g",32)rospy.set_param("/turtlesim/background_b",240)rospy.loginfo("Set turtlesim background color[%3d, %3d, %3d]",160 ,32,240)# 讀取海龜模擬器背景顏色參數 red = rospy.get_param("/turtlesim/background_r")green = rospy.get_param("/turtlesim/background_g")blue = rospy.get_param("/turtlesim/background_b")rospy.loginfo("Again Get turtlesim background color[%3d, %3d, %3d]",red ,green,blue)# 調用 /clear 服務,使已被修改的參數生效 rospy.wait_for_service("/clear")try:clear_client = rospy.ServiceProxy("/clear",Empty)clear_client()rospy.loginfo("海龜模擬器turtlesim已修改的背景顏色已生效!")except rospy.ServiceException as e:rospy.loginfo("調用服務失敗!")if __name__ == '__main__':turtle_set_param()4.3.2 配置CMakeLists.txt
??只需catkin_install_python中添加scripts/turtle_set_param.py即可:
#安裝python可執行腳本 catkin_install_python(PROGRAMSscripts/turtle_set_param.py... DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})4.3.3 編譯、運行
??其實這個例子很簡單,不需要編譯,直接執行python文件就行。但是我們還是養成習慣吧,每次創建和修改代碼后,就catkin_make編譯一下,即使是Python節點也必須使用它。這是為了確保能為創建的消息和服務自動生成Python代碼。
5、rosparam實操
ROS提供了一個穩定的命令行工具rosparam來設置和獲取參數。通過已運行的海龜模擬器(turtlesim)來實操參數命令。
5.1 rosparam list
?? rosparam list 列出所有的參數名。
turtlesim節點在參數服務器上有3個參數用于設定背景顏色(RGB格式):/turtlesim/background_x
5.2 rosparam get
?? rosparam get [parameter-name] 獲取一個參數的值。
?? 也可以使用 rosparam get / 命令來顯示參數服務器上的所有內容。
5.3 rosparam set
?? rosparam set [parameter-name] [parameter-value] 為參數設置一個值。
# 將 turtlesim 的背景顏色修改為紅色(RGB: 255 0 0)rosparam set /turtlesim/background_r 255rosparam set /turtlesim/background_g 0rosparam set /turtlesim/background_b 0?? 上述指令修改了參數的值,但還未生效,因此我們需要調用clear服務使得參數的修改能生效:
rosservice call /clear5.4 rosparam dump
?? rosparam dump[file-name] 將參數服務器的 YAML 格式的內容轉儲到文件中。
# 在 beginner_tutorials軟件包下創建param目錄文件夾 roscd beginner_tutorials mkdir param # 在param目錄文件夾下將參數服務器的 YAML 格式的內容轉儲到文件中。 cd param rosparam dump params_all.yamlNode:參數保存位置為當前執行命令的目錄下。
?? rosparam dump[file-name] [namespace] 只轉儲指定命名空間中的參數。
# 在param目錄文件夾下轉儲指定命名空間中的參數 rosparam dump params_specified.yaml turtlesim5.5 rosparam load
?? rosparam load [file-name] 將 YAML 文件中的參數加載到指定的命名空間(默認為/)。
修改params_all.yaml文件 turtlesim 的背景顏色修改為綠色(RGB: 0 255 0) rosparam load params_all.yaml rosservice call /clear??甚至可以將YAML文件重載入新的命名空間,例如:copy_param
rosparam load params_specified.yaml copy_param5.6 rosparam delete
?? rosparam delete [parameter-name] 刪除參數值。
rosparam delete /copy_param/background_r rosparam delete /copy_param/background_gROS.org. ROS教程[EB/OL]. 2020-12-22[2022-7-5]. http://wiki.ros.org/cn/ROS/Tutorials. ??
ROS.org. 理解ROS服務和參數[EB/OL]. 2020-12-23[2022-11-02]. https://wiki.ros.org/cn/ROS/Tutorials/UnderstandingServicesParams. ??
ROS.org. Parameter Server[EB/OL]. 2018-11-08[2022-11-02]. https://wiki.ros.org/Parameter%20Server. ??
ROS.org. rosparam[EB/OL].2014-06-29[2022-11-02]. https://wiki.ros.org/rosparam ??
總結
以上是生活随笔為你收集整理的[ROS](12)ROS通信 —— 参数服务器(Parameter Server)通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进入Docker容器中修改mysql密码
- 下一篇: Bootstrap 列表组