• 7_ROS命令行中的YAML


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

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

    YAML中消息的表示

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

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

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

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

    上述输入会创建一个字典{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']
    ---
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    头和时间戳

    有两个特殊的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}}'
    
    
    • 1
    • 2
    • 3

    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'
    
    • 1

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

    命令行和消息(字典)

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

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

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

    Header header
      uint32 seq
      time stamp
      string frame_id
    Point point
      float64 x
      float64 y
      float64 z
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    有以下方式去发布消息:

    # 方式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}}'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    命令行和负数

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

    rosservice call /add_two_ints -- -1 -2
    
    • 1

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

  • 相关阅读:
    Redis实现分布式锁源码分析
    Java学习路线图,全套Java基础视频教程
    Python每日一练(牛客新题库)——第22天:内置函数
    Web自动化测试进阶:网页中难点之等待机制 —— 强制等待,隐式等待
    MySQL日期和字符相互转换方法
    修复所有 bug 并不能解决所有问题
    LintCode 163 · Unique Binary Search Trees (DP 或 Catalan数)
    数字IC手撕代码-XX公司笔试真题(串并转换控制)
    矩阵论笔记1:线性空间和线性变换
    MyBatis 配置 typeAliases 标签
  • 原文地址:https://blog.csdn.net/no_pao_spite/article/details/126924828