ROS中yaml文件编写格式

目录

键值对

键值对书写格式

键值对的引用

强制类型转换

字符串

时间与日期

已知偏移时区和当地时间

已知UTC世界时间

数组

普通数组

键值对数组

数组的引用

多维数组

命名空间

命名空间下普通变量赋值方式

使用引用给命名空间下的变量赋值

使用引用向命名空间下导入变量


 Yaml文件的结构:

  1. 键值对 – YAML 文件中的基本条目类型是键值对。键值对的格式是键和冒号,之后是空格,然后是值。
  2. 数组/列表 – 列表会在列表名称下列出一些项目。列表的元素以 - 开头。可以有 n 个列表,但是,数组中各个元素的缩进非常重要。
  3. 字典/地图 – 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  

字符串

保存新行 (Newlines preserved)引用

# 字符串  
String1:  
  top  
  top  
# 字符串  
String2: |  
  top  
  top  

结果为:top\n top

折叠新行 (Newlines folded)

上述两种形式都表示“不省略\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

已知UTC世界时间

# 日期与时间  
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  

高维数组结构如下图所示:

ROS中yaml文件编写格式_第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文件格式如下所示:

ROS中yaml文件编写格式_第2张图片

 由于一个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

命令行中输入参数的格式(以yaml格式输入) 

ROS/YAMLCommandLine - ROS Wikiicon-default.png?t=M1L8http://wiki.ros.org/ROS/YAMLCommandLine

你可能感兴趣的:(ROS,ROS,yaml,xml)