You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU Radio Python Block文件存储及流图预执行技术问询

GNU Radio Python Block 解决方案:文件路径选择与预执行实现

核心需求

  • 接收5项用户输入:两行TLE数据、CubeSat频率、起始时间戳、文件存储路径(需支持类似File Sink的三点按钮选择路径)
  • 生成包含时间戳(第一列)和多普勒频移(第二列)的TXT文件
  • 点击"Execute the flowgraph"时,该Block先于整个流图完成计算

问题1:实现文件路径的三点选择按钮

GNU Radio Companion(GRC)原生支持路径参数的文件浏览器选择,无需手动调用tkinter对话框。只需在块的参数定义中将路径参数的类型设为file,GRC会自动生成三点选择按钮,用户在界面中选择路径后,路径会作为参数传入Block。

问题2:让Block在流图启动前执行计算

改用gr.basic_block替代gr.sync_block,重写start()方法——该方法会在流图启动时被优先调用,且仅执行一次,完美适配一次性预计算的场景,避免依赖work()方法的循环调用逻辑。


修改后的完整代码

import scipy.constants
import skyfield.api
from skyfield.api import wgs84, EarthSatellite
import numpy as np
import datetime
from gnuradio import gr

class DopplerBlock(gr.basic_block):
    def __init__(self, tle_line1='', tle_line2='', frequency=0, timestamp=0, output_file_path=''):
        gr.basic_block.__init__(
            self,
            name='Doppler Shift Generator',
            in_sig=None,
            out_sig=None
        )
        
        self.tle_line1 = tle_line1
        self.tle_line2 = tle_line2
        self.frequency = frequency
        self.timestamp = timestamp
        self.output_file_path = output_file_path
        self.ts = skyfield.api.load.timescale()
        self.groundstation = wgs84.latlon(53.1111, 8.8583, 0)  # ESTEC地面站

    def compute_doppler(self):
        if not self.tle_line1 or not self.tle_line2:
            raise RuntimeError("必须提供完整的两行TLE数据")
        if not self.output_file_path:
            raise RuntimeError("必须指定输出文件路径")
        
        satellite = EarthSatellite(self.tle_line1, self.tle_line2, 'satellite', self.ts)
        
        unix_epoch = datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc)
        t0 = unix_epoch + datetime.timedelta(seconds=self.timestamp)
        t0 = self.ts.from_datetime(t0)

        # 生成时间步长:25分钟,每0.1秒一个采样点
        duration_s = 25 * 60
        time_steps = np.arange(0, duration_s, 0.1)
        t = t0 + time_steps / (24 * 3600)  # 转换为Skyfield所需的天级小数单位
        
        # 计算多普勒频移
        topocentric = satellite.at(t).observe(self.groundstation)
        _, _, range_rate = topocentric.apparent().velocity.km_per_s
        range_rate *= 1e3  # 转换为米/秒单位

        doppler_shift = -range_rate / scipy.constants.c * self.frequency

        # 将结果写入指定文件
        with open(self.output_file_path, 'w') as output_file:
            for time, shift in zip(time_steps, doppler_shift):
                output_file.write(f'{self.timestamp + time}\t{shift}\n')

    def start(self):
        # 流图启动时立即执行多普勒计算
        self.compute_doppler()
        return True

    def work(self, input_items, output_items):
        # 无实时数据处理需求,直接返回0
        return 0

GRC参数配置说明

在GRC中添加该Python Block后,需配置以下5个参数:

  • tle_line1:类型设为string,用于输入第一行TLE数据
  • tle_line2:类型设为string,用于输入第二行TLE数据
  • frequency:类型设为float,默认值可设为437.250e6(CubeSat典型频率)
  • timestamp:类型设为int,用于输入起始UTC时间戳
  • output_file_path:类型设为file,GRC会自动生成三点选择按钮,点击即可打开文件浏览器选择输出路径

内容的提问来源于stack exchange,提问作者ed190

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:55:57