GNURadio3.9.4创建OOT模块实例

本文详细描述了在GNURadio 3.9环境中,如何创建一个新的模块myDemux,以修改Header/PayloadDemux的功能而不覆盖原始代码。涉及步骤包括创建module、修改C++和yaml文件,以及处理python绑定和bug解决。
部署运行你感兴趣的模型镜像

目录

1、创建自己的block(注意 module 与 block 的区别)

1.1、创建 module 

1.2、在创建的 myDemux 中创建 block 

2、修改相应的代码

2.1、修改 C++ 代码

2.2、修改yaml文件

3、编译安装

4、有关bug的解决


本教程是以实验室实际情况下的经历为背景的记录。主要是记录在修改完某个模块的源码之后,如何创建一个新的模块副本来实现与原来的替换而非覆盖(原始的模块代码并不做修改)。

在实际应用中,我们修改了 gnuradio 的 Header/Payload Demux 模块的源码,但又不想直接覆盖原始代码,因此就需要创建一个名为 my Header/Payload Demux 的自定义模块,在此记录下创建流程以供以后参考。

之前写过如何在 GR3.8 中创建 OOT 模块,其实 GR3.9 中创建 OOT 的方法与 3.8 几乎一样,主要的区别是 GR3.9 中 python 与 C++ 绑定的方式不一样,3.8用的是swing,3.9 用的是 pybind11,但是这都不需要我们考虑,程序会自动进行 python 与 C++ 的绑定。因此整体上没的哈区别。

本过程只简单记录方法,不展开讲。细节可以看流程如下:

1、创建自己的block(注意 module 与 block 的区别)

1.1、创建 module 

新建一个文件夹用来存放编写的模块,注意不要与 gnuradio 同一个文件夹,执行下面的命令,首先创建一个名为 myDemux 的 module。

cd  你的文件夹
gr_modtool newmod myDemux

进入 module 中

cd gr-myDemux/

1.2、在创建的 myDemux 中创建 block 

之后是添加 block,名为 my_header_payload_demux

teama@teamA:~/USRPWorkArea/mymodule/gr-myDemux$ gr_modtool add -t general -l cpp my_header_payload_demux
GNU Radio module name identified: myDemux
Language: C++
Block/code identifier: my_header_payload_demux
Please specify the copyright holder: 
Enter valid argument list, including default arguments: 
Add Python QA code? [Y/n] y
Add C++ QA code? [y/N] n
Adding file 'lib/my_header_payload_demux_impl.h'...
Adding file 'lib/my_header_payload_demux_impl.cc'...
Adding file 'include/myDemux/my_header_payload_demux.h'...
Adding file 'python/bindings/docstrings/my_header_payload_demux_pydoc_template.h'...
Adding file 'python/bindings/my_header_payload_demux_python.cc'...
Adding file 'python/qa_my_header_payload_demux.py'...
Editing python/CMakeLists.txt...
Adding file 'grc/myDemux_my_header_payload_demux.block.yml'...
Editing grc/CMakeLists.txt...

2、修改相应的代码

2.1、修改 C++ 代码

编辑相关文件,建议使用VSCode,不为什么,就是方便点,其他编辑器也行

需要将源码文件中的 

gr-digital / lib / header_payload_demux_impl.cc

gr-digital / lib / header_payload_demux_impl.h

include / gnuradio / digital / header_payload_demux.h

三个文件内容拷贝到创建的 block 的相应的位置,然后修改相应的源码,注意修改一些类名命名空间namespace包含头文件等内容。这里只举其中几个容易忽略的地方进行说明

1、原来的命名空间:

namespace gr {
namespace digital {
......
}
}

要修改为(每个C++文件中都要修改):

namespace gr {
namespace myDemux {
......
}
}

2、还有原 header_payload_demux_impl.cpp 文件中的所有 header_payload_demux 字段都需要改为 my_header_payload_demux

3、头文件中的预定义名称保持创建时的样子就好

#ifndef INCLUDED_MYDEMUX_MY_HEADER_PAYLOAD_DEMUX_IMPL_H
#define INCLUDED_MYDEMUX_MY_HEADER_PAYLOAD_DEMUX_IMPL_H
。。。。。。。
#endif /* INCLUDED_MYDEMUX_MY_HEADER_PAYLOAD_DEMUX_IMPL_H */

2.2、修改yaml文件

另外,将源码中 grc / digital_header_payload_demux.block.yml 的内容复制到创建的 block 的相应的位置,并注意修改其中所有与 header_payload_demux 有关的内容为 my_header_payload_demux;修改 原 label 标签 Header/Payload Demux 为 my_header_payload_demux;另外还有 import 标签也需要修改为

imports: import myDemux

另外 cpp_templates 标签的 includes 子标签修改为 my_header_payload_demux.h 的绝对路径(图省事)。其他细节比较容易分辨,都需要一一修改。

然后执行以下命令进行 python 与 头文件的绑定。注意!!这步为必要步骤,只要修改了include 文件夹里的头文件(这些都是公共头文件)就需要重新执行这条命令进行绑定,而修改 lib 文件夹里的头文件时可以省略该步骤。该步骤也是与 GR3.8 的一个明显区别。

gr_modtool bind [blockname]

具体地,这里因为创建的 block 名为 my_header_payload_demux,因此命令如下:

gr_modtool bind my_header_payload_demux

3、编译安装

然后回到 gr-myDemux 文件并创建 build 文件夹,然后进行编译。

