概述
参数服务器作为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给删掉了。