0%

rosparam

参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场景如下:

导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径

上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:

路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数
参数服务器,一般适用于存在数据共享的一些应用场景。

cpp实现

参数服务器新增(修改)参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
参数服务器操作之新增与修改(二者API一样)_C++实现:
在 roscpp 中提供了两套 API 实现参数操作
ros::NodeHandle
setParam("键",值)
ros::param
set("键","值")

示例:分别设置整形、浮点、字符串、bool、列表、字典等类型参数
修改(相同的键,不同的值)

*/
#include "ros/ros.h"

int main(int argc, char *argv[])
{
/* code */
ros::init(argc,argv,"set_param_c");
ros::NodeHandle nh;
nh.setParam("type","xiaohuang");
nh.setParam("radius",0.15);
ros::param::set("type_","xiaobai");
ros::param::set("radius_param",0.15);

nh.setParam("radius",0.2);
ros::param::set("radius_param",0.2);
return 0;
}

参数服务器获取参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
参数服务器操作之查询_C++实现:
在 roscpp 中提供了两套 API 实现参数操作
ros::NodeHandle

param(键,默认值)
存在,返回对应结果,否则返回默认值

getParam(键,存储结果的变量)
存在,返回 true,且将值赋值给参数2
若果键不存在,那么返回值为 false,且不为参数2赋值

getParamCached键,存储结果的变量)--提高变量获取效率
存在,返回 true,且将值赋值给参数2
若果键不存在,那么返回值为 false,且不为参数2赋值

getParamNames(std::vector<std::string>)
获取所有的键,并存储在参数 vector 中

hasParam(键)
是否包含某个键,存在返回 true,否则返回 false

searchParam(参数1,参数2)
搜索键,参数1是被搜索的键,参数2存储搜索结果的变量

ros::param ----- 与 NodeHandle 类似





*/
#include "ros/ros.h"

int main(int argc, char *argv[])
{
/* code */
ros::init(argc,argv,"get_param_c");
ros::NodeHandle nh;
double radius=nh.param("radius",0.5);
ROS_INFO("radius=%.2f",radius);

double radius2=0.0;
bool result=nh.getParam("radius",radius2);
if (result)
{
ROS_INFO("radius is %.2f",radius2);
}else{
ROS_INFO("radius not exist");
}

std::vector<std::string> names;
nh.getParamNames(names);
for (auto &&name : names)
{
ROS_INFO("paramName is %s",name.c_str());
}

bool flag1=nh.hasParam("radius");
bool flag2=nh.hasParam("radiusxxx");
ROS_INFO("radius is exist? %d",flag1);
ROS_INFO("radiusxxx is exist? %d",flag2);

std::string key;
nh.searchParam("radius",key);
ROS_INFO("result is %s",key.c_str());

double radius_param=ros::param::param("radius",100.5);
ROS_INFO("radius_param =%.2f",radius_param);

std::vector<std::string> names_param;
ros::param::getParamNames(names_param);
for (auto &&name_param : names_param)
{
ROS_INFO("key:%s",name_param.c_str());
}

return 0;
}

参数服务器删除参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* 
参数服务器操作之删除_C++实现:

ros::NodeHandle
deleteParam("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false

ros::param
del("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false


*/

#include "ros/ros.h"

int main(int argc, char *argv[])
{
/* code */
ros::init(argc,argv,"param_del_c");
ros::NodeHandle nh;
bool flag1=nh.deleteParam("radius");
if (flag1){
ROS_INFO("delet succes");
} else{
ROS_INFO("delet fault");
}

bool flag2=ros::param::del("radius_param");
if (flag2){
ROS_INFO("delet succes");
} else{
ROS_INFO("delet fault");
}
return 0;
}

python实现

参数服务器新增(修改)参数

1
2
3
4
5
6
7
8
9
10
11
12
#! /usr/bin/env python
#coding=utf-8
import rospy

if __name__ == "__main__":
rospy.init_node("param_set_p")
rospy.set_param("type_p","xiaohuache")
rospy.set_param("radius_p",10)

rospy.set_param("radius_p",20)

pass

参数服务器获取参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#! /usr/bin/env python
"""
参数服务器操作之查询_Python实现:
get_param(键,默认值)
当键存在时,返回对应的值,如果不存在返回默认值
get_param_cached
get_param_names
has_param
search_param
"""
import rospy

if __name__ == "__main__":
rospy.init_node("param_get_p")
radius=rospy.get_param("radius_p",15)
radius1=rospy.get_param("radius_p_",15)
rospy.loginfo("radius is %.2f",radius)
rospy.loginfo("radius is %.2f",radius1)

names=rospy.get_param_names()
for name in names:
rospy.loginfo("param name is %s",name)

flag1=rospy.has_param("radius_p")
if flag1:
rospy.loginfo("radius_p is exist")
else:
rospy.loginfo("radius_p not exist")

key=rospy.search_param("radius_p")
rospy.loginfo("key =%s",key)



pass

参数服务器删除参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#! /usr/bin/env python
"""
参数服务器操作之删除_Python实现:
rospy.delete_param("键")
键存在时,可以删除成功,键不存在时,会抛出异常
"""
import rospy

if __name__ == "__main__":
rospy.init_node("param_del_p")
try:
rospy.delete_param("type_p")
except Exception as e:
rospy.loginfo("deleted param is not exist")
pass