(九)参数服务器

概述

参数服务器作为ROS的第四种通信机制,可以说与前三种大为不同,如果说前三种是点对点的通信,那么参数服务器就是一个共享内存。在使用参数服务器的过程中,一共有三个角色,第一个是ROS Master,扮演着管理者的角色,它是一个公共容器,保存着许多的参数;第二个角色是Talker,也就是参数设置者;第三个是Listener,也就是参数调用者。

增加参数

增加参数有两种方式,具体参考下面的程序。

#include <ros/ros.h>
int main(int argc,char **argv)
{
	ros::init(argc,argv,"add_param");
	//使用ros::NodeHandle
	ros::NodeHandle nh;
	nh.setParam("type1","yellow");
	nh.setParam("radius1",0.15);
	//直接使用ros::param
	ros::param::set("type2","black");
	ros::param::set("radius2",0.15);
	return 0;
}

编写CMakeLists.txt文件我就不写了,学到这儿应该都滚瓜烂熟了,直接上运行截图了。

在这里插入图片描述

修改参数

和增加参数的方法一样,会覆盖之前的参数值,下面是参考程序。

#include <ros/ros.h>
int main(int argc,char **argv)
{
	ros::init(argc,argv,"add_param");
	//使用ros::NodeHandle
	ros::NodeHandle nh;
	nh.setParam("radius1",0.1);
	//直接使用ros::param
	ros::param::set("radius2",0.25);
	return 0;
}

获取参数值

下面演示了第一种获取参数的方式,之后还有好几种…

#include <ros/ros.h>
int main(int argc,char **argv)
{
	ros::init(argc,argv,"get_param");
	ros::NodeHandle nh;
	//param(键,默认值) : 存在,返回对应结果,否则返回默认值
	double radius = nh.param("radius1",0.15);
	ROS_INFO("radius1 = %f", radius);
	return 0;
}

老规矩,CMakeLists.txt文件不写了,直接上运行截图。

在这里插入图片描述
其他获取方式

    getParam(,存储结果的变量)
    存在,返回 true,且将值赋值给参数2
    不存在,那么返回值为 false,且不为参数2赋值
    
示例程序:
    double  radius  = 0.0;
    bool  result = nh.getParam("radius1",radius);
    if(result)
    {
        ROS_INFO("获取的半径是%f",radius);
    }
    else
    {
        ROS_INFO("被查询的变量不存在");
    }
	getParamCached(,存储结果的变量)------提高变量获取效率
    存在,返回 true,且将值赋值给参数2
    不存在,那么返回值为 false,且不为参数2赋值
 
示例程序:
    double  radius = 0.0;
    bool  result = nh.getParamCached("radius1",radius);
    if(result)
    {
        ROS_INFO("3获取的半径是%f",radius);
    }
    else
    {
        ROS_INFO("被查询的变量不存在");
    }
    getParamNames(std::vector<std::string>)
    获取所有的键,并存储在参数 vector 中 
 
示例程序:
    vector<string>  names;
    nh.getParamNames(names);
    //遍历
    for(auto &&name:names)
    {
        ROS_INFO("遍历到的元素是:%s",name.c_str());
    }
    hasParam()
    是否包含某个键,存在返回 true,否则返回 false

示例程序:
    result = nh.hasParam("radius1");
    if(result)
    {
        ROS_INFO("radius1存在");
    }
    else
    {
        ROS_INFO("radius1不存在");
    }
    searchParam(参数1,参数2)
    搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
            
示例程序:
    string key;
    nh.searchParam("radius1",key);
    ROS_INFO("搜索结果是:%s",key.c_str());

到这里ros::NodeHandle操作获取参数值的方法就介绍完了,还有ros::param方法,和上面的方法大同小异,就不介绍了。

删除参数

解释都在里面的注释了,自己看。

#include "ros/ros.h"
int main(int argc, char  **argv)
{
    ros::init(argc,argv,"param_del");
    //使用ros::NodeHandle
    //deleteParam("键")
    //删除成功,返回 true ; 否则(参数不存在),返回 false
    ros::NodeHandle nh;
    bool flag1 = nh.deleteParam("radius1");
    if(flag1)
    {
        ROS_INFO("radius1删除成功");
    }
    else
    {
        ROS_INFO("radius1删除失败");
    }
    //使用ros::param
    //del("键")
    //删除成功,返回 true,否则(参数不存在),返回 false
    bool flag2 = ros::param::del("radius2");
    if(flag2)
    {
        ROS_INFO("radius2删除成功");
    }
    else
    {
        ROS_INFO("radius2删除失败");
    }
    return 0;
}

还是没忍住把CMakeLists.txt文件贴上来了,包括了前面几次的文件。对了创建程序包的时候需要的依赖是roscpp和std_msgs,其他的依赖项我没加,也用不着。

在这里插入图片描述
运行截图,可以看到把radius1和radius2给删掉了。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值