.yaml参数文件的编写和使用
一、在ROS底下使用.yaml文件配置参数
在ROS底下用起来还是非常方便的,首先,写一个读参数的函数getParam(),由于参数类型不止一种,所以要使用模板。
具体语句如下:
template<typename T>
T getParam(const string& name,const T& defaultValue) //This name must be namespace+parameter_name
{
T v;
if(ros::param::get(name,v)) //get parameter by name depend on ROS.
{
ROS_INFO_STREAM("Found parameter: "<<name<<",\tvalue: "<<v);
return v;
}
else
ROS_WARN_STREAM("Cannot find value for parameter: "<<name<<",\tassigning default: "<<defaultValue);
return defaultValue; //if the parameter haven't been set,it's value will return defaultValue.
}
//How use.
int main(int argc,char** argv)
{
ros::init(argc,argv,"readyaml");
ros::NodeHandle nh;
getParam<int>("readyaml/int",);
getParam<float>("readyaml/float",0.5);
getParam<string>("readyaml/string","NotFound");
getParam<bool>("readyaml/bool",false);
return ;
}
那么怎么设置参数?看代码。
<launch>
<node pkg="readyaml" type="readyaml" name="readyaml" clear_params="true" output="screen">
<!-- First way: direct set-->
<param name="int" value="32760"/>
<!-- Second way: use .yaml file-->
<rosparam file="$(find readyaml)/rosYaml.yaml"/>
</node>
</launch>
rosYaml.yaml文件里写的什么?
#parameter_name: value
string: HaveFound
float: 3.14159
bool: true
程序运行结果:

二、使用Ubuntu下的yaml-cpp
只要在CMakeLists.txt文件中添加相应声明,就可以在程序中使用Ubuntu下一个关于yaml文件的一个库,也是非常方便。
要添进去的语句如下:
FIND_LIBRARY(YAML_CPP_LIBRARIES yaml-cpp)
笔者装的是yaml的库,也可以安装package版本,CMakeLists.txt中添加的语句可以改成:
FIND_LIBRARY(YAML_CPP_LIBRARIES yaml-cpp)
if(NOT YAML_CPP_LIBRARIES)
# If yaml-cpp not found in the system, try finding it as a user CMake-generated project
FIND_PACKAGE(yaml-cpp REQUIRED)
INCLUDE_DIRECTORIES(${YAML_CPP_INCLUDE_DIRS})
endif(NOT YAML_CPP_LIBRARIES)
然后,在构建可执行文件时添加相应的依赖
target_link_libraries(use_yaml ${YAML_CPP_LIBRARIES})
下面说怎么使用,
第一步,使用YAML::LoadFile()函数加载yaml文件;
如果参数没有“归属”(自己的理解,下面会解释),直接使用as()函数读取该参数;
如果参数有“归属”,先找到参数的主体,再使用as()读取该参数;
说的不清楚,看程序吧。
//自己重写的读参数的函数,形参依次是,参数的主体(YAML::Node)、参数名(string)、默认值(和参数的类型一致)
template<typename T>
T getParam(const YAML::Node& node,const string& name,const T& defaultValue)
{
T v;
try {
v=node[name].as<T>(); //读取参数
std::cout<<"Found parameter: "<<name<<",\tvalue: "<<v<<std::endl; //终端提示读取成功
} catch (std::exception e) {
//找不到该参数的话,将返回默认值
v=defaultValue;
std::cout<<"Cannot find parameter: "<<name<<",\tassigning default: "<<v<<std::endl;
}
return v;
} int main()
{
//加载参数文件
YAML::Node dset_config = YAML::LoadFile("/home/liban/cfiles/Learn_basic/data/test.yaml");
//这里的title0,title1就可以看作其参数的主体
YAML::Node title0=dset_config["title0"];
YAML::Node title1=dset_config["title1"]; //参数single没有“归属“,所以第一个形参为dset_config
getParam<string>(dset_config,"single","cannot");
//Int,Str可以看作title0的属性,Int_,Str_看作title1的属性。
getParam<int>(title0,"Int",);
getParam<string>(title0,"Str","Null");
getParam<int>(title1,"Int_",);
getParam<string>(title1,"Str_","Null");
return ;
}
yaml文件里怎么写的?
title0:
Int: 360
Str: helloworld!
title1:
Int_: 480
Str_: success!
single: can
注意事项:
不要用Tab,用空格!用空格!用空格!
程序运行结果截图:

三、想不到OpenCV库里也有读取yaml参数的功能
主要是使用一个cv::FileStorage()函数用来加载参数文件
还是和前面一样,自己重写一个函数读参数 。 。 。
不再细说,直接看demo
template<typename T>
T getParam(const cv::FileStorage& file,const string& key)
{
T v=T(file[key]); // Core sentence,read parameter.
std::cout<<"Found parameter: "<<key<<",\tvalue: "<<v<<std::endl;
return v;
} int main()
{
string filename="Path to yaml-file";
// Load yaml-file.
cv::FileStorage file_=cv::FileStorage(filename,cv::FileStorage::READ);
// If cannot find yaml-file.
if(file_.isOpened()==false)
{
std::cerr<<"yaml-file "<<filename<<" does not exist."<<std::endl;
file_.release();
return ;
}
getParam<string>(file_,"#data"); // Test '#'.
getParam<string>(file_,"Str");
getParam<int>(file_,"Int");
getParam<float>(file_,"Float");
...
return ;
}
yaml-file里的数据
%YAML:1.0
#data: cannot
Int: 120
Float: 3.145926
Str: helloworld!
执行结果:

注意事项:
(1) yaml文件开头一定要加上"%YAML:1.0";
(2) 可以使用'#'注释文件内容,效果如上截图;
(3) 如果数据类型为字符串,字符串不能以数字开头,否则读不出来(这个也许可以解决,只是没找着方法);
.yaml参数文件的编写和使用的更多相关文章
- 40 VSCode下.json文件的编写——(1) linux/g++ (2).json中参数与预定义变量的意义解释
0 引言 转入linux/VSCode编程之后,迫切了解到有必有较为系统地学习一下VSCode中相关配置文件的写法.下面将分为 linux/g++编译指令..json文件关键词/替换变量的意义.编译链 ...
- YAML 模板文件语法
YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...
- 以libfuse为例介绍rpm打包工具rpmbuild的使用和SPEC文件的编写
一.rpmbuild命令的安装 yum install rpm-build 二.用法 rpmbuild -bb XXXX.spec或者rpmbuild -ba XXX.tar.gz 三.目录概述 rp ...
- Struts2的输入校验(1)——校验规则文件的编写
Struts2的输入校验(1) --校验规则文件的编写 Struts2提供了基于验证框架的输入校验,所有的输入校验只要编写配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验. 注: ...
- C语言可变参数函数的编写
1. 引言 C语言我们接触的第一个库函数是 printf(“hello,world!”);其参数个数为1个. 然后,我们会接触到诸如: printf(“a=%d,b=%s,c=%c”,a,b,c);此 ...
- oracle参数文件与启动过程
oracle随系统启动而启动 cs65-64桌面版orcle-11.2.0.4 启动监听器,后台进程,OEM. 注意: 如果只做一和三,只能启动后台进程,监听器不启动,如果只做二和三,只能启动监听器, ...
- [转帖]helm模板文件chart编写语法详解
helm模板文件chart编写语法详解 https://blog.51cto.com/qujunorz/2421328 需要学习一下. charts编写介绍 开始 快速创建一个chart模板,helm ...
- JMeter学习-027-JMeter参数文件(脚本分发)路径问题:jmeter.threads.JMeterThread: Test failed! java.lang.IllegalArgumentException: File distributed.csv must exist and be readable解决方法
前些天,在进行分布式参数化测试的时候,出现了如题所示的错误报错信息.此文,针对此做一个简略的重现及分析说明. JMX脚本线程组参数配置如下所示: 参数文件路径配置如下所示: 执行JMX脚本后,服务器对 ...
- Oracle expdp按分区导出生成参数文件
使用dba_tab_partitions视图获得每个分区的参数文件内容,使用chr(10)分行 select 'content=data_only'||chr(10)|| 'directory=dat ...
随机推荐
- pycharm的快捷键
一.编辑(Editing) Ctrl+Space 基本的代码完成(类.方法.属性) Ctrl+Alt+Space 快速导入任意类 Ctrl+Shift+Enter 语句完成 Ctrl+P 参数信息(在 ...
- LeetCode 922. Sort Array By Parity II C++ 解题报告
922. Sort Array By Parity II 题目描述 Given an array A of non-negative integers, half of the integers in ...
- ES6的一些知识学习
一.基础 ES6 - 类: class A{ constructor(name,color){ this.name = name; this.color = color; } toString(){ ...
- js cookie 操作 封装
pCookie.js (function(){ var PotatogCookie = {}; //设置cookie PotatogCookie.set = function(key, value, ...
- QC3.0充电标准
- mysql trigger 备忘
最近用mysql有这么一个需求 item表:id,item,url,websiteid website表:id,domain item表示从不同网站获取的信息 website表示获得信息的网站,其中的 ...
- vue.js学习第一天,了解vue.js
vue.js是一个前端框架,他与jquery不同,jquery是一个js库,而vue.js是js的前端框架. vue.js对我们前端页面入侵比较大,而jquery则不然.那我们还为什么要使用vue.j ...
- [Python学习笔记] 数字类型及操作
数字类型 整数类型 十进制:1110,-123 二进制:以0B或0b开头 0b110,-0B101 八进制:以0O或0o开头 0o123,-0O567 十六进制:以0X或0x开头 0x555,-0X8 ...
- java_oop_接口
接口 难的是在系统设计里怎么样使用接口,主要在语法,不在系统架构与设计 概念 声明 语法 只有抽象方法的抽象类?可以用接口来表示,用接口来代替这样的抽象类,是因为 ...
- 【C#】stream图像转byte的问题
Image xx = Image.FromStream(linkList[ii].stream); byte[] bytes = new Byte[linkList[ii].stream.Length ...