1 参数服务器的理论模型
参数服务器是一种以共享方式实现不同节点之间数据交互的通信模式。
参数服务器在 ROS 中主要用于不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。
参数服务器一般适用于存在数据共享的一些应用场景。
参数服务器的理论模型如下:
参数服务器的运作流程:
-
Talker 设置参数
Talker 通过RPC向参数服务器发送参数(包括参数名于参数值),ROS Master 将参数保存到参数列表中
-
Listener 获取参数
Listener 通过RPC向参数服务器发送参数查找请求,请求中包含要查找的参数名
-
ROS Master 向 Listener 发送参数值
ROS Master 根据 步骤2 请求提供的参数名查找参数值,并将查询结果通过 RPC 发送给 Listener
参数可使用数据结构:
- 32-bit integers
- booleans
- doubles
- iso8601 dates
- lists
- base64-encoded binary data
【注】参数服务器最好用于存储静态的非二进制的简单数据
2 参数服务器的增删改查
需求:实现参数服务器的增删改查。
2-1. 参数服务器增改数据
/*
参数服务器操作之新增与修改(二者API一样)_C++实现:
在 roscpp 中提供了两套 API 实现参数操作
ros::NodeHandle
setParam("键",值)
ros::param
set("键","值")
示例:分别设置整形、浮点、字符串、bool、列表、字典等类型参数
修改(相同的键,不同的值)
*/
// 新增一个参数
nh.setParam("key", value);
// 设置某一参数
ros::param::set("key", value);
2-2. 参数服务器获取参数
/*
参数服务器操作之查询_C++实现:
在 roscpp 中提供了两套 API 实现参数操作
ros::NodeHandle
ros::param ----- 与 NodeHandle 类似
*/
//key存在,返回对应结果,否则返回默认值value
nh.param("key", value);
//key存在,返回 true,且将值赋值给value
//如果键key不存在,那么返回值为 false,且不为value赋值
bool flag = nh.getParam("key", value);
//key存在,返回 true,且将值赋值给value
//如果键key不存在,那么返回值为 false,且不为value赋值
//比 getParam函数更有效率一点(函数会先从本地查找,后在去参数服务器查找)
bool flag = nh.getParamCached("key", value);
// 获取所有的键,并存储在参数 vector 中
std::vector<std::string> res;
nh.getParamNames(res);
//是否包含某个键,存在返回 true,否则返回 false
bool flag = nh.hasParam("key");
//搜索键,key是被搜索的键,value存储搜索结果的变量
nh.searchParam("key", value);
2-3. 参数服务器删除参数
/*
参数服务器操作之删除_C++实现:
ros::NodeHandle
deleteParam("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
ros::param
del("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
*/
bool flag = nh.deleteParam("key");
bool flag = ros::param::del("key");