作用
存储一些多节点共享的数据,类似于全局变量。
案例
实现参数增删改查操作。
注意:参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据
在 C++ 中实现参数服务器数据的增删改查,可以通过两套 API 实现:
-
ros::NodeHandle
-
ros::param
1.创建工作空间并初始化
mkdir -p demo03_ws/src
cd demo03_ws
catkin_make
2.进入 src 创建 ros 包并添加依赖
配置功能包 plumbing_param_server
导入依赖的包 roscpp rospy std_msgs
3.在功能包plumbing_param_server目录src下新建demo01_param_set.cpp(参数的新增与修改)
#include "ros/ros.h"
/*
需求:实现参数服务器参数的增删改查操作。
设置机器人共享参数,类型,半径(0.15m)
实现:
ros::NodeHandle
setParam()
ros::param
set()
*/
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//初始化ros节点 set_param_c 节点名
ros::init(argc,argv,"set_param_c");
//创建节点句柄
ros::NodeHandle nh;
//NodeHandle--------------------------------------------------------
nh.setParam("type","xiaohuang");
nh.setParam("radius",0.15);
nh.setParam("nh_int",10); //整型
nh.setParam("nh_double",3.14); //浮点型
nh.setParam("nh_bool",true); //bool
nh.setParam("nh_string","hello NodeHandle"); //字符串
//修改演示(相同的键,不同的值)
nh.setParam("nh_int",10000);
//param--------------------------------------------------------
ros::param::set("type_param","xiaobai");
ros::param::set("radius_param",0.15);
ros::param::set("param_int",20);
ros::param::set("param_double",3.14);
ros::param::set("param_string","Hello Param");
ros::param::set("param_bool",false);
//修改演示(相同的键,不同的值)
ros::param::set("param_int",20000);
return 0;
}
4.在功能包plumbing_param_server目录src下新建demo02_param_get.cpp(参数的新增与修改)
/*
演示参数 -查询
在 roscpp 中提供了两套 API 实现参数操作
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 ----- -------
与 NodeHandle 类似
*/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
//设置编码
setlocale(LC_ALL,"");
//初始化ros节点
ros::init(argc,argv,"get_param");
//创建节点句柄
ros::NodeHandle nh;
//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.getParamCached()
// 与getParam类似,只是在性能上有提升,一般测试下,类能提升看不出来
// double radius2 =0.0;
// bool result=nh.getParamCached("radius",radius2);
// if(result)
// {
// ROS_INFO("获取的半径是:%.2f",radius2);
// }
// else{
// ROS_INFO("备查询的变量不存在");
// }
//4.getParamNames()
std::vector<std::string> param_names1; //创建一个容器,存放这些名称
nh.getParamNames(param_names1);
for (auto &&name : param_names1)
{
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(参数1,参数2)
//搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
std::string key;
nh.searchParam("radius",key);
ROS_INFO("搜索键:%s",key.c_str());
return 0;
}
4.在功能包plumbing_param_server目录src下新建demo03_param_delete.cpp(参数的新增与修改)
/*
参数服务器操作之删除_C++实现:
ros::NodeHandle
deleteParam("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
ros::param
del("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
*/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"delete_param");
ros::NodeHandle nh;
//deleteParam("键")
//根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
bool flag1 = nh.deleteParam("radius");
if(flag1)
{
ROS_INFO("删除成功");
}
else{
ROS_INFO("删除失败");
}
return 0;
}
5.编辑配置文件
add_executable(demo01_param_set src/demo01_param_set.cpp)
add_executable(demo02_param_get src/demo02_param_get.cpp)
add_executable(demo03_param_del src/demo03_param_del.cpp)
target_link_libraries(demo01_param_set
${catkin_LIBRARIES}
)
target_link_libraries(demo02_param_get
${catkin_LIBRARIES}
)
target_link_libraries(demo03_param_del
${catkin_LIBRARIES}
)
6.编译与执行
第一个命令行:启动 roscore
第二个命令行:
cd demo04_ws
catkin_make
source ./devel/setup.bash
rosrun plumbing_param_server demo01_param_set
第三个命令行:
cd demo04_ws
catkin_make
source ./devel/setup.bash
rosrun plumbing_param_server demo02_param_get