文章

ROS学习记录(五):参数服务器的基本操作

ROS学习记录(五):参数服务器的基本操作

参数操作(C++)

需求 :实现参数服务器参数的增删改查操作。

实现参数服务器数据的增删改查,可以通过两套 API 实现:

  • ros::NodeHandle
  • ros::param

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

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
#include"ros/ros.h"
/*
    实现参数服务器中参数的增加和修改
    实现:
        两种方式
        1.使用NodeHandle中的nh.setParam();
        2.使用ros::param::set();
*/
int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"test_param");
    ros::NodeHandle nh;
    //向参数服务器发送参数
    //1.ros节点句柄
    nh.setParam("type","yellow");
    nh.setParam("radius",0.1);
    //2.ros::param
    ros::param::set("type_param","white");
    ros::param::set("radius_param",0.2);
    //修改参数服务器里的参数(重新设置),后面的会覆盖前面
    //1.ros节点句柄
    nh.setParam("type","yellow");
    nh.setParam("radius",0.3);
    //2.ros::param
    ros::param::set("type_param","white");
    ros::param::set("radius_param",0.4);
    
    return 0;
}

2.参数服务器获取参数

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
#include"ros/ros.h"
/*
    //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存储搜索结果的变量
        ---------------------------
        //Param

*/

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    //初始化
    ros::init(argc,argv,"test_param_get");
    //初始化ros节点句柄
    ros::NodeHandle nh;
    // 1.nh.param()
    double param_result = nh.param("radius",0.1);
    ROS_INFO("radius = %.2f",param_result);
    // 2.nh.getParam()
    double getParam_result;
    bool getParam_flag = nh.getParam("radius",getParam_result);
    if(getParam_flag){
        ROS_INFO("radius = %.2f",getParam_result);
    }
    else{
        ROS_INFO("变量不存在");
    }
    // 3.getParamCached()比nh.getParam()快
    double getParamCached_result;
    bool getParamCached_flag = nh.getParamCached("radius",getParamCached_result);
    if(getParamCached_flag){
        ROS_INFO("radius = %.2f",getParamCached_result);
    }
    else{
        ROS_INFO("变量不存在");
    }
    // 4.getParamNames()
    std::vector<std::string> names;
    nh.getParamNames(names);
    for (auto && name : names){
        ROS_INFO("遍历的元素:%s",name.c_str());
    }
    // 5.hasParam()
    bool hasParam_flag_1 = nh.hasParam("radius");
    bool hasParam_flag_2 = nh.hasParam("radisu");
    ROS_INFO("radius是否存在?%d",hasParam_flag_1);
    ROS_INFO("radisu是否存在?%d",hasParam_flag_2);
    // 6.searchParam()
    std::string searchParam_result;
    nh.searchParam("radius",searchParam_result);
    ROS_INFO("搜索的结果:%s",searchParam_result.c_str());
    return 0;
    //ros::param---------------------------------
    //ros::param::xxxx于nh.xxxx的操作基本一致,故此处不进行ros::param的编写

}

3.参数服务器删除参数

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
#include"ros/ros.h"
/*
    实现参数服务器中参数的删除
    实现:
        两种方式
        1.使用NodeHandle中的nh.deleteParam();
        2.使用ros::param::delete();
*/
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"test_param");
    ros::NodeHandle nh;
    //向参数服务器发送参数
    //NodeHandle
    bool nh_del_flag = nh.deleteParam("radius");
    if (nh_del_flag){
        ROS_INFO("nh删除radius成功");
    }
    else{
        ROS_INFO("nh删除radius失败");
    }
    
    //ros::param
    bool rosparme_del_flag = ros::param::del("radius_param");
    if (rosparme_del_flag){
        ROS_INFO("ros::param删除radius_param成功");
    }
    else{
        ROS_INFO("ros::param删除radius_param失败");
    }
    
    return 0;
}

4.配置文件设置

只有 CMakeList 与前面几节设置相同

本文由作者按照 CC BY 4.0 进行授权

热门标签