GNU Radio3.8:编辑yaml文件的方法

GNU Radio 学习使用 OOT 系列教程:

GNU Radio3.8创建OOT的详细过程(基础/C++)

GNU Radio3.8创建OOT的详细过程(进阶/C++)

GNU Radio3.8创建OOT的详细过程(python)

GNU Radio自定义模块:Embedded Python Block的使用

GNU Radio3.8:编辑yaml文件的方法

GNU Radio3.8:创建自定义的QPSK块(C++)

----------------------------------------------------------------------------------------

目录

一、为什么要用YAML文件

二、YAML文件的写法

1、id

2、label

3、category

4、templates

5、Parameters

6、inputs 以及 outputs

7、Documentation

 8、Asserts


一、为什么要用YAML文件

从GR的3.8 版本开始,GNU Radio Companion 的文件格式变为 YAML 文件而不是 XML 文件,简单那点说就是因为 v3.8 之前的版本不支持python3。.yml 文件提供了 GRC 中显示的 OOT 模块和源代码之间的用户界面。此外,YAML 文件定义了一个接口来传递特定于模块的参数,因此,要访问 GRC 内的模块,手动修改 .yml 文件很重要。YAML 相比 XML 文件最显著的变化之一是没有 XML 的尖括号,取而代之的是 YAML 的由冒号分隔的键值对,另外一个是文件的命名方式。而后者对于 GRC 识别文件很重要。即,block描述文件的“.xml”后缀已变为“.block.yml”,block树文件中的下划线“ ”已替换为点" "(例如,“qtgui_tree.xml”变成“qtgui.tree.yml”)。

二、YAML文件的写法

首先,在创建自定义module的过程中,yaml文件的框架已由 gr_modtool 工具自动生成,我们一般并不需要从头开始编写yaml文件,而是在生成好的框架的基础上进行修改。以教程 GNU Radio:Out of Tree(OOT)创建自定义的 block 中的例子所生成的 yaml 框架为例进行说明。原始框架如下,大致的使用方法自带的注释中已经标明,下面将逐个介绍有关关键字的详细用法。

id: mymod_square_ff
label: square_ff
category: '[mymod]'

templates:
  imports: import mymod
  make: mymod.square_ff()

#  Make one 'parameters' list entry for every parameter you want settable from the GUI.
#     Keys include:
#     * id (makes the value accessible as \$keyname, e.g. in the make entry)
#     * label (label shown in the GUI)
#     * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)
parameters:
- id: ...
  label: ...
  dtype: ...
- id: ...
  label: ...
  dtype: ...

#  Make one 'inputs' list entry per input and one 'outputs' list entry per output.
#  Keys include:
#      * label (an identifier for the GUI)
#      * domain (optional - stream or message. Default is stream)
#      * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)
#      * vlen (optional - data stream vector length. Default is 1)
#      * optional (optional - set to 1 for optional inputs. Default is 0)
inputs:
- label: ...
  domain: ...
  dtype: ...
  vlen: ...
  optional: ...

outputs:
- label: ...
  domain: ...
  dtype: ...
  vlen: ...
  optional: ...

#  'file_format' specifies the version of the GRC yml format used in the file
#  and should usually not be changed.
file_format: 1

1、id

id: mymod_square_ff

id 对于每个 block 都是唯一的,用于辨别这个 block。在 GRC 中就是每个 block 的 UI 界面上显示的“Id”,可视化效果如下:

2、label

label: square_ff

label只是块的一种注释,便于使用者理解,并且在 GRC 中是可见的。它不会出现在生成的代码中,可视化效果如下:

3、category

category: '[mymod]'

类别名称即 module(注意与 block 的区别) 的名字,类别名称必须括在方括号中才能起作用。可视化效果如下,图中 square1_ff、square2_ff、square3_ff 相应的 category 属性都应该为 '[Mymod]'

4、templates

templates:
  imports: import mymod
  make: mymod.square_ff()

模板描述了 GRC 在生成流程图时创建的 python 代码。其更完整的描述如下:

templates:
    imports: |-
        from gnuradio import blocks
        import pmt
    make: blocks.message_strobe_random(${msg}, ${dist}, ${mean}, ${std})
    callbacks:
    - set_msg(${msg})
    - set_dist(${dist})

这部分包括 importsmake / initialization 以及 callbacks 。我们定义的 block 可能使用了 GNU Radio 自带的模块或需要导入的其他模块。导入这些模块的方法为 imports,这里建立的 module 名为 mymod。make 用于初始化代码,通常可以传入一些用于初始化的参数,这里没用到。square_ff 是 mymod 模块中的一个 block。一些较为复杂的 block 可以用 “%” 符号进行初始化,表示使用了 YAML 指令,这个指令在 imports 和 make 中都可以用。下面的例子可能会对理解有所帮助:

