參數模型
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++ 一樣
