参数服务器实现是最为简单的,该模型如下图所示,该模型中涉及到三个角色:
ROS Master (管理者)
Talker (参数设置者)
Listener (参数调用者)
ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。
增加参数与修改参数
代码
#include "ros/ros.h"
/*
需要实现参数的新增与修改
需求:首先设置机器人的共享参数,类型、半径(0.15m)
再修改半径(0.2m)
实现:
ros::NodeHandle
setParam();
ros::param
set();
*/
int main(int argc,char *argv[])
{
setlocale(LC_ALL,"");
//初始化ROS节点
ros::init(argc,argv,"jiqi");
//创建ROS节点句柄
ros::NodeHandle nh;
ROS_INFO("成功操作参赛服务器");
//参数增------------------------------
//方案一:nh
nh.setParam("type1","xiaohong");
nh.setParam("radius1",0.15);
//方案二:ros::param
ros::param::set("type2","xiaobai");
ros::param::set("radius2",0.2);
//参数改------------------------------
//方案一:nh
nh.setParam("radius1",0.35);
//方案二:ros::param
ros::param::set("radius2",0.4);
return 0;
}
配置修改
add_executable(demo01_param_set src/demo01_param_set.cpp)
target_link_libraries(demo01_param_set
${catkin_LIBRARIES}
)
程序实现
查找参数
参数查询
实现:
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_c");
//创建节点句柄
ros::NodeHandle nh;
//ros::NodeHandle---------------------------------------------------------
//1.param
// double arr1 = nh.param("radius1",0.1);
// ROS_INFO("半径:%.2f",arr1);
//2.getParam
// double radius = 0.0;
// bool arr2 = nh.getParam("radius12",radius);
// if(arr2)
// {
// ROS_INFO("获取的半径是:%.2f",radius);
// }
// else
// {
// ROS_INFO("查询变量不存在。");
// }
//3.getParamCached
// double radius2 = 0.0;
// bool arr3 = nh.getParamCached("radius1",radius2);
// if(arr3)
// {
// 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("radius1");
// bool flag2 = nh.hasParam("radius1xxx");
// ROS_INFO("radius1存在吗?%d",flag1);
// ROS_INFO("radius1xxx存在吗?%d",flag2);
//6.searchParam
// std::string key;
// nh.searchParam("radius1",key);
// ROS_INFO("搜索结果:%s",key.c_str());
//ros::param-----------------------------------------------------------------
//1.param
// double arr = ros::param::param("radius1",0.1);
// ROS_INFO("半径:%.2f",arr);
//2.getParam
std::vector<std::string> names;
ros::param::getParamNames(names);
for (auto &&name :names)
{
ROS_INFO("遍历的元素:%s",name.c_str());
}
return 0;
}
配置修改
add_executable(demo02_param_gat src/demo02_param_gat.cpp)
target_link_libraries(demo02_param_gat
${catkin_LIBRARIES}
)
程序实现
删除参数
代码
#include "ros/ros.h"
/*
需要实现参数的新增与修改
需求:首先设置机器人的共享参数,类型、半径(0.15m)
再修改半径(0.2m)
实现:
ros::NodeHandle
setParam();
ros::param
set();
*/
int main(int argc,char *argv[])
{
setlocale(LC_ALL,"");
//初始化ROS节点
ros::init(argc,argv,"jiqi");
//创建ROS节点句柄
ros::NodeHandle nh;
ROS_INFO("成功操作参数服务器");
//参数增------------------------------
//方案一:nh
nh.setParam("type1","xiaohong");
nh.setParam("radius1",0.15);
//方案二:ros::param
ros::param::set("type2","xiaobai");
ros::param::set("radius2",0.2);
//参数改------------------------------
//方案一:nh
nh.setParam("radius1",0.35);
//方案二:ros::param
ros::param::set("radius2",0.4);
return 0;
}
配置修改
add_executable(demo03_param_del src/demo03_param_del.cpp)
target_link_libraries(demo03_param_del
${catkin_LIBRARIES}
)