ros yaml 格式解释 - maohaihua/ros_study GitHub Wiki

1.2 YAML文件

YAML格式用一个简单,完整的例子来解释:

image: testmap.png
resolution: 0.1
origin: [0.0, 0.0, 0.0]
occupied_thresh: 0.65
free_thresh: 0.196
negate: 0

必填字段:

image:包含占用数据的图像文件的路径; 可以是绝对的,也可以是相对于YAML文件的位置

resolution:地图的分辨率,米/像素

origin:地图中左下角像素的二维姿态,为(x,y,yaw),偏航为逆时针旋转(偏航= 0表示无旋转)。 系统的许多部分目前忽略了偏航。

occupied_thresh:大于此阈值的像素被视为完全占用。

free_thresh:小于此阈值的像素被认为是完全空闲的。

negate:是否应该反转 白/黑 空闲/占用(阈值的解释不受影响)

可选参数:

mode:可以有三个值之一:trinary,scale或raw。 Trinary是默认值。

参数解释:

如果像素的COLOR值x在[0,255]范围内,我们应该如何解释这个值?首先,我们将整数x转换为一个浮点数p,转换公式具体取决于yaml中negate标志的定义。

如果negate为0,则p =(255 - x)/ 255.0。这意味着黑色(0)现在具有最高值(1.0)而白色(255)具有最低值(0.0)。

如果negate为1,则p = x / 255.0。这是图像的非标准解释。

trinary 标准解释是三元解释,即解释所有值,使输出最终成为三个值之一。

如果p> occupied_thresh,则输出值100以指示单元格已被占用。

如果p <free_thresh,则输出值0以指示单元格是空闲的。

否则,输出-1 a.k.a. 255(作为无符号字符),以指示该单元格未知。

scale 这将调整上述解释,以允许更多的输出值。

如前所述,如果p> occupied_thresh,则输出值100,如果p <free_thresh,则输出值0。

否则,输出99 *(p - free_thresh)/(occupied_thresh - free_thresh)

这将允许您输出范围为[0,100]的完整渐变值。要输出-1,只需使用png的alpha通道,其中任何透明度都将被解释为未知。

raw 此模式将为每个像素输出x,因此输出值为[0,255]。

作者:天涯0508 来源:CSDN 原文:https://blog.csdn.net/wsc820508/article/details/81556620 版权声明:本文为博主原创文章,转载请附上博文链接!

https://www.cnblogs.com/scripthome/p/8583783.html

一、在ROS底下使用.yaml文件配置参数

在ROS底下用起来还是非常方便的,首先,写一个读参数的函数getParam(),由于参数类型不止一种,所以要使用模板。

具体语句如下: 复制代码

template 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("readyaml/int",0); getParam("readyaml/float",0.5); getParam("readyaml/string","NotFound"); getParam("readyaml/bool",false); return 0; }

复制代码

那么怎么设置参数?看代码。 复制代码

                         

复制代码

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 T getParam(const YAML::Node& node,const string& name,const T& defaultValue) { T v; try { v=node[name].as();  //读取参数 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(dset_config,"single","cannot");   //Int,Str可以看作title0的属性,Int_,Str_看作title1的属性。 getParam(title0,"Int",0); getParam(title0,"Str","Null"); getParam(title1,"Int_",0); getParam(title1,"Str_","Null"); return 0;
}

复制代码

yaml文件里怎么写的? 复制代码

title0: Int: 360 Str: helloworld! title1: Int_: 480 Str_: success! single: can

复制代码

注意事项:

不要用Tab,用空格!用空格!用空格!

程序运行结果截图:

三、想不到OpenCV库里也有读取yaml参数的功能

主要是使用一个cv::FileStorage()函数用来加载参数文件

还是和前面一样,自己重写一个函数读参数 。 。 。

不再细说,直接看demo 复制代码

template 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 1; } getParam(file_,"#data"); // Test '#'. getParam(file_,"Str"); getParam(file_,"Int"); getParam(file_,"Float");   ... return 0;
}

复制代码

yaml-file里的数据

%YAML:1.0 #data: cannot Int: 120 Float: 3.145926 Str: helloworld!

执行结果:

注意事项:

  (1) yaml文件开头一定要加上"%YAML:1.0";

  (2) 可以使用'#'注释文件内容,效果如上截图;

  (3) 如果数据类型为字符串,字符串不能以数字开头,否则读不出来(这个也许可以解决,只是没找着方法);  

⚠️ **GitHub.com Fallback** ⚠️