7_ROS命令行中的YAML

本文主要介绍YAML文件相关语法知识。至于为什么选择deepin而不是ROS通用的ubuntu,也仅仅是为了支持国产系统。鉴于本人水平有限,如哪位攻城狮网友发现本文存在的问题,烦请留言指正,谢谢!

rostopic,rosservice等命令在命令行中使用了YAML标记语言。之所以选择YAML,是因为大多数情况下,它提供一种非常简单,几乎不用标记的方案来解决输入有类型的参数。YAML概述

YAML中消息的表示

ROS消息可以表示为YAML列表或者字典。

  • 列表表示:参数需要按顺序填充,并且必须与消息字段一一对齐。
  • 字典表示:假定字典中的key映射到了消息中的同名字段,未分配的字段会赋予默认值
    列表和字典的二义性:默认情况下你在终端输入的命令行参数表示为列表,例如
rosservice call /foo msg/Type 1 2

上述输入会创建列表[1,2].然后该列表用于填充消息。
命令行字典输入:

rosservice call /foo msg/Type '{a: 1, b: 2}'

上述输入会创建一个字典{a:1,b:2}.这使您能够更容易的填充外部消息字段。

多行表示

假定你已经运行了roscore,并回显了指定topic.接下来可使用rostopic pub ,发送消息。

rostopic echo /newTopic
# 测试pub消息
rostopic pub /newTopic std_msgs/String "test"
``
std_msgs/String是一个预定义的消息类.如果你想在命令中创建一个跨行的消息,上面的方法是行不通的,你的消息必须使用---结尾,并将其嵌入到列表或者字典中去。例如:
```shell
rostopic pub /newTopic std_msgs/String 
['test']
---

头和时间戳

有两个特殊的key可用帮助发送ROS Heaer和时间。

  • auto:创建一个新Heaer,将时间戳设置为当前时间,帧ID设置为空
  • now:创建一个初始化为当前时间的时间
    例如:
rostopic pub my_topic my_msgs/StampedMsg '{header:auto}'
rostopic pub my_topic my_msgs/StampedMsg '{header:{stamp:now}}'

YAML语法+命令行

在大多数情况下YAML是简单的,但也存在一些问题,特别是对于Bash来说。单引号和双引号在Bash中有自定的定义,因此将它们与YAML交叉使用可能就很困难。

类型覆盖

YAML使用tags来覆盖类型,其中YAML语法可能是不明确的。常见的tags有!!str,!!int,!!float,!!map等。大多数情况你只需要知道!!str即可。YAML的tags是比较困难的,因为!在Bash中也有其自定的含义,所以必须使用单引号。

命令行和Strings

使用空引号(''或者"")将提供一个空字符串(YAML中空字符串表示NULL)。!!str的tag在YAML中允许你将类型重写为字符串。当你在处理bool值的时候可能需要这个。YAML的tags是比较困难的,因为!在Bash中也有其自定的含义,所以必须使用单引号。例如

rosservice call /my_service '!!str true'

上面的例子将使用字符串’true’来调用/my_service

命令行和消息(字典)

在命令中消息可以使用YAML字典来表示,YAML使用花括号来指定字典。

roservice call /myservice "{}"
# 消息
roservice call /myservice "{position:{x:1.,y:2.}}"
# Bash多行语法
roservice call /myservice "a:1
b:2"

对于更复杂的例子,可以看一下geometry_msg/PointStamped,它是一个包含两个嵌入式消息的消息

Header header
  uint32 seq
  time stamp
  string frame_id
Point point
  float64 x
  float64 y
  float64 z

有以下方式去发布消息:

# 方式1
rostopic pub pt geometry_msgs/PointStamped '{stamp:now,frame_id:base_link}' '[1.0,2.0,3.0]'
# 方式2
rostopic pub pt geometry_msgs/PointStamped '[0,now,base_link]' '[1.0,2.0,3.0]'
# 方式3
rostopic pub pt geometry_msgs/PointStamped '{header:{stamp:now,frame_id:base_link},point:[1.0,2.0,3.0]}'
# 方式4
rostopic pub pt geometry_msgs/PointStamped '{header: {stamp: now, frame_id: base_link}, point: {x: 1.0, y: 2.0, z: 3.0}}'

命令行和负数

负数可能混淆命令行选项解析,因此需要传递一个额外的–来表示命令行解析终止。例如

rosservice call /add_two_ints -- -1 -2

我们也可以将负数作为参数

你可能感兴趣的:(ROS1-基础学习,YAML,ROS,deepin)