mkdir build
cd build
cmake ../
make -j10
sudo make install
sudo ldconfig

这就行了。效果如下:

================== 重要的BUG修改 ==================== 

如果编译啥的都通过了,用的时候报错如下

AttributeError: 'myDemux.myDemux_python.my_header_payload_demux' object has no attribute 'to_basic_block'

就是形如:AttributeError: '×××' object has no attribute 'to_basic_block' 这样的错误,这个就又是 binding 文件出问题了(莫慌,bind也就这几个问题,目前还没发现其它问题),解决方法还是官网上的:

 就是需要把 python/bindings/[blockname]_python.cc 文件中的相应位置加上这么几个参数:

gr::sync_block,  // 实测这个不要加
gr::block,
gr::basic_block,

加完后的效果:

 ================== 重要的BUG END ====================  

最后,如果后续要在新建的 module 中添加新的 block,则需要先到 build 文件夹中吧原来的安装卸掉:

cd build
sudo make uninstall

然后把 build 文件夹删掉

rm -rf build

 然后重新建一个 build 文件夹,等新的 block 代码写好后再跟原来的一起编译安装~

4、有关bug的解决

过程中有关的bug及解决方法可以参考:

GNURadio 3.9 使用 OOT 自定义模块问题记录_Flag_ing的博客-优快云博客最近由于 GR3.8 里的卷积编码模块有问题就换用了GR3.9 ,发现GR3.9 可以正常使用,关于 GR3.8 里的卷积编码模块为什么不能用就先不深究了,之前写过GR3.8 编写 OOT 的流程,GR3.9 编写 OOT 跟 3.8 差别不大,但是有些修改需要注意下。目录1、依赖版本的问题2、每次修改公共头文件后要重新 bind 绑定3、编译啥的都通过了,用的时候有问题了1、依赖版本的问题GR3.9 与GR3.8 一个很重要的区别就是 python 与 C++ 接口的方...https://blog.youkuaiyun.com/Flag_ing/article/details/121008197

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在GNU Radio中使用C++创建OOT(Out-of-Tree)模块并进行Python绑定是一个相对复杂的流程,涉及模块开发、生成Python接口以及集成到GNU Radio的流程图中。以下是详细的步骤说明: ### 创建OOT模块 1. **使用`gr_modtool`工具**: GNU Radio提供了一个名为`gr_modtool`的脚本工具,用于简化OOT模块创建。运行以下命令生成一个模块框架: ```bash gr_modtool.py newmod <module_name> ``` 这将生成模块的目录结构,包括`include`、`lib`、`python`、`swig`等子目录,以及CMake配置文件等。 2. **添加块(Block)**: 使用以下命令添加一个块(如`sync_block`、`source`等): ```bash gr_modtool.py add <block_type> <block_name> ``` 这会自动生成C++源文件、头文件以及相关的Python绑定代码。 ### 编写C++实现 3. **实现块的逻辑**: 在`lib`目录下找到对应的`.cc`和`.h`文件,并在其中实现具体的信号处理逻辑。例如,一个简单的同步块: ```cpp // my_block_impl.h class my_block_impl : public my_block { public: my_block_impl(); ~my_block_impl(); void forecast(int noutput_items, gr_vector_int &ninput_items_required); int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); }; ``` 4. **注册块**: 在`lib/CMakeLists.txt`中添加块的源文件,以确保其被正确编译。 ### Python绑定 5. **使用SWIG生成绑定**: GNU Radio使用SWIG工具将C++代码绑定到Python。在`swig`目录下,编辑`.i`文件以包含新块的头文件: ```swig %include "my_block.h" ``` 6. **重新生成绑定代码**: 运行以下命令以重新生成Python绑定: ```bash swig -python -c++ -fcompact -frelative -I${INCLUDEDIR} -I${GR_INCLUDE_DIRS} my_module.i ``` 7. **更新CMake配置**: 确保`CMakeLists.txt`文件中包含了SWIG的配置,以便生成Python模块。 ### 构建与安装 8. **编译模块**: 在模块目录下运行以下命令进行编译: ```bash mkdir build cd build cmake .. make ``` 9. **安装模块**: 编译完成后,使用以下命令安装模块: ```bash sudo make install sudo ldconfig ``` ### 集成到GNU Radio流程图 10. **验证模块**: 使用`gnuradio-companion`(GRC)打开一个新的流程图,并在模块列表中搜索新创建OOT模块,确认其可用性。 11. **在流程图中使用**: 将OOT模块拖入流程图,并与其他模块连接以构建完整的信号处理流程。 ### 示例代码 以下是一个简单的同步块的C++实现示例: ```cpp // my_block_impl.cc #include "my_block_impl.h" #include <gnuradio/io_signature.h> namespace gr { namespace my_module { my_block::sptr my_block::make() { return gnuradio::get_initial_sptr (new my_block_impl()); } my_block_impl::my_block_impl() : gr::sync_block("my_block", gr::io_signature::make(1, 1, sizeof(float)), gr::io_signature::make(1, 1, sizeof(float))) { } my_block_impl::~my_block_impl() { } int my_block_impl::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const float *in = (const float *) input_items[0]; float *out = (float *) output_items[0]; for (int i = 0; i < noutput_items; i++) { out[i] = in[i] * 2; // 简单的信号放大 } return noutput_items; } } /* namespace my_module */ } /* namespace gr */ ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

地球被支点撬走啦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值