Обзор

Что это

Флоуграф (flowgraph) — граф обработки сигнала в GNU Radio: цепочка блоков, через которые проходят отсчёты от приёмника до декодированного кадра телеметрии. В этом репозитории каждый флоуграф описан файлом .grc (YAML, формат GNU Radio Companion), а при сборке grcc превращает его в исполняемый Python-скрипт satnogs_<имя>.py.

soniks-flowgraphs содержит два слоя:

  1. Флоуграфы.grc в каталогах generic/ (режимы общего назначения: FM, FSK, BPSK, CW, APT, SSTV) и satellites/ (декодеры под конкретные спутники и протоколы, включая Geoscan и USP).

  2. Запускаторflowgraph_dispatcher/: Python-скрипт, который выбирает нужный флоуграф по названию режима, поднимает его и три процесса-подписчика, пишущих результаты на диск.

Место в инфраструктуре Соникс

   ┌──────────────────┐
   │  soniks-network  │  планирует наблюдение: спутник, время, частота, режим
   └────────┬─────────┘
            │ задание наблюдения
            ▼
   ┌──────────────────┐        ┌──────────┐
   │ soniks-client-new│───────▶│ rotctld  │  наведение антенны
   └────────┬─────────┘        └──────────┘
            │
            │ flowgraph_dispatcher --mode <MODE> --rx-freq=… --soapy-rx-device=…
            ▼
   ┌─────────────────────────────────────────────────────────┐
   │  flowgraph_dispatcher            (этот репозиторий)     │
   │                                                         │
   │   ├── satnogs_<mode>.py  ── GNU Radio ──┐               │
   │   │        ▲                            │ ZMQ           │
   │   │        │ доплер                     ▼               │
   │   │   ┌────┴────┐            ┌──────────────────────┐   │
   │   │   │ rigctld │            │ zmq_frame_decoder_sub│   │
   │   │   └─────────┘            │ zmq_iq_sub           │   │
   │   │                          │ zmq_audio_sub        │   │
   │   └── SoapySDR ◀── антенна   └──────────┬───────────┘   │
   └──────────────────────────────────────────┼──────────────┘
                                              ▼
                            кадры (JSON) · аудио (OGG) · IQ (raw) · водопад
                                              │
                                              ▼
                                   soniks-client-new → soniks-network

Клиент станции не знает про отдельные флоуграфы — он вызывает один бинарник flowgraph_dispatcher и передаёт ему режим модуляции строкой --mode. Соответствие «режим → флоуграф» описано в Справочник режимов.

Что происходит во время наблюдения

  1. Клиент запускает flowgraph_dispatcher с параметрами приёмника, частотой и путями к выходным файлам.

  2. Диспетчер по --mode выбирает скрипт флоуграфа, переписывает часть аргументов (подробности — flowgraph_dispatcher) и сначала поднимает процессы-подписчики, чтобы не потерять первые сообщения.

  3. Флоуграф открывает SDR через SoapySDR, компенсирует доплеровский сдвиг по данным от rigctld, демодулирует сигнал и публикует результаты в три ZMQ-сокета на localhost.

  4. Подписчики пишут кадры, аудио и IQ в файлы; водопад флоуграф пишет сам. Форматы — Выходные данные.

  5. По SIGINT диспетчер гасит флоуграф и подписчиков и завершается.

Отношение к апстриму SatNOGS

Проект — форк satnogs-flowgraphs Libre Space Foundation. Вся апстримовая функциональность сохранена; последнее слияние с апстримом — коммит 9079469.

Изменения форка относительно апстрима:

Изменение

Где

Декодер Geoscan (GFSK)

satellites/geoscan_gfsk_decoder.grc, режим GFSK_GEOSCAN

Декодер USP / Спутникс

satellites/usp_fsk_decoder.grc, режим GMSK USP

Режим SSTV переключён на satnogs_fm.py (аудио вместо картинки)

flowgraph_dispatcher.py

Добавлен отдельный режим SSTV_PD120 для старого поведения

flowgraph_dispatcher.py

Кадр записывается даже при пустых метаданных

zmq_frame_decoder_sub.py

Нижняя граница децимации max(4, …)

флоуграфы Geoscan и USP

Подробный разбор двух новых декодеров — Декодер Geoscan и Декодер USP (Спутникс).

Примечание

«Спутникс» встречается только в сообщениях коммитов. В коде, в названиях файлов и в строке режима используется «USP» — по названию протокола Unified SPUTNIX Protocol.

Что дальше