id: rational_resampler_xxx
(...)
    make: |-
        filter.rational_resampler_${type}(
            interpolation=${interp},
            decimation=${decim},
        % if taps:
            taps=${taps},
        % else:
            taps=None,
        % endif

另外“|-”符号在YAML语法中表示连字符,表示忽略行尾的换行符。

5、Parameters

parameters:
- id: parametername_replace_me
  label: FIX ME:
  dtype: string
  value: You need to fill in your grc/mymodule_square_ff.block.yaml
#- id: ...
#  label: ...
#  dtype: ...

Parameters描述了向用户显示的参数,可以定义多个,在 block 的 UI 中向用户显示为 General 界面的参数,以 GR 中自带的 block:Add Const为例,其 yaml 文件该部分的源码 如下:

。。。。。。
parameters:
-   id: type
    label: IO Type
    dtype: enum
    options: [complex, float, int, short, byte]
    option_attributes:
        vconst_type: [complex_vector, real_vector, int_vector, int_vector, int_vector]
        const_type:  [complex, real, int, int, int]
        fcn: [cc, ff, ii, ss, bb]
    hide: part
-   id: const
    label: Constant
    dtype: ${ type.const_type if vlen == 1 else type.vconst_type }
    default: '0'
-   id: vlen
    label: Vector Length
    dtype: int
    default: '1'
    hide: ${ 'part' if vlen == 1 else 'none' }

。。。。。。

对比其在 GRC 中的显示效果:

这里使用到的关键字解释如下:

id:参数的唯一名称,不会向用户显示,但可用于引用此文件中的参数:${<id>}

label:在GUI中显示给用户的可读名称,如上图中的红框部分。

dtype:参数的数据类型,可以有以下值:

  • 数字(numbers):raw, complex, real, float, int, hex, bool
  • 数字向量(vectors of numbers):complex_vector, real_vector, float_vector, int_vector
  • 字符串(string):string, file_open, file_save, _multiline _mutiline_python_external
  • 其他特殊类型:gui_hint, import, id, stream_id, name and enum

value:可以在GRC中设置(使用GUI界面)或者在该yaml文件中设置。

6、inputs 以及 outputs

#  Make one 'inputs' list entry per input and one 'outputs' list entry per output.
#  Keys include:
#      * label (an identifier for the GUI)
#      * domain (optional - stream or message. Default is stream)
#      * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)
#      * vlen (optional - data stream vector length. Default is 1)
#      * optional (optional - set to 1 for optional inputs. Default is 0)
inputs:
#- label: ...
#  domain: ...
#  dtype: ...
#  vlen: ...
#  optional: ...

outputs:
#- label: ...
#  domain: ...
#  dtype: ...
#  vlen: ...
#  optional: ...

输入输出端口的设置。由于 inputs 与 outputs 的关键字相同,这里只进行inputs的关键字的解释:

该部分一般的填写范式为:

inputs:
-   domain: stream
    dtype: ${ type.t }
    multiplicity: ${ (0 if (type == 'msg_complex' or type == 'msg_float') else nconnections) }
    optional: true
-   domain: message
    id: freq
    optional: true
    hide: ${ showports }

label:在GUI中显示的输入输出端口的标识符,当设置为 label: inlabel: out 时,直观的显示如下:

domain:可选参数,表示端口接收的是 stream 还是 message,默认为 stream 。当设置为 stream 时,端口需要指定 stream 的数据类型,通常被制定为一个参数,结合在 parameter 中介绍的例子即可理解 ${ type.t } 的含义(例子中第一个参数的 id 为type)

dtype:输入端口数据类型,只在 domain 为 stream 时设置。可选 int, float, complex, byte, short, xxx_vector

vlen:可选参数,数据流向量的长度,默认是1

optional:可选参数,表明该端口是否必须有连接,如果没有连接“非可选”(即必须有连接)端口,则 GRC 不会生成流程图。等于1时为 “可选” 输入,等于0时为 “非可选” 输入,默认为0。

另外还有一个参数这里没显示出来:multiplicity 。该参数表示想要多少这个端口的“副本”,即有几个同样功能的端口,可以设置为0,一般都是1。

7、Documentation

documentation 没有在 gr_modtool 自动生成的 yaml 框架中出现,但还是介绍一下,其范式如下:

documentation: |-
    This is a convenience wrapper for calling firdes.root_raised_cosine(...).

理解起来很简单,其实 documentation 中包含的是与这个 block 有关的信息,在 GRC 中的显示就是 Documentation 标签栏中的内容,如:

 8、Asserts

assert 即断言,可用来检查参数的有效性,表达式需要为 true ,否则 GRC 将不会生成流图。断言是 Python 语句,正确时应将 eval() 变为“True”,并用 Mako 模板指示符 '${ }' 包装,例子如下:

asserts:
- ${ vlen > 0 }

(参考链接:YAML GRC - GNU RadioOutOfTreeModules - GNU Radio

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球被支点撬走啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值