目录
键值对
键值对书写格式
键值对的引用
强制类型转换
字符串
时间与日期
已知偏移时区和当地时间
已知UTC世界时间
数组
普通数组
键值对数组
数组的引用
多维数组
命名空间
命名空间下普通变量赋值方式
使用引用给命名空间下的变量赋值
使用引用向命名空间下导入变量
Yaml文件的结构:
键值对中,key必须是字符串,但是value可以为bool/string/int/float类型的:
# 键值对
KeyValueBool: true #bool
KeyValueStr: "abc" #string
在写键值对时,key与:没有空格,但是value与:之间有空格。
在yaml文件内使用launch中替换子标签:
# 键值对
KeyValueBool: true #bool
KeyValueStr: "$(optenv ROS_NAMESPACE NULL)" #string
搭配launch文件中rosparam子标签使用,详见:
roslaunch/XML - ROS Wikihttp://wiki.ros.org/roslaunch/XML#substitution_args
ROS中launch文件和元功能包实现的最详解(示例+代码+参数解析)_超级霸霸强的博客-CSDN博客https://blog.csdn.net/weixin_45590473/article/details/122647788注意:当value的双引号/单引号内含有单引号’或者双引号时”,需要使用转移字符\:
# 键值对
KeyValueBool: true #bool
KeyValueStr: "ss\’\”" #string
引用格式如下所示:Var_name: &refer_name
# 键值对
KeyValueBool: &KeyValueBool
true #bool
在写引用时,引用符号&与:之间一定要有空格,且&与变量引用别名之间没空格。
目前yaml支持以下数据类型转换:
源数据类型 |
目标数据类型 |
强制类型转换符 |
string |
Int |
!!int |
string |
float |
!!float |
Int |
string |
!!str |
float |
string |
!!str |
注意:string转int类型时,字符串内不可以有小数点.!
# 字符串转整形
StringToInt: !!int "122"
# 字符串转浮点型
StringToFloat: !!float "122.0"
# 浮点型转字符串
FloatToString: !!float 122.3
# 整型转字符串
IntToString: !!int 122
# 字符串
String1:
top
top
# 字符串
String2: |
top
top
结果为:top\n top
上述两种形式都表示“不省略\n换行符”,而且我们可以看到top之间隔着“换行+空格”,我们可以使用如下符号省略\n换行符,但是不可以省略空格,因为空格是由tab键产生的,并且用于表征变量间的层次关系(缩进标识层级关系):
# 字符串
String1: >
top
top
结果为:top top
总之,再次强调,字符串不需要包在引号之内。有两种方法书写多行文字(multi-line strings),一种可以保存新行(使用 | 字符),另一种可以折叠新行(使用 > 字符)。除此之外,根据设置,前方的引领空白符号(leading white space)必须排成条状,以便和其他数据或是行为(如示例中的缩进)明显区分。
# 日期与时间
data: 2001-12-14t21:59:43.10-05:00
输出结果如下所示:
命令行输入:rosparam get /param01/data
输出结果:
!!python/object:xmlrpc.client.DateTime
value: 20011214T21:59:43
该事件日期采用的是iso-8601格式,iso-8601日期格式详见:
yaml文件中ISO-8601格式的日期解析_超级霸霸强的博客-CSDN博客https://blog.csdn.net/weixin_45590473/article/details/123256106
# 日期与时间
data01: 1970-01-01T00:00:00Z
输出结果如下所示:
命令行输入:rosparam get /param01/data01
输出:
!!python/object:xmlrpc.client.DateTime
value: 19700101T00:00:00
数组中的元素可以是键值对/bool/string/int/float类型:
# 数组
Arrag01:
-“小明”
-“李华”
-”大强“
除此之外,还可以使用如下格式声明一个数组:
Array03: &Array03
["小明","李华","大强"]
数组中,为了表示等级关系,必须要使用TAB键!如下错误示例:
ArrayOfKeyValue02: &ArrayOfKeyValue02
-
KeyValueBool: false #bool
-
KeyValueStr: "string02" #string
-
KeyValueFloat: 1.1 #float
错误原因就是没使用tab键显示出等级关系!
# 键值对数组
ArrayOfKeyValue01: &ArrayOfKeyValue01
-
KeyValueBool: true #bool
-
KeyValueStr: "string01" #string
-
KeyValueFloat: 1.05 #float
# 键值对数组
ArrayOfKeyValue01: &ArrayOfKeyValue01
-
KeyValueBool: true #bool
-
KeyValueStr: "string01" #string
-
KeyValueFloat: 1.05 #float
注意:“-”代表着维度,上述一维数组中每个元素都被放置在一个“-”之下。
数组引用的应用如下所示:
# 键值对数组
ArrayOfKeyValue01: &ArrayOfKeyValue01
-
KeyValueBool: true #bool
-
KeyValueStr: "string01" #string
-
KeyValueFloat: 1.05 #float
ArrayOfKeyValue02: &ArrayOfKeyValue02
-
KeyValueBool: false #bool
-
KeyValueStr: "string02" #string
-
KeyValueFloat: 1.1 #float
# 高维数组
MuliArray:
- *ArrayOfKeyValue01
- *ArrayOfKeyValue02
与C语言中引用符合&和解引用符号*所表示的含义一样,*arrag_name表示“数组arrag_name下的所有元素”。
ArrayOfKeyValue01:
- - KeyValueBool: true
- KeyValueStr: string01
- KeyValueFloat: 1.05
- - KeyValueBool: false
- KeyValueStr: string02
- KeyValueFloat: 1.1
高维数组结构如下图所示:
其实,我们也可以使用引用的方式构建一个高维数组:
# 键值对数组
ArrayOfKeyValue01: &ArrayOfKeyValue01
-
KeyValueBool: true #bool
-
KeyValueStr: "string01" #string
-
KeyValueFloat: 1.05 #float
ArrayOfKeyValue02: &ArrayOfKeyValue02
-
KeyValueBool: false #bool
-
KeyValueStr: "string02" #string
-
KeyValueFloat: 1.1 #float
# 高维数组
MuliArray:
- *ArrayOfKeyValue01
- *ArrayOfKeyValue02
除此之外,我们还可以使用如下方式声明多维数组:
MuliArray01:
[*ArrayOfKeyValue01,*ArrayOfKeyValue02]
# 命名空间/变量前加前缀
namespace01: &namespace01
var1: 'a'
var2: 1.2
其实使用命名空间组织不同类型变量的方法更像我们C语言中的结构体类型,在使用命名空间之后,变量都会有一个前缀:
Base_name |
命名空间 |
name |
Var1 |
Namespace01 |
Namespace01/var1 |
Var2 |
Namespace01 |
Namespace01/var2 |
# 数组
Arrag01: &Arrag01
-“小明”
-“李华”
-”大强“
# 命名空间/变量前加前缀
namespace01: &namespace01
var1: 'a'
var2: *Arrag01
在对Arrag01使用*解引用之后,将Arrag01数组中的数值全部赋值给namespace01命名空间下的var2变量,即相当于:
# 命名空间/变量前加前缀
namespace01: &namespace01
var1: 'a'
var2:
-“小明”
-“李华”
-”大强“
上面是将一个变量的内容导入另一个变量,现在,我们将一个变量的内容导入命名空间中,但是切记“导入的内容必须都由变量组成”:
# 命名空间/变量前加前缀
namespace01: &namespace01
var1: 'a'
var2: *Arrag01
# 键值对数组
ArrayOfKeyValue01: &ArrayOfKeyValue01
-
KeyValueBool: true #bool
-
KeyValueStr: "string01" #string
-
KeyValueFloat: 1.05 #float
# 引用
Arrag02:
<<: *ArrayOfKeyValue01
<<: *namespace01
如何理解“导入的内容必须都由变量组成“呢?我们打个比方,看看下述示例可以运行吗?
# 数组
Arrag01: &Arrag01
-“小明”
-“李华”
-”大强“
# 引用
Arrag02:
<<: *Arrag01
貌似可行,我们再将其展开来看看:
# 引用
Arrag02:
“小明”
“李华”
”大强“
这样对吗?显然不对,Arrag02命名空间下根本没有一个变量(yaml中的变量都以键值对的形式存在)!那我们在实施如下示例:
# 键值对
KeyValueBool: &KeyValueBool
true #bool
# 引用
Arrag02:
<<: *KeyValueBool
也会报错,因为当我们展开我们会发现:
# 引用
Arrag02:
true #bool
Arrag02命名空间下也没有一个完整的变量。因此,我们得出以下结论:
在使用<<: *refer_name向命名空间中导入变量时,refer_name不可以是键值对的引用,同时也不可以是普通数组的引用,一般refer_name都是多维数组/命名空间的引用。
在一个文件中,可同时包含多个文件,并用 "---"分隔。我们一般将这样的yaml文件与ROS命令行命令rostopic pub topic_name topic_type "args1,args2..."配合使用,yaml文件格式如下所示:
由于一个yaml文件可以包含许多个yaml文件,因此上述yaml文件中虽然参数重名但是仍可编译通过的原因!
1. yaml文件作为参数流存放文件:
详细的Rostopic命令系列(包括消息发布等实例操作)_超级霸霸强的博客-CSDN博客_rostopichttps://blog.csdn.net/weixin_45590473/article/details/1213644212. 简书中关于yaml文件格式的详解:
yml文件详解 - 简书 (jianshu.com)https://www.jianshu.com/p/a65e692edd5a3. yaml文件官网说明:
YAML Ain’t Markup Language (YAML™) revision 1.2.2https://yaml.org/spec/1.2.2/#332-resolved-tags
ROS/YAMLCommandLine - ROS Wikihttp://wiki.ros.org/ROS/YAMLCommandLine