參數模型
ROS Master
(Parameter Server)
/robot_name: "my_robot" ----{Node A Node B}
/robot_radius:0.4 ----{Node C}
/robot_height :0.5 ----{Node D}
參數服務器 Parameter Server 用於保存各個節點之間的數據參數
因此我們可以將Parameter Server理解為全局變量存儲空間,只要在同一ros環境里面都可以通過參數服務器發送請求去查詢相關的參數。
參數命令行使用(以小海龜為例)
YAML參數文件 (多參數文件) background_b : 255 background_b : 86 background_b : 69 rosdistro : 'melodic' roslaunch: uris: {host_hcx_vpc__43763: 'http://hcx-vpc :43763/'} rosversion :'1.14.3' run_id: 07708de-a38b-11e9-818b-000c29d22e4d
rosparam
*列出當前多個參數
$ rosparam list
*顯示某個參數值
$ rosparam get param_key
*設置某個參數值
$ rosparam set param_key param_value
*保存參數到文件
$ rosparam dump fole_name
*從文件中讀取參數
$ rosparam load file_name
*刪除參數
$ rosparam detele param_key
以下以小海龜案例為例
顯示小海龜運行中的參數列表
qqtsj ~ rosparam list /background_b /background_g /background_r /rosdistro /roslaunch/uris/host_qqtsj_nitro_an515_51__43045 /rosversion /run_id
顯示小海龜中參數的值
qqtsj ~ rosparam get /background_r 69 qqtsj ~ rosparam get /background_g 86 qqtsj ~ rosparam get /background_b 255
設置某個參數的值
qqtsj ~ rosparam set /background_b 255 qqtsj ~ rosparam set /background_r 255 qqtsj ~ rosparam set /background_g 255 qqtsj ~ rosparam get /background_b 255 qqtsj ~ rosparam get /background_g 255 qqtsj ~ rosservice call /clear "{}"
通過設置參數的值去改變小海龜的運動背景顏色
命令為:rosservice call /clear "{}"
通過發送一個空的請求去刷新新設置參數的值,從而改變小海龜。
*保存參數到文件中
將參數保存到YAML參數文件中,如下
$ rosparaam dump param.yaml
我這里的路徑為主目錄路徑的param.yaml文件中
*從文件中讀取參數
首先在參數文件中修改參數的值,保存在文件中。
用以下命令從文件讀取參數 $ rosparam load param.yaml
*刪除參數
$ rosparam delete param_key
qqtsj ~ rosparam delete /background_b qqtsj ~ rosparam list /background_r /rosdistro /roslaunch/uris/host_qqtsj_nitro_an515_51__43045 /rosversion /run_id
接下來用程序去實現參數的使用和編程
首先創建一個功能包
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_parameter roscpp rospy std_srvs
通過(c++)去實現
如何獲取/設置參數
*初始化ros節點
*get函數獲取參數
*set函數設置參數
程序如下
1 /** 2 * 該例程設置/讀取海龜例程中的參數 3 */ 4 #include <string> 5 #include <ros/ros.h> 6 #include <std_srvs/Empty.h> 7 8 int main(int argc, char **argv) 9 { 10 int red, green, blue; 11 12 // ROS節點初始化 13 ros::init(argc, argv, "parameter_config"); 14 15 // 創建節點句柄 16 ros::NodeHandle node; 17 18 // 讀取背景顏色參數 19 ros::param::get("/background_r", red); 20 ros::param::get("/background_g", green); 21 ros::param::get("/background_b", blue); 22 23 ROS_INFO("Get Backgroud Color[%d, %d, %d]", red, green, blue); 24 25 // 設置背景顏色參數 26 ros::param::set("/background_r", 255); 27 ros::param::set("/background_g", 255); 28 ros::param::set("/background_b", 255); 29 30 ROS_INFO("Set Backgroud Color[255, 255, 255]"); 31 32 // 讀取背景顏色參數 33 ros::param::get("/background_r", red); 34 ros::param::get("/background_g", green); 35 ros::param::get("/background_b", blue); 36 37 ROS_INFO("Re-get Backgroud Color[%d, %d, %d]", red, green, blue); 38 39 // 調用服務,刷新背景顏色 40 ros::service::waitForService("/clear"); 41 ros::ServiceClient clear_background = node.serviceClient<std_srvs::Empty>("/clear"); 42 std_srvs::Empty srv; 43 clear_background.call(srv); 44 45 sleep(1); 46 47 return 0; 48 }
編譯命令如下
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_parameter parameter_config
以(python)程序如下
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # 該例程設置/讀取海龜例程中的參數 4 5 import sys 6 import rospy 7 from std_srvs.srv import Empty 8 9 def parameter_config(): 10 # ROS節點初始化 11 rospy.init_node('parameter_config', anonymous=True) 12 13 # 讀取背景顏色參數 14 red = rospy.get_param('/background_r') 15 green = rospy.get_param('/background_g') 16 blue = rospy.get_param('/background_b') 17 18 rospy.loginfo("Get Backgroud Color[%d, %d, %d]", red, green, blue) 19 20 # 設置背景顏色參數 21 rospy.set_param("/background_r", 255); 22 rospy.set_param("/background_g", 255); 23 rospy.set_param("/background_b", 255); 24 25 rospy.loginfo("Set Backgroud Color[255, 255, 255]"); 26 27 # 讀取背景顏色參數 28 red = rospy.get_param('/background_r') 29 green = rospy.get_param('/background_g') 30 blue = rospy.get_param('/background_b') 31 32 rospy.loginfo("Get Backgroud Color[%d, %d, %d]", red, green, blue) 33 34 # 發現/spawn服務后,創建一個服務客戶端,連接名為/spawn的service 35 rospy.wait_for_service('/clear') 36 try: 37 clear_background = rospy.ServiceProxy('/clear', Empty) 38 39 # 請求服務調用,輸入請求數據 40 response = clear_background() 41 return response 42 except rospy.ServiceException, e: 43 print "Service call failed: %s"%e 44 45 if __name__ == "__main__": 46 parameter_config()
編譯和c++ 一樣