一、在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参数文件的编写和使用的更多相关文章

  1. 40 VSCode下.json文件的编写——(1) linux/g++ (2).json中参数与预定义变量的意义解释

    0 引言 转入linux/VSCode编程之后,迫切了解到有必有较为系统地学习一下VSCode中相关配置文件的写法.下面将分为 linux/g++编译指令..json文件关键词/替换变量的意义.编译链 ...

  2. YAML 模板文件语法

    YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...

  3. 以libfuse为例介绍rpm打包工具rpmbuild的使用和SPEC文件的编写

    一.rpmbuild命令的安装 yum install rpm-build 二.用法 rpmbuild -bb XXXX.spec或者rpmbuild -ba XXX.tar.gz 三.目录概述 rp ...

  4. Struts2的输入校验(1)——校验规则文件的编写

    Struts2的输入校验(1) --校验规则文件的编写 Struts2提供了基于验证框架的输入校验,所有的输入校验只要编写配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验. 注: ...

  5. C语言可变参数函数的编写

    1. 引言 C语言我们接触的第一个库函数是 printf(“hello,world!”);其参数个数为1个. 然后,我们会接触到诸如: printf(“a=%d,b=%s,c=%c”,a,b,c);此 ...

  6. oracle参数文件与启动过程

    oracle随系统启动而启动 cs65-64桌面版orcle-11.2.0.4 启动监听器,后台进程,OEM. 注意: 如果只做一和三,只能启动后台进程,监听器不启动,如果只做二和三,只能启动监听器, ...

  7. [转帖]helm模板文件chart编写语法详解

    helm模板文件chart编写语法详解 https://blog.51cto.com/qujunorz/2421328 需要学习一下. charts编写介绍 开始 快速创建一个chart模板,helm ...

  8. JMeter学习-027-JMeter参数文件(脚本分发)路径问题:jmeter.threads.JMeterThread: Test failed! java.lang.IllegalArgumentException: File distributed.csv must exist and be readable解决方法

    前些天,在进行分布式参数化测试的时候,出现了如题所示的错误报错信息.此文,针对此做一个简略的重现及分析说明. JMX脚本线程组参数配置如下所示: 参数文件路径配置如下所示: 执行JMX脚本后,服务器对 ...

  9. Oracle expdp按分区导出生成参数文件

    使用dba_tab_partitions视图获得每个分区的参数文件内容,使用chr(10)分行 select 'content=data_only'||chr(10)|| 'directory=dat ...

随机推荐

  1. pycharm的快捷键

    一.编辑(Editing) Ctrl+Space 基本的代码完成(类.方法.属性) Ctrl+Alt+Space 快速导入任意类 Ctrl+Shift+Enter 语句完成 Ctrl+P 参数信息(在 ...

  2. 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 ...

  3. ES6的一些知识学习

    一.基础 ES6 - 类: class A{ constructor(name,color){ this.name = name; this.color = color; } toString(){ ...

  4. js cookie 操作 封装

    pCookie.js (function(){ var PotatogCookie = {}; //设置cookie PotatogCookie.set = function(key, value, ...

  5. QC3.0充电标准

  6. mysql trigger 备忘

    最近用mysql有这么一个需求 item表:id,item,url,websiteid website表:id,domain item表示从不同网站获取的信息 website表示获得信息的网站,其中的 ...

  7. vue.js学习第一天,了解vue.js

    vue.js是一个前端框架,他与jquery不同,jquery是一个js库,而vue.js是js的前端框架. vue.js对我们前端页面入侵比较大,而jquery则不然.那我们还为什么要使用vue.j ...

  8. [Python学习笔记] 数字类型及操作

    数字类型 整数类型 十进制:1110,-123 二进制:以0B或0b开头 0b110,-0B101 八进制:以0O或0o开头 0o123,-0O567 十六进制:以0X或0x开头 0x555,-0X8 ...

  9. java_oop_接口

    接口    难的是在系统设计里怎么样使用接口,主要在语法,不在系统架构与设计    概念    声明    语法        只有抽象方法的抽象类?可以用接口来表示,用接口来代替这样的抽象类,是因为 ...

  10. 【C#】stream图像转byte的问题

    Image xx = Image.FromStream(linkList[ii].stream); byte[] bytes = new Byte[linkList[ii].stream.Length ...