参数服务器在ROS中主要用于实现不同节点之间的数据共享。比如,导航实现时,会进行路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成实时的行进路径。
需关注三个角色:ROS Master、Talker、Listener。
注意:参数服务器不失为高性能而设计的,因此最好用于储存静态的非二进制的简单数据。
对于参数服务器的操作,主要有增删查改四方面,下面分别从增改、差、删来进行实现:
- 增改
改其实是通过参数覆盖来实现的,所以本质上改和增实现方法相同。增改可以通过两套API来实现:①设置节点句柄对象,节点句柄对象中内置了对参数服务器进行增删查改的命令;②使用param命名空间下的增删查改函数:
#include "ros/ros.h"
/*
需要实现参数的新增与修改
需求:首先设置机器人的共享参数,类型、半径(0.15m)
再修改半径(0.2m)
实现:
ros::NodeHandle
setParam("键",值)
ros::param
set("键",值)
修改:只需继续调用setParam 或set 函数,保证键是已经存在的,值会自行覆盖。
*/
int main(int argc, char *argv[])
{
//初始化ROS节点
ros::init(argc,argv,"set_param_c");
//创建ROS节点句柄
ros::NodeHandle nh;
//参数增----------------------------------
//方案1:nh
nh.setParam("type","xiaoHuang");//key的名字为type,值为xiaoHuang
nh.setParam("radius",0.15);
//方案2:ros::param
ros::param::set("type_param","xiaoBai");//键名不可重复
ros::param::set("radius_param",0.15);
//参数改----------------------------------
//方案1:nh
nh.setParam("radius",0.2);//键已经存在,不需重新设置,这里参数进行了覆盖
//方案2:ros::param
ros::param::set("radius_param",0.2);
return 0;
}
- 查
同上,C++实现对参数服务器的查询,也可以通过两套API完成。且两套API中有一一对应的函数,这里对设置节点句柄对象的六种方法进行了演示,而仅对param命名空间中的内置函数中的两种进行了演示:
#include "ros/ros.h"
/*
演示参数查询
实现:
ros::NodeHandle----------------------------
param("键",默认值)
存在,返回对应结果,否则返回默认值
getParam("键",存储结果的变量)
存在,返回ture,且将值赋给参数2
如果键不存在,那么返回值false,且不为参数2赋值
getParamCached("键",存储结果的变量)--提高变量获取效率
存在,返回true,且将值赋给参数2
如果键不存在,那么返回值false,且不为参数2赋值
getParamNames(std::vector<std::string>)
获取所有的键,并存储在参数vector中
hasParam("键")
是否包含某个键,存在返回true,否则返回false
searchParam(参数1,参数2)
搜索键,参数1是被搜索的键,参数2是存储搜索结果的变量
ros::param---------------------------------
与NodeHandle类似
*/
int main(int argc, char *argv[])
{
//设置编码
setlocale(LC_ALL,"");
//初始化ROS节点
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",radius2);
if (result)
{
ROS_INFO("获取的半径是:%.2f",radius2);
}else
{
ROS_INFO("被查询的变量不存在。");
}
*/
//3.getParamCaches 与getParam 类似。只是性能上有提升,一般测试下,看不出来
/*
bool result = nh.getParamCached("radius",radius2);
if (result)
{
ROS_INFO("获取的半径是:%.2f",radius2);
}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 flag1 = nh.hasParam("radius");
bool flag2 = nh.hasParam("radiusXXX");
ROS_INFO("radius 存在吗? %d",flag1);
ROS_INFO("radiusXXX 存在吗? %d",flag2);
//6.searchParam
std::string key;
nh.searchParam("radius",key);
ROS_INFO("搜索结果:%s",key.c_str());
//ros:param-----------------------------------------
//1.param
double radius_param = ros::param::param("radius",100.5);
ROS_INFO("radius_param = %.2f",radius_param);
//2.getParamNames,未运行成功
/*
std::vector<std::string> names_param;
ros::param::getParamNames(names_param);
for (auto &&name : names_param)
{
ROS_INFO("键:%s",name.c_str());
}
*/
return 0;
}
- 删
参数的删除同前,也有两套API来实现:
#include "ros/ros.h"
/*
演示参数删除:
实现:
ros::NodeHandel
delParam()
ros::param
del()
*/
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"param_del_c");
ros::NodeHandle nh;
//删除::NodeHandel-------------------------------------
bool flag1 = nh.deleteParam("radius");
if (flag1)
{
ROS_INFO("删除成功!");
} else
{
ROS_INFO("删除失败!");
}
//删除::ros::param-------------------------------------
bool flag2 = ros::param::del("radius_param");
if (flag2)
{
ROS_INFO("radius_param 删除成功!");
} else
{
ROS_INFO("radius_param 删除失败!");
}
return 0;
}
- 终端中实现参数增删改查
ROS提供了一系列实用的命令行工具来获得不同的节点信息,其中rosparam命令可以对参数进行相应操作。
①增改:rosparam set <参数名> <参数值>
命令可以实现,如:
rosparam set name huluwa
;
rosparam set length 1.5
;
②查:rosparam get <参数名>
命令可以实现,如:
输入rosparam set name
,出现结果huluwa
;
③删:rosparam del <参数名>
命令可以实现。
一些其他的rosparam命令将在下一课中介绍。
参考:AutoLabor