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);
- 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 时间