ROS中yaml文件编写格式

2023-05-16

目录

键值对

键值对书写格式

键值对的引用

强制类型转换

字符串

时间与日期

已知偏移时区和当地时间

已知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  

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

其实,我们也可以使用引用的方式构建一个高维数组:

# 键值对数组  
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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS中yaml文件编写格式 的相关文章

随机推荐

  • 作者:孙大为,男,博士后,中国地质大学(北京)信息工程学院讲师。

    孙大为 xff0c 男 xff0c 博士后 xff0c 中国地质大学 xff08 北京 xff09 信息工程学院讲师 xff0c 目前主要从事大数据计算 云计算 可信计算等方面的研究工作
  • 人工智能在医学影像中的研究与应用

    人工智能在医学影像中的研究与应用 韩冬 李其花 蔡巍 夏雨薇 宁佳 黄峰 沈阳东软医疗系统有限公司 xff0c 辽宁 沈阳 110167 慧影医疗科技 xff08 北京 xff09 有限公司 xff0c 北京 100192 东软集团股份有限
  • 联邦学习攻击与防御综述

    联邦学习攻击与防御综述 吴建汉1 2 司世景1 王健宗1 肖京1 1 平安科技 xff08 深圳 xff09 有限公司 xff0c 广东 深圳 518063 2 中国科学技术大学 xff0c 安徽 合肥 230026 摘要 xff1a 随着
  • 如何将数组转换为JSON数据?

    如何将数组转换为JSON数据 xff1f 下面本篇就来给大家介绍一下将数组转换为JSON对象的方法 xff0c 希望对大家有所帮助 方法一 xff1a 使用Object assign Object assign 方法将枚举的所有属性的值从源
  • ROS:使用usb_cam调用UVC摄像头遇到的坑

    目录 坑一 xff1a 装包后直接启用 xff0c 图像是花屏 坑二 xff1a deprecated pixel format used make sure you did set range correctly 坑一 xff1a 装包后
  • 使用canal监控数据库

    1 canal简介 1 canal可以用来监控数据库数据的变化 xff0c 从而获得新增数据 xff0c 或者修改的数据 2 canal是应阿里巴巴存在杭州和美国的双机房部署 xff0c 存在跨机房同步的业务需求而提出的 3 阿里系公司开始
  • 坐标系

    坐标系 右手坐标系 xff1a 把右手拇指食指中指伸直并正交 xff0c 拇指X xff0c 食指Y xff0c 中指Z 一般无特殊说明 xff0c 都是右手坐标系 右手坐标系的旋转正方向 xff1a 从轴的正方向看向原点 xff0c 逆时
  • PID闭环控制算法解析(最透彻)

    PID闭环控制算法解析 PID简介 P Proportion xff08 比例 xff09 就是输入偏差乘以一个常数 I Integral xff08 积分 xff09 就是对输入偏差进行积分运算 D Derivative xff08 微分
  • 详细的Rostopic命令系列(包括消息发布等实例操作)

    目录 Rostopic命令系列 Rostopic list系列指令 Rostopic list Rostopic list v Rostopic list namespace Rostopic list b bagFile bag Rost
  • CMakelist.txt文件中常用部分最通俗易懂的解析(示例+解析)

    链接库是什么 xff1f 计算机中 xff0c 有些文件专门用于存储可以重复使用的代码块 xff0c 例如功能实用的函数或者类 xff0c 我们通常将它们称为库文件 xff0c 简称 库 xff08 Library xff09 myMath
  • ROS中库的创建与配置(代码示例+解析):自定义类类型在ROS中的使用

    前言 C 43 43 代码风格 编写C 43 43 代码时 xff0c 我们常常将 类 结构体的声明 定义和使用 相互剥离 xff0c 在ROS项目文件中我们也可以这样做 在ROS项目文件中声明 定义 使用自定义数据类型时 xff0c 我们
  • 详解ROS中动态参数调整与话题通信配合使用(原理+代码+示例)

    ROS中动态调整参数的原理 我们在现实中有个需求 xff1a 我们希望可以改变参数服务器中的参数用于调试机器人 xff0c 而且我们不希望每改一遍参数之后必须重启一次相关节点才可以生效 xff0c 这样耗时耗力太麻烦 我们期望的是 xff1
  • ROS中节点、话题、参数重命名以及全局、相对、私有命名空间(示例+代码)

    ROS中的命名空间 我们首先要了解一下路径的各个部分所代表的含义 xff1a 以话题为例 xff0c 三级路径 xff1a 以节点为例 xff0c 共有二级路径 xff1a 以参数为例 xff0c 共有三级路径 xff1a ROS中的命名空
  • 坐标变换最通俗易懂的解释(推到+图解)

    目录 坐标变换详解 坐标变换的作用 实现坐标变换所需的数据 位姿 坐标变换中旋转的实质 坐标变换中平移的实质 如何计算坐标系B各坐标轴在坐标系A上的投影 xff1f xff08 多坐标变换 xff09 如何实现坐标变换 xff1f 坐标变换
  • ubuntu最好用的划词翻译词典:有道词典和GoldenDict

    目录 1 安装有到词典 2 安装GoldenDict 3 GoldenDict的一些简单配置以及相关bug修改 用惯了Windows下的有道词典 xff0c 其划词翻译功能用起来令人极其舒适 xff5e Ubuntu系统中也有有道词典以及一
  • 彻底搞懂“旋转矩阵/欧拉角/四元数”,让你体会三维旋转之美

    目录 旋转矩阵 坐标变换的作用 实现坐标变换所需的数据 位姿变换 坐标变换中旋转的实质 坐标变换中平移的实质 如何计算坐标系B各坐标轴在坐标系A上的投影 xff1f xff08 多坐标变换 xff09 如何实现坐标变换 xff1f 欧拉角
  • ROS中tf2命令行调试工具详解(解析+代码示例+执行逻辑)

    目录 监控 坐标信息的发出者 的运行状态 坐标系转换数据的实时显示 创建坐标系相对位置关系的发布者 PDF格式的坐标信息生成工具 异常分析指令 项目结构 对文件进行分析 对launch文件进行检查 ROS中常用的Linux指令 Tf2命令行
  • 8086CPU中14个寄存器的详解

    CPU中的寄存器 在执行单元EU和总线接口单元BIU中一共有14个寄存器 xff0c 其中通用寄存器8个 标志寄存器FLAGS一个 控制寄存器5个 xff0c 其中指令队列虽然不是寄存器但也需要重点说明一下 xff1a 1 指令队列的工作原
  • 8086中的操作数

    指令中的操作数 指令的基本形式为 操作码 目标操作数 源操作数 xff0c 其中操作码代表了如何对数据进行操作 xff0c 目标操作数和源操作数分别代表了数据计算之后的归宿和数据的获取处 操作数本身是个数据 xff0c 但是数据的性质 xf
  • ROS中yaml文件编写格式

    目录 键值对 键值对书写格式 键值对的引用 强制类型转换 字符串 时间与日期 已知偏移时区和当地时间 已知UTC世界时间 数组 普通数组 键值对数组 数组的引用 多维数组 命名空间 命名空间下普通变量赋值方式 使用引用给命名空间下的变量赋值