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

2023-05-16

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 Radio、OutOfTreeModules - GNU Radio)

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

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

  • 在 YAML 中使用 R 代码或 Windows 用户变量(“%userprofile%”)?

    在我的 yaml 调用中我有 title r paste0 Test Done format Sys Date B Y output word document fig caption yes fig height 4 fig width
  • Autotools 库和目标文件输出控制

    我的目标是将所有目标文件构建在 objs 目录中而不是 Makefile 的根目录中 并将二进制文件 和库 复制到项目的bin 目录 但我一直无法找到任何资源来解释如何做到这一点 我该怎么做呢 这是我的configure ac和src Ma
  • 如何转义parameters.yml symfony2中的“%”

    我想逃脱一个角色 在文件 parameters yml中 因为我的密码以 database driver3 pdo sqlsrv database host3 192 168 10 10 database port3 1455 databa
  • Docker:PhpMyAdmin 的上传限制为 2048KiB

    我有一个 docker compose yml 如下所示 webserver build docker php ports 80 80 links mysql volumes from app mysql image mysql 5 7 e
  • 是 .yaml 还是 .yml?

    根据yaml org http www yaml org faq html 官方文件扩展名是 yaml Quote YAML 文件有官方扩展名吗 请尽可能使用 yaml 然而 互联网上对于使用哪个扩展似乎存在分歧 如果你抬头看网上的例子 h
  • 使用 YamlDotNet 序列化动态模型时更改用于所有多行字符串的标量样式

    我使用以下代码片段将项目的动态模型序列化为字符串 最终导出到 YAML 文件 dynamic exportModel exportModelConvertor ToDynamicModel project var serializerBui
  • Linux/ 将目录作为文件打开

    我一直在阅读 Brian Kernighan 和 Dennis Ritchie C 编程语言 第 8 6 章是关于 UNIX 操作系统下的目录列表的 他们说一切 甚至目录都是文件 这意味着我应该能够将目录作为文件打开 我已经尝试使用 std
  • 如何从纯 python 创建 yaml 文件?

    示例来自将 YAML 与 Python 结合使用 http mikkel elmholdt dk p 4 原始 YAML 文件包含此内容 tree format treeroot branch1 name Node 1 branch1 1
  • 使用Jackson写yaml?

    我正在使用 Jackson 来读取和修改 yaml 文件 效果很好 不过 我找不到编写 yaml 所需的魔法 ObjectMapper mapper new ObjectMapper new YAMLFactory ObjectNode r
  • 读取 yaml 文件时出现 UnrecognizedPropertyException

    在使用 dropwizard 时 我的 dropwizard 服务读取 config yml 文件 public void run throws Exception this run new String server src main r
  • 如何在 YAML 中使用 IF ELSE 和变量?

    我正在使用 Ansible Tower 的 YAML 文件 其中包含以下信息 name Package Deployment block name Update package package yum update cache True u
  • 无法在管道中多次检出同一存储库

    我在多个环境中拥有自托管代理 我试图在这些环境上运行相同的构建 部署进程 我希望能够将相同的代码从单个存储库同时部署到多个系统 因此 我创建了一个 开销 管道和几个 流程 管道模板 一切似乎都进展顺利 除了当我尝试在同一管道执行中两次执行同
  • 安西布尔。覆盖单个字典键[重复]

    这个问题在这里已经有答案了 我使用 ansible 来管理生产和 vagrant box 的配置 我有带有默认值的文件 组变量 全部 env prod wwwuser www data db root pwd root pwd pdo dr
  • 灵活地将新数据附加到 yaml 文件

    我有不同的 yaml 文件 它们可能具有不同的嵌套结构 文件1 yaml test3 service1 name1 somedata name2 somedata 文件2 yaml test1 app1 app2 somedata app7
  • 在 GDB 中显示结构体值

    在 GDB 中 给定一个指向结构体的变量 print将显示原始指针值并x将显示指向的原始字节 有什么方法可以显示指向该结构的数据 即字段及其值的列表 print variable 如果这样做 它将在 GDB 中显示该变量的值 您还可以选择显
  • Togglz 我的 SpringBoot 的 Yml/Yaml 配置不起作用

    尝试使用 Togglz 创建功能切换 在我的应用程序中进行了以下配置 代码 bootstrap yml togglz enabled true features FEATURE ONE true 功能枚举类 public enum AppF
  • YAML 中的多行键

    是否可以有这样的多线路键 mykey gt key one keytwo val 其中 keyone 被视为一把钥匙 我想解析 yaml 来产生 mykey keyone keytwo val 您可以在 YAML 中拥有多行密钥 但不完全按
  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • 无法在 R 中安装插入符号包(在我的 Linux 机器中)

    我在尝试在 R 中安装插入符号包时遇到以下错误 g error tmp Rtmp2Tos7n R INSTALL2e6e30153a74 nloptr nlopt 2 4 2 lib libnlopt cxx a No such file
  • Java中对象的序列化需要什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 谁能告诉我Java中对象序列化的需求是什么 并给我一个示例场景来解释需求 我已经了解什么是序列化 我只是想了解何时使用它以及如何使用它

