解析yaml

YAML最基本,最常用的一些使用格式:
首先YAML中允许表示三种格式,分别是常量值,对象和数组

1
2
3
4
5
6
7
8
9
10
11
12
13
url: http://www.wolfcode.cn 

server:
host: http://www.wolfcode.cn

server:
- 120.168.117.21
- 120.168.117.22
- 120.168.117.23
#常量
pi: 3.14 #定义一个数值3.14
hasChild: true #定义一个boolean值
name: 'Hello YAML' #定义一个字符串

yaml-cpp 读 yaml

ROS默认的yaml-cpp版本一般在0.5以上,CMakeLists如下配置

1
2
3
4
5
6
7
8
9
10
include_directories(
/usr/include
${catkin_INCLUDE_DIRS}
)

add_executable(${PROJECT_NAME} src/test_yaml.cpp)
target_link_libraries(${PROJECT_NAME}
${catkin_LIBRARIES}
yaml-cpp # 这里必须有
)

map_server中学习一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <ros/ros.h>
#include "yaml-cpp/yaml.h"
#include <iostream>
#include <fstream>
#include <string>

// 必须自定义,不明白为什么网上的资料都没有提到
template<typename T> void operator >> (const YAML::Node& node, T& i )
{
i = node.as<T>();
}

int main(int argc, char** argv)
{
ros::init(argc, argv, "test_yaml" );
ros::NodeHandle nh;

std::string file = "/home/user/map.yaml";
std::ifstream fin(file.c_str());
if (fin.fail() )
{
ROS_ERROR("could not open %s.", file.c_str());
return false;
}
// 适用于 0.5 以上版本
YAML::Node doc = YAML::Load(fin);
try {
double res, negate;
std::string image;
doc["resolution"] >> res;
doc["image"] >> image;

ROS_INFO("res: %f", res );
ROS_INFO("negate: %f", negate);
ROS_INFO("image: %s", image.c_str() );
}
catch (YAML::InvalidScalar &e) {
ROS_ERROR("The map yaml file error, reason: %s.", e.what());
return false;
}
}

Python 读 Yaml

读YAML的最好方法是使用Python的yaml库PyYAML,到官网下载安装后,可以先运行测试程序看是否成功。
读取程序如下:

1
2
3
4
5
6
import yaml,os

f = open("test.yaml")
y = yaml.load(f,Loader=yaml.FullLoader)

print y

运行后,结果: