Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

ROS学习  Parameter的设置与查询

$
0
0
作者: 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");
    // 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);
    }
其它还有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());

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





 

Viewing all articles
Browse latest Browse all 158

Trending Articles