本文主要介绍YAML文件相关语法知识。至于为什么选择deepin而不是ROS通用的ubuntu,也仅仅是为了支持国产系统。鉴于本人水平有限,如哪位攻城狮网友发现本文存在的问题,烦请留言指正,谢谢!
rostopic,rosservice等命令在命令行中使用了YAML标记语言。之所以选择YAML,是因为大多数情况下,它提供一种非常简单,几乎不用标记的方案来解决输入有类型的参数。YAML概述
ROS消息可以表示为YAML列表或者字典。
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和时间。
rostopic pub my_topic my_msgs/StampedMsg '{header:auto}'
rostopic pub my_topic my_msgs/StampedMsg '{header:{stamp:now}}'
在大多数情况下YAML是简单的,但也存在一些问题,特别是对于Bash来说。单引号和双引号在Bash中有自定的定义,因此将它们与YAML交叉使用可能就很困难。
YAML使用tags来覆盖类型,其中YAML语法可能是不明确的。常见的tags有!!str,!!int,!!float,!!map等。大多数情况你只需要知道!!str即可。YAML的tags是比较困难的,因为!在Bash中也有其自定的含义,所以必须使用单引号。
使用空引号(''或者"")将提供一个空字符串(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
我们也可以将负数作为参数