yaml文件用法总结
总结一下就是为了读写出多种多样格式并且减少依赖可以选择std::fstream的ifstream和ofstream)。
使用yaml-cpp库可以将yaml文件以节点YAML::Node的形式载入YAML::LoadFile,然后用std::fstream的ofstream写入文件。
读文件的时候首选cv::fileStorage因为可以很好的提取矩阵,其次选择std::fstream的ifstream麻烦在于要一行一行的读取解析耗费心力。
整齐划一的格式例如文件路径适合std::fstream例如ORB_SLAM2中载入图片和字典。
ORB_SLAM2中用到的地方
多种多样的配置参数和相机参数适合用cv::fileStorage可以更好的解析供OpenCV使用。
ORB_SLAM2的LoadImages函数用std::ifstream读取txt文件中的图片。
ORB_SLAM2的saved_trajectory函数用std::ofstream保存轨迹和位姿到txt文件。
ORB_SLAM2的fsSettings函数用cv::FileStorage::READ读取读取yaml文件中的相机和配置参数。
下面是一些常见的yaml文件格式
Multi-Camera Parallel Tracking and Mapping (MCPTAM)的标定文件
MultiCol-SLAM is a multi-fisheye camera SLAM system的标定文件
ROS Navigation的参数文件
安装yaml-cpp库
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build && cd build
cmake -DYAML_BUILD_SHARED_LIBS=ON ..
make -j4
sudo make install
YAML基本语法
大小写敏感
使用空格缩进表示层级关系
同层级的元素左侧对齐
#表示注释
对象
键值对的集合 key: value冒号后面要加一个空格
可以一行只写一个键值对
也可以把所有键值对写成一个行内对象
hash: { name: Steve, foo: bar }
还可以使用缩进表示层级关系
key:
child-key: value
child-key2: value2
较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:意思即对象的属性是一个数组 [complexkey1,complexkey2],对应的值也是一个数组 [complexvalue1,complexvalue2]
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
数组
一组连词线 - 开头按次序排列的值,构成一个数组。
- A
- B
- C
YAML 支持多维数组,可以使用行内表示:
key: [value1, value2, ...]
数据结构的子成员是一个数组
-
- A
- B
- C
一个相对复杂的例子,意思是 companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
数组也可以使用流式(flow)的方式表示
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
复合结构
数组和对象可以构成复合结构
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
常量
纯量是最基本的不可再分的值
布尔值
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
浮点数
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
整数
int: