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