ROS学习之路——第四章:参数服务器

本文介绍了ROS中的参数服务器,其作为数据共享容器,用于存储和管理静态非二进制数据,如大小、布尔值等。文章详细讲解了参数的设置、获取、删除等操作,以及使用ros::NodeHandle和ros::paramAPI进行这些操作的方法。
摘要由CSDN通过智能技术生成

一、概念:

用于不同节点之间的数据共享,相当于一个公共容器,数据存储在该容器中,可被不同的节点调用。主要应用场景用于路径规划:例如我们可以将小车的尺寸存入参数服务器中,当进行路径规划时需要用到小车尺寸,不同节点就可以从参数服务器中调用尺寸了。

二、理论顺序:

1、设置方提交参数到管理者处

2、管理者将参数保存至参数列表中

3、调用者向管理者发送请求

4、管理者在参数列表查找相关参数并发送给调用者

(建议用于存储静态的非二进制的简单数据)

  • 32-bit integers:4 byte的int

  • booleans

  • strings

  • doubles

  • iso8601 dates:时间表述

  • lists:列表

  • base64-encoded binary data

  • 字典

三、参数操作:

1、两套API实现:ros::NodeHandle 和 ros::param

2、调试命令:

(1)读取参数列表,需要使用该命令:

roslin@roslin-VirtualBox:~/ros4$ rosparam list

(2)获取列表参数具体的值,需要使用该命令:

roslin@roslin-VirtualBox:~/ros4$ rosparam get /type

 get /+参数名称

3、设置参数的代码:

#include "ros/ros.h"

/*
    实现参数的新增和修改
    需求:设置机器人的共享参数,类型,半径(0.15m),再修改半径(0.2m)
    实现:ros::NodeHandle
            setParam()
         ros::param
            set()
*/

int main(int argc, char *argv[])
{
    //初始化ROS节点
    ros::init(argc,argv,"param_set_C");
    //创建ROS节点句柄
    ros::NodeHandle nh;
    //参数增
    //(1)nh:参数一为参数名称;参数二为参数
    nh.setParam("type","lin");
    nh.setParam("radius",0.15);
    //(2)ros::param
    ros::param::set("type_param","li");
    ros::param::set("radius_param",0.15);
    //参数改(参数覆盖)
    //(1)nh:参数一为参数名称;参数二为参数
    nh.setParam("radius",0.3);
    //(2)ros::param
    ros::param::set("radius_param",0.5);
    return 0;
}

4、获得参数的相关函数:(具体呈现在代码里)

#include "ros/ros.h"

/*
    演示参数查询
    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----------------------------------
        同上ros::NodeHandle

*/

int main(int argc, char *argv[])
{
    //设置编码
    setlocale(LC_ALL,"");
    //ros初始化节点
    ros::init(argc,argv,"param_get");
    //创建节点句柄
    ros::NodeHandle nh;

    //NodeHandle--------------------
    //1.param:查询"radius"的值,如果没有就返回0.5
    double radius=nh.param("radius",0.5);
    ROS_INFO("radius=%f",radius);

    //2.getParam:查询"radius"的值并赋给参数"radius2
    double radius2=0.0;
    bool result=nh.getParam("radius",radius2);
    if(result)
    {
        ROS_INFO("radius2=%f",radius2);
    }
    else
    {
        ROS_INFO("WRONG");
    }
    //3.getParamCached:查询"radius"的值并赋给参数"radius3
    //与getParam类似,只是性能上有提升,他拿的是在参数留在缓存区留的量
    double radius3=0.0;
    bool result2=nh.getParamCached("radius",radius3);
    if(result2)
    {
        ROS_INFO("radius2=%f",radius3);
    }
    else
    {
        ROS_INFO("WRONG");
    }
    //4.getParamNames:通过循环可以遍历获取设置的参数名称
    std::vector<std::string> names; //创建一个vector集合,创建类型为string,名称为names
    nh.getParamNames(names);
    for(auto &&name : names)  //auto表示自动循环;:之前的是设置的元素;:之后的是被遍历的元素
    {
        ROS_INFO("遍历的元素:%s",name.c_str());    //C风格的字符串
    }
    //5.hasParam:查找参数名称是否存在,返回布尔类型
    bool flag1=nh.hasParam("radius");
    bool flag2=nh.hasParam("radiusxxx");
    if(flag1 && flag2)
    {
        ROS_INFO("两者参数名称都存在");
    }
    else
    {
        ROS_INFO("不是两者参数名称都存在");
    }
    //6.searchParam:查询参数名称是否存在,并且把名称赋值给设置的字符串key
    std::string key;
    nh.searchParam("radius",key);
    ROS_INFO("搜索结果:%s",key.c_str());
    return 0;
}

5、删除参数的相关函数:(具体呈现在代码里)

#include "ros/ros.h"

/*
    参数的删除:
    ros::NodeHandle
        deleteParam()

    ros::param
        del()

*/

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"param_del");
    ros::NodeHandle nh;
    //ros::NodeHandle
    bool flag1=nh.deleteParam("radius");
    if(flag1)
    {
        ROS_INFO("删除1成功!");
    }
    else{
        ROS_INFO("删除1失败!");
    }
    //ros::param
    bool flag2=ros::param::del("radius_param");
    if(flag2)
    {
        ROS_INFO("删除2成功!");
    }
    else{
        ROS_INFO("删除2失败!");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值