一、概念:
用于不同节点之间的数据共享,相当于一个公共容器,数据存储在该容器中,可被不同的节点调用。主要应用场景用于路径规划:例如我们可以将小车的尺寸存入参数服务器中,当进行路径规划时需要用到小车尺寸,不同节点就可以从参数服务器中调用尺寸了。
二、理论顺序:
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;
}