作者: Sam(甄峰) sam_code@hotmail.com
0. Parameter Server:
roscore在启动时,除了启动Mater Node,用来管理Node, 沟通各节点之间的消息和服务外。
还会创建一个Parameter Server。它用来设置与查询参数。
Parameter Server可以存储:strings, integers, , booleans,lists,字典,
iso8601数据,base64-encoded数据。
1. Parameter
Server数据的设置和读取:
Parameter Server数据的设置和读取有多种方式:
A:C++,Python 的ROS API接口。
B:Launch文件设置。
C:命令行rosparam。
2. ROSCPP API接口对Parameter
Server的访问:
ROS Parameter API让用户很容易的访问string, integer, float和boolean.
要支持其它选项,则需要使用:
http://docs.ros.org/api/xmlrpcpp/html/classXmlRpc_1_1XmlRpcValue.html
roscpp有两套不同的Parameter API.
Bare版本是ros::param
NameSpace。而Handle版本则是ros::NodeHandle接口。
2.1: 设置Parameter值, 获取Parameter值:
2.1.1:
NodeHandle方式:
2.1.1.1: NodeHandle getParam() setParam()模式:
//NodeHandle Mode Setting/Getting
Parameter
// 1. std::string
std::string name;
std::string setparam = "SamTest:";
nh.setParam("InfoName", setparam);
nh.getParam("InfoName", name);
ROS_INFO("Get Name: %s", name.c_str());
// 2. char*
char des[] = "This is a test for parameter server!";
std::string des_string;
nh.setParam("Des", des);
nh.getParam("Des", des_string);
ROS_INFO("Get des: %s", des_string.c_str());
// 3. double
double linear = 10.0;
nh.setParam("Linear", linear);
linear = 0;
nh.getParam("Linear", linear);
ROS_INFO("Get Linear: %f", linear);
// 4. int
int count = 23;
nh.setParam("Count", count);
count = 0;
nh.getParam("Count", count);
ROS_INFO("Get cound: %d", count);
// 5. bool
bool enable = true;
nh.setParam("Enable", enable);
enable = false;
nh.getParam("Enable", enable);
if(enable)
ROS_INFO("Enable: TURE");
else
ROS_INFO("Enable: FALSE");
// 1. std::string
std::string name;
std::string setparam = "SamTest:";
nh.setParam("InfoName", setparam);
nh.getParam("InfoName", name);
ROS_INFO("Get Name: %s", name.c_str());
// 2. char*
char des[] = "This is a test for parameter server!";
std::string des_string;
nh.setParam("Des", des);
nh.getParam("Des", des_string);
ROS_INFO("Get des: %s", des_string.c_str());
// 3. double
double linear = 10.0;
nh.setParam("Linear", linear);
linear = 0;
nh.getParam("Linear", linear);
ROS_INFO("Get Linear: %f", linear);
// 4. int
int count = 23;
nh.setParam("Count", count);
count = 0;
nh.getParam("Count", count);
ROS_INFO("Get cound: %d", count);
// 5. bool
bool enable = true;
nh.setParam("Enable", enable);
enable = false;
nh.getParam("Enable", enable);
if(enable)
ROS_INFO("Enable: TURE");
else
ROS_INFO("Enable: FALSE");
// 6.
std::vector
std::vector vector_string1;
std::vector vector_string2;
vector_string1.push_back("First Item");
vector_string1.push_back("Second Item");
vector_string1.push_back("Third Item");
nh.setParam("vec_str", vector_string1);
nh.getParam("vec_str", vector_string2);
ROS_INFO("vector size is %d", vector_string2.size());
std::vector::iterator it;
for(it=vector_string2.begin(); it!=vector_string2.end(); it++)
{
ROS_INFO("Get vector:%s", it->c_str());
}
// 7.std::vector
std::vector vector_float1;
std::vector vector_float2;
vector_float1.push_back(1.11f);
vector_float1.push_back(2.22f);
vector_float1.push_back(3.33f);
vector_float1.push_back(4.44f);
nh.setParam("vec_float", vector_float1);
nh.getParam("vec_float", vector_float2);
ROS_INFO("vector size is %d", vector_float2.size());
std::vector::iterator it_f;
for(it_f=vector_float2.begin(); it_f!=vector_float2.end(); it_f++)
{
ROS_INFO("Get vector:%f", *it_f);
}
std::vector vector_string1;
std::vector vector_string2;
vector_string1.push_back("First Item");
vector_string1.push_back("Second Item");
vector_string1.push_back("Third Item");
nh.setParam("vec_str", vector_string1);
nh.getParam("vec_str", vector_string2);
ROS_INFO("vector size is %d", vector_string2.size());
std::vector::iterator it;
for(it=vector_string2.begin(); it!=vector_string2.end(); it++)
{
ROS_INFO("Get vector:%s", it->c_str());
}
// 7.std::vector
std::vector vector_float1;
std::vector vector_float2;
vector_float1.push_back(1.11f);
vector_float1.push_back(2.22f);
vector_float1.push_back(3.33f);
vector_float1.push_back(4.44f);
nh.setParam("vec_float", vector_float1);
nh.getParam("vec_float", vector_float2);
ROS_INFO("vector size is %d", vector_float2.size());
std::vector::iterator it_f;
for(it_f=vector_float2.begin(); it_f!=vector_float2.end(); it_f++)
{
ROS_INFO("Get vector:%f", *it_f);
}
其它还有vector, vector以及map等对应方法。
但有一定请注意:getParam()没有float版本。
这个接口内,又分两类方法,一类直接读取,另一个还可以设置一个缺省值,当没有取到数据时,可以使用缺省值。
2.1.1.2:NodeHandle
param()读取模式:
std::string second;
nh.param("InfoName", second, "Other");
ROS_INFO("Get String: %s", second.c_str());
nh.param("InfoName", second, "Other");
ROS_INFO("Get String: %s", second.c_str());
2.1.2:Bare版本(ros::param
namespace):
2.1.2.1: 无缺省用法:
仅以int 为例:
int dat = 0;
ros::param::set("value", 64);
ros::param::get("value", dat);
ROS_INFO("Value is %d", dat);
其它类型的与NodeHandle的getParam() setParam()类似。
2.1.2.2:有缺省获取方法:
ros::param::param("Count", dat, 100);
ROS_INFO("Value is %d", dat);
2.2: 获取Parameter 缓存数据:
以下方法可以获取本地缓存,一定程度上加快速度:
ros::NodeHandle::getParamCached() and ros::param::getCached()
可以加快速度(第一次调用后)。但并不推荐使用。
2.3: 检测是否有参数:
2.4: 删除Parameter:
nh.deleteParam("f_param");
ros::param::del("f_param");
2.5: 访问私有参数:
2.6: 获取Key;
3.
launch方式设置Parameter: