.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 ...
随机推荐
- 部署springboot工程到linux上及遇到的坑
一.步骤 1.将工程打成jar包 IDEA中点击file-project structure,如下图: 选择Artifacts-JAR-From modules,选择入口类Main Class,如下图 ...
- DEV gridview根据单元格值改变其他单元格格式
string style = ""; private void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid. ...
- Centos6.5下使用LAMP搭建discuz论坛(编译安装 PS :自学中 写的不好请见谅)
wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz 下载Apache软件包 wget http://downloads.my ...
- Java面试3
反射的定义: 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取它所有的成员变量和方法并且显示出来. 反射机制的 ...
- Exception和解决方案
org.hibernate.HibernateException: No Session found for current thread sessionFactory org.springframe ...
- Spark参数详解 一(Spark1.6)
Spark参数详解 (Spark1.6) 参考文档:Spark官网 在Spark的web UI在"Environment"选项卡中列出Spark属性.这是一个很有用的地方,可以检查 ...
- webpack学习笔记(四)
1 webpack的垫片 举个例子,在main文件中引入jquery和doash两个库: import $ from 'jquery'; import _ from 'lodash'; import ...
- C++——智能指针unique_ptr的实现
起初,我最直观的设计想法,直接设计一个类:包含全部要素(对象,指针计数).然后提供出去. class CPoint { public: CPoint(, ) : x(xVal), y(yVal) {} ...
- ASP.NET MVC中,动态处理页面静态化 【转载】
首先解释一下什么是动态处理页面静态化 对于需要静态化的页面,第一次访问某个Action时,会先执行Action,并在页面渲染后向Response和服务器中网站的目录下都写入需要返回的html,而第二次 ...
- Qt applendPlainText()/append() 多添加一个换行解决方法
Qt applendPlainText()/append() 多添加一个换行解决方法 void ConsoleDialog::appendMessageToEditor(const QString & ...