一、准备
1、新建C++文件
选中src文件夹,新建文件,名为demo02_param_get.cpp。
2、编辑文件,搭建框架
#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---------------------------------
return 0;
}
3、编写配置文件CMList.txt
add_executable(demo02_param_get src/demo02_param_get.cpp)
target_link_libraries(demo02_param_get
${catkin_LIBRARIES}
)
二、param函数
param(键,默认值)
——如果键存在,返回对应的结果,否则返回默认值
1、添加程序
//1、param
double radius=nh.param("radius",0.5);
ROS_INFO("radius=%.2f",radius);
2、编译
编译前的程序:
#include "ros/ros.h"
/*
参数查询演示
实现:
ros::NodeHandle------------------------------------
param(键,默认值)
如果键存在,返回对应的结果,否则返回默认值
getParam(键,存储结果的变量)
存在,返回true,且将值赋值给参数2
若键不存在,返回false,且不为参数2赋值
*/
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 radius=nh.param("radius",0.5);
ROS_INFO("radius=%.2f",radius);
return 0;
}
编译
ctrl+shift+b
3、打开终端,观察结果
ctrl+alt+t 打开终端;
启动核心 roscore;
垂直分割终端,启动参数:
cd demo03_ws/
设置源头:source ./devel/setup.bash
运行:rosrun plumbing_param_server demo01_param_set
水平分割终端,启动查询:
重新声明源头:source ./devel/setup.bash
运行:rosrun plumbing_param_server demo02_param_get
注意:如果查询的语句中,关键字没有或是写错,会返回默认值。这个例子中,默认值是0.5;
三、getParam函数
//2、getParam函数
double radius2=0.0;
bool result=nh.getParam("radiusxxx",radius2);
if(result)
{
ROS_INFO("获取的半径是:%.2f",radius2);
}else{
ROS_INFO("被查询的变量不存在");
}
编译
查询
结果:
添加getParam函数后进行两次查询,第一次成功。出现两个0.35.然后修改备被查询的变量,重新编译后查询,显示“被查询的变量不存在”。
四、getParamCached函数
//3、getParamCached函数
bool result1=nh.getParamCached("radius",radius2);
if(result1)
{
ROS_INFO("getParamCached函数获得的半径是:%.2f",radius2);
}else{
ROS_INFO("被查询的变量不存在");
}
编译
查询
结果:
五、getParamNames函数
获取所有的键并存储在参数vector中
程序实现:
//4、getParamNames(std::vector<std::string>)获取所有的键并存储在参数vector中
std::vector<std::string> names;
nh.getParamNames(names);
for(auto &&name : names)
{
ROS_INFO("遍历的元素:%s",name.c_str());
}
编译
查询结果:得到所有的“键”
六、hasParam(键)
判断是否包含某个键。存在返回true,不存在返回false;
程序实现:
//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存储搜索结果的变量
程序实现:
//6、searchParam(参数1,参数2):搜索键;参数1是被搜索的键,参数2存储搜索结果的变量
std::string key;
nh.searchParam("radius",key);
ROS_INFO("搜索结果:%s",key.c_str());
结果查询:
八、最终的程序
#include "ros/ros.h"
/*
参数查询演示
实现:
ros::NodeHandle------------------------------------
param(键,默认值)
如果键存在,返回对应的结果,否则返回默认值
getParam(键,存储结果的变量)
存在,返回true,且将值赋值给参数2
若键不存在,返回false,且不为参数2赋值
*/
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 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("getParam函数获取的半径是:%.2f",radius2);
}else{
ROS_INFO("被查询的变量不存在");
}
//3、getParamCached函数
bool result1=nh.getParamCached("radius",radius2);
if(result1)
{
ROS_INFO("getParamCached函数获得的半径是:%.2f",radius2);
}else{
ROS_INFO("被查询的变量不存在");
}
//4、getParamNames(std::vector<std::string>)获取所有的键并存储在参数vector中
std::vector<std::string> names;
nh.getParamNames(names);
for(auto &&name : names)
{
ROS_INFO("遍历的元素:%s",name.c_str());
}
//5、hasParam(键):判断是否存在某个键。存在返回true,不存在返回false;
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;
}