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通道,其中任何透明度都将被解释为未知。
作者:天涯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)
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) 如果数据类型为字符串,字符串不能以数字开头,否则读不出来(这个也许可以解决,只是没找着方法);