ROS系列:参数服务器(一)

ROS系列

76-80



前言

参数服务器主要用于实现不同节点之间的一个数据存储、数据共享


一、参数服务器组成

ROS Master
Talker:参数设置者
Listener:参数调用者

二、使用步骤

1.写数据:增加,修改

代码如下(c++):


#include <ros/ros.h>
/**
 * @brief
 *  需要实现参数的新增与修改
 *  需求:首先设置机器人的共享参数,类型、半径(0.15m)
 *      在修改半径(0.2m)
 *  实现:
 *      ros::NodeHandle
 *          setParam("键",值)
 *      ros::param
 *          set("键",值)
 *      修改只需要先查rosparam list / get 获取,然后在程序里set修改即可
 */

int main(int argc, char* argv[])
{
    // 初始化ros节点
    ros::init(argc, argv, "set_param_c");
    //创建ROS节点句柄
    ros::NodeHandle nh;
    //参数增
    // 方案一
    nh.setParam("type","xiaoHuang");
    nh.setParam("radius", 0.15);

    // 方案二
    ros::param::set("type_param","xiaoBai");
    ros::param::set("radius_param",0.15);
    //参数修改
    // 方案一
    nh.setParam("radius",0.1);
    // 方案二
    ros::param::set("radius_param",0.1);
    return 0;
}

终端中rosparam操作

rosparam list
rosparam get

效果:
在这里插入图片描述

2.读数据:查询

代码如下(示例):

#include <ros/ros.h>
/**
 * @brief
 *  演示参数查询

 *  实现:
 *      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
 */
int main(int argc, char* argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc, argv, "get_param_c");
    ros::NodeHandle nh;
    // ros::NodeHandle-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
    // 1.param
    double radius = nh.param("radius",0.5);
    ROS_INFO("radius=%.2f",radius);
    // 2.getparam
    double radius2=0.0;
    bool result = nh.getParam("radius_param", radius2);
    if(result){
        ROS_INFO("radius2 = %.2f", radius2);
    }else{
        ROS_INFO("查询变量不存在");
    }
    // 3.getParamCached键
    // 4.getParamNames
    std::vector<std::string> names;  //创建一个vector用于保存节点名称 名称类型string
    nh.getParamNames(names);
    for (auto && name : names)       //&&右值引用
    {
        ROS_INFO("遍历的元素是:%s",name.c_str());//遍历以后转换成c形式字符串
    }
    // 5.hasParam
    bool flag1 = nh.hasParam("radius");
    bool flag2 = nh.hasParam("radiusxxx");
    ROS_INFO("radius 存在与否:%d", flag1);
    ROS_INFO("radiusxxx 存在与否:%d", flag2);
    // 6.
    std::string key;    // 定义一个变量来接收键值
    nh.searchParam("radius",key);
    ROS_INFO("搜索结果:%s",key.c_str());
    
    return 0;
}

1.param
param查询,存在,返回对应结果,否则返回默认值,此时默认值为0.5,即如果搜索参数服务器中没有radius,返回0.5即可得知参数服务器并没有该名数据

   
    double radius = nh.param("radius",0.5);
    ROS_INFO("radius=%.2f",radius);

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

  
    double radius2=0.0;
    bool result = nh.getParam("radius_param", radius2);
    if(result){
        ROS_INFO("radius2 = %.2f", radius2);
    }else{
        ROS_INFO("查询变量不存在");
    }

3.getParamCached键,存储结果的变量)–提高变量获取效率
存在,返回 true,且将值赋值给参数2
若果键不存在,那么返回值为 false,且不为参数2赋值
与2一样,只是提高了性能,但肉眼看不出来
4. getParamNames(std::vectorstd::string)
获取所有的键,并存储在参数 vector 中

	std::vector<std::string> names;  //创建vector用于保存节点名称 
    nh.getParamNames(names);
    for (auto && name : names)       //&&右值引用
    {
        ROS_INFO("遍历的元素是:%s",name.c_str());//遍历以后转换成c形式字符串
    }

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

    bool flag1 = nh.hasParam("radius");
    bool flag2 = nh.hasParam("radiusxxx");
    ROS_INFO("radius 存在与否:%d", flag1);
    ROS_INFO("radiusxxx 存在与否:%d", flag2);
  1. searchParam(参数1,参数2)
    搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
    std::string key;    // 定义一个变量来接收键值
    nh.searchParam("radius",key);
    ROS_INFO("搜索结果:%s",key.c_str());

运行效果在这里插入图片描述

总结

类似全局变量;
采用RPC协议通讯,不是为高性能设计,建议存放非二进制静态简单数据:
32-bit
doubles
bool
strings
iso8601 时间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会是要长脑子了吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值