标签:string bool float yaml 键值 数组 KeyValueBool 格式 ROS
键值对
键值对书写格式
键值对中,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
数组
普通数组
数组中的元素可以是键值对/bool/string/int/float类型:
数组中,为了表示等级关系,必须要使用TAB键!如下错误示例:
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
命名空间
命名空间下普通变量赋值方式
# 命名空间/变量前加前缀
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都是多维数组/命名空间的引用。
标签:string,bool,float,yaml,键值,数组,KeyValueBool,格式,ROS 来源: https://blog.csdn.net/weixin_45590473/article/details/123250193
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。