随机推荐

  • C# CustomMessageBox.Show() 输出多个变量调试

    Mission Planner 地面站调试中会遇到输出多个变量问题 xff0c 这里采用CustomMessageBox Show来输出调试多个变量 xff0c 用到string Format方法 span class token clas
  • MapReduce实验——学生总成绩报表,学生平均成绩

    学生总成绩报表 Map类 span class token keyword package span span class token class name StudentScore 06 span span class token pun
  • 【Docker操作必看,原来这才是正确打开Docker的新方式】

    前言 一 Docker操作镜像 首先镜像名称一般分为两个部分 xff1a repository tag xff0c 前者是镜像名 xff0c 后者是版本号 在没有指定tag的情况下 xff0c 默认是latest 代表的是最新版本 1 拉取
  • 第五章 FreeRTOS 任务基础知识

    5 1 什么是多任务系统 在使用 51 AVR STM32 单片机裸机 未使用系统 的时候一般都是在main 函数里面用 while 1 做一个大循环来完成所有的处理 xff0c 即应用程序是一个无限的循环 xff0c 循环中调用相应的函数
  • C语言for循环详解

    for 循环的使用更加灵活 xff0c 在日常的程序开发过程中我们会使用的更多一些 使用 while 循环来计算1加到100的值 xff0c 代码如下 xff1a include span class token generics func
  • Python批量下载sci-hub文献

    coding utf 8 import requests from bs4 import BeautifulSoup import os re path 61 34 Downloaded 34 if os path exists path
  • Ubuntu16.04 安装NS3.36.1及可视化模块

    如果不是必要 xff0c 尽量不要在Ubuntu 16 04上装3 36 1这个版本 xff0c 因为比较麻烦 NS3 36 1的新特性 安装依赖 一条一条执行 xff01 xff01 xff01 ns3 36需要用的python3 xff
  • ES6模块化及ES7新增特新性

    一 babel ES6代码转换为ES5的代码 1 初始化项目 npm init npm init y 不需要配置 xff0c 直接跳过 2 安装转码工具 cnpm install g babel cli cnpm install save
  • GNU Radio中的消息传递机制(Message Passing)

    目录 0 首先看下 GR 中一些常用术语的官方解释 1 定义理解 2 消息传递端口API 3 消息处理函数 4 通过流程图连接消息 5 从外部源发布数据 6 使用消息传送命令 7 一个消息传输的例子 0 首先看下 GR 中一些常用术语的官方
  • 单片机零基础完整攻略-1

    序 xff1a 学习原因 在网上看到各路大神用一个小小的板子就能玩起来一些很有趣的小项目 xff0c 觉得非常之神奇 为什么一个小小的板子就能做到物联网 xff0c 机器人那么多花里胡哨的功能 xff1f 正好赶上学校开设了这门课 xff0
  • HDF5 header version与HDF5 library不匹配问题的解决

    如图 xff1a 试着安装这个 conda install c conda forge hdf5 61 1 10 5 conda不行用pip 还不行就去这个网站下载 xff0c 上面搜索框直接搜hdf5 xff0c 然后找1 10 5版本的
  • Vscode C++的基础配置文件以及无法产生可编译文件exe的处理方法(undefined reference)

    采用排除法 xff1a 1 是否将工作文件夹添加工作区 xff1f 打开vscode 文件 打开文件夹 文件 将文件夹添加工作区 xff08 或者另存为一个 xff09 xff0c 把工作区文件放到工作文件夹里 如下 xff1a Manag
  • Arduino零基础实践2——串口数据发送

    具体的原理在微机开发中详细介绍了 xff0c 下面直接使用arduino进行数据收发 13条消息 单片机攻略4 中断和串口 r135792uuuu的博客 CSDN博客 void setup Serial begin 9600 void lo
  • px4开发bug记录

    一 仿真问题 1 roslaunch无法启动px4 gazebo的无人机仿真 xff0c 但是make px4 sitl gazbeo可以正常启动 2 make px4 sitl gazbeo启动到一半无法启动 xff0c 显示无法连接ga
  • linux无损扩容

    linux笔记本上空间不够用了 xff0c 重新从windows里划分30个g出来给linux xff0c 记录一下 1 准备u盘 xff0c u盘里面全部清空 xff0c 不能有任何东西 下载一个Ubuntu的桌面文件 xff0c 大概有
  • Linux更新源 source.list 自定义第三方源

    1 官方默认源 打开软件和更新 xff0c 直接图形化操作 但是只能设置一个源 xff0c 对于下载多种多样的包可能不够 xff0c 所以需要自定义多个不同源 2 自定义添加源 源的文件 sources list在 etc apt sour
  • 现在没有可用的软件包 *** ,但是它被其它的软件包引用了 和 E: 无法定位软件包 ***问题解决

    root 64 zhouls virtual machine snort src apt get install bison flex 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 现在没有可用的软件包 fl
  • sdf文件轨范

    sdf文件规范 xff1a a href https www zhihu com org aigraphx posts page 61 3 title 深圳季连AIGRAPHX 知乎 深圳季连AIGRAPHX 知乎 a span style
  • HBase基本操作

    HBase Java API 操作 Tips xff1a 其实每一个操作都可以简化为 xff1a 1 配置并连接数据库 2 编写 Java API 的 HBase 的操作 3 使用权限 执行操作 要对一个Hbase数据库进行操作的话 xff
  • GNU Radio3.8:编辑yaml文件的方法

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程