sgoudelis/ground-station
GitHub: sgoudelis/ground-station
这是一个开源卫星监控套件,旨在为业余无线电爱好者和研究人员提供一站式卫星跟踪与信号处理平台。
Stars: 4527 | Forks: 795
# 地面站
[](https://github.com/sgoudelis/ground-station/actions/workflows/tests.yml) [](https://www.gnu.org/licenses/gpl-3.0) [](https://github.com/sgoudelis/ground-station/actions/workflows/release-from-images.yml) [](https://github.com/sgoudelis/ground-station/releases/latest) [](https://github.com/sgoudelis/ground-station/commits/main)
**地面站是一个功能齐全、开源的卫星跟踪与无线电通信软件解决方案。** 它专为业余无线电操作员、卫星爱好者和研究人员设计,提供一个全面且易于使用的平台,用于监测航天器、控制无线电设备以及接收来自卫星的实时无线电信号。
本项目的构建得到了 Claude Code 和 Codex 的帮助。
## 截图
")。使用不同的 SDR 时,用户会话和自动观测完全独立运行,互不干扰。
## 计划特性与路线图
以下特性正在计划中或正在开发中:
* **更多解码器:**
* AFSK 数据包解码器
* LoRa 解码器
* NOAA APT 气象卫星图像
* 更多遥测格式
## 架构
地面站应用由前端、后端和一组工作进程组成。
### 高层系统架构
```
flowchart TB
%% Cache buster: v5-20251115-updated
%% Frontend Layer
A[Frontend: React + Redux + MUI
- Real-time UI updates
- State management
- Interactive satellite maps
- Spectrum & waterfall display
- Audio playback & recording
- IQ recording & playback controls
- Decoder monitoring & output display] %% Backend Layer B[Backend: FastAPI + Socket.IO
- WebSocket connections
- Worker process management
- Database operations
- TLE data fetching
- Recording & file management
- Decoder lifecycle management] %% Worker Layer subgraph Workers["Worker Processes"] direction TB W1[Tracker Supervisor + Tracker Instances
- One tracker instance per rotator
- Antenna rotator control
- Rig/radio control
- Real-time tracking calculations
- Hardware state management] W2[SDR IQ Acquisition
- Raw IQ sample streaming
- IQ Broadcaster pub/sub
- Multi-consumer support] W2A[FFT Processor
- Spectrum computation
- Waterfall generation
- Real-time FFT analysis] W2B[Demodulators
- FM/SSB/AM modes
- Normal & Internal modes
- Frequency translation
- Audio processing
- Multi-VFO support] W2C[IQ Recorder
- SigMF format recording
- Metadata capture
- Satellite info tagging
- Waterfall snapshot saving] W2D[Decoders
- SSTV image decoder ✓
- AFSK packet decoder WIP
- LoRa/GMSK decoders WIP
- Audio Broadcaster for monitoring] W3[SDR Local Probe
- Device discovery
- Local SoapySDR enumeration
- Hardware capability detection] W4[SDR Remote Probe
- Remote SoapySDR discovery
- Network device scanning
- Remote capability detection] end %% Hardware Layer subgraph Hardware["Hardware Interfaces"] direction LR H1[Antenna Rotators
- Hamlib compatible
- Az/El control] H2[Radios/Rigs
- CAT control
- Frequency tuning] H3[Local SDR Devices
- RTL-SDR
- SoapySDR devices
- UHD/USRP] H4[Remote SDR Devices
- SoapyRemote
- rtl_tcp servers
- Network receivers] H5[SigMF Playback
- Virtual SDR device
- Recording playback
- SigMF metadata reader] end %% Storage Layer subgraph Storage["Data Storage"] S1[SigMF Recordings
- .sigmf-data files
- .sigmf-meta files
- Waterfall snapshots] S2[Decoded Outputs
- SSTV images
- Packet data] end %% External Services subgraph External["External Data Sources"] E1[TLE Data Sources
- CelesTrak
- SatNOGS DB] E2[Satellite Databases
- Transmitter info
- Orbital data] end %% Connections - Frontend to Backend A <---|Socket.IO
Bidirectional| B %% Backend to Workers B ---|Message Queues
Commands & Status| W1 B ---|Message Queues
Stream Control| W2 B ---|Message Queues
Discovery Requests| W3 B ---|Message Queues
Remote Scanning| W4 %% SDR IQ Distribution via IQ Broadcaster W2 ---|IQ Broadcaster
Subscribe| W2A W2 ---|IQ Broadcaster
Subscribe| W2B W2 ---|IQ Broadcaster
Subscribe| W2C W2 ---|IQ Broadcaster
Subscribe Raw IQ| W2D %% Demodulator to Decoder Chain W2B ---|Internal Mode
Audio Broadcaster| W2D %% Data back to Backend W2A ---|FFT Data
Spectrum/Waterfall| B W2B ---|Audio Data
Demodulated| B W2D ---|Decoded Data
Images/Text/Packets| B W2D ---|UI Audio Stream
Live Monitoring| B %% Recording Storage W2C ---|Write SigMF
Recording Files| S1 W2D ---|Write Decoded
Output Files| S2 %% Hardware Control W1 ---|Control Commands| H1 W1 ---|Frequency Control| H2 W2 ---|IQ Data Streaming| H3 W2 ---|Network Streaming| H4 W2 ---|Playback Source| H5 W3 ---|Device Enumeration| H3 W4 ---|Remote Discovery| H4 %% Storage Access H5 ---|Read Files| S1 B ---|File Management| S1 B ---|File Management| S2 %% External Data B ---|HTTP/API Requests| E1 B ---|Database Queries| E2 %% Dark Mode Styling classDef frontend fill:#1a237e,stroke:#3f51b5,stroke-width:2px,color:#ffffff classDef backend fill:#2e7d32,stroke:#4caf50,stroke-width:2px,color:#ffffff classDef worker fill:#e65100,stroke:#ff9800,stroke-width:2px,color:#ffffff classDef hardware fill:#4a148c,stroke:#9c27b0,stroke-width:2px,color:#ffffff classDef storage fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff classDef external fill:#b71c1c,stroke:#f44336,stroke-width:2px,color:#ffffff class A frontend class B backend class W1,W2,W2A,W2B,W2C,W2D,W3,W4 worker class H1,H2,H3,H4,H5 hardware class S1,S2 storage class E1,E2 external %% Dashed borders for subgraphs style Workers stroke-dasharray: 5 5 style Hardware stroke-dasharray: 5 5 style Storage stroke-dasharray: 5 5 style External stroke-dasharray: 5 5 ``` ### 信号处理数据流 此图表展示了无线电信号如何从 SDR 硬件流经系统到达解码器和用户界面: ``` flowchart TB %% SDR Source SDR[SDR Hardware
RTL-SDR, SoapySDR, UHD] %% IQ Broadcaster IQB[IQ Broadcaster
Pub/Sub Pattern
Deep copy for each subscriber] %% Primary Consumers subgraph Consumers["IQ Consumers"] FFT[FFT Processor
→ Spectrum Display] REC[IQ Recorder
→ SigMF Files] DEMOD[Demodulator
FM/SSB/AM] IQDEC[IQ Decoders
GMSK/FSK/BPSK] end %% Demodulator Branches subgraph DemodBranch["Demodulator Types"] direction TB NORM[Normal Mode
User Playback] INT[Internal Mode
For Decoders] end %% Audio Broadcaster for Internal Demodulators AUDIOB[Audio Broadcaster
Pub/Sub Pattern
Deep copy for each subscriber] %% Decoder Chain subgraph DecoderChain["Audio-based Decoder Processing"] direction TB DEC[Decoder
AFSK] UIAUDIO[UI Audio Stream
Live Monitoring] end %% Output Destinations subgraph Outputs["Outputs"] SPECUI[Spectrum/Waterfall UI] SIGFILE[SigMF Recording Files] PLAYBACK[Audio Playback to User] DECOUT[Decoded Data
Images/Text/Packets] AUDIOUI[UI Audio Player
Decoder Monitoring] end %% Connections SDR -->|Raw IQ Samples| IQB SDR -->|Raw IQ Samples| FFT IQB -->|Subscribe| REC IQB -->|Subscribe| DEMOD IQB -->|Subscribe| IQDEC DEMOD -->|Branch| NORM DEMOD -->|Branch| INT NORM -->|Audio Queue| PLAYBACK INT -->|Audio Queue| AUDIOB AUDIOB -->|Subscribe: decoder| DEC AUDIOB -->|Subscribe: ui| UIAUDIO FFT -->|FFT Data| SPECUI REC -->|Write| SIGFILE DEC -->|Decoded Output| DECOUT IQDEC -->|Decoded Output| DECOUT UIAUDIO -->|Audio Chunks| AUDIOUI %% Styling classDef hardware fill:#4a148c,stroke:#9c27b0,stroke-width:2px,color:#ffffff classDef broadcaster fill:#d84315,stroke:#ff5722,stroke-width:3px,color:#ffffff classDef processor fill:#e65100,stroke:#ff9800,stroke-width:2px,color:#ffffff classDef output fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff classDef decoder fill:#1b5e20,stroke:#4caf50,stroke-width:2px,color:#ffffff class SDR hardware class IQB,AUDIOB broadcaster class FFT,REC,DEMOD,NORM,INT processor class SPECUI,SIGFILE,PLAYBACK,DECOUT,AUDIOUI output class DEC,UIAUDIO decoder ``` #### 关键概念 **IQ 广播器(发布/订阅模式):** - SDR 以高速率产生原始 IQ 样本 - IQBroadcaster 同时分发给多个消费者 - 每个订阅者获得独立的队列和深拷贝的样本 - 慢速消费者:消息被丢弃而非阻塞生产者 - 支持:FFT 处理器、解调器、IQ 录制器、解码器(LoRa/GMSK) **音频广播器(解码模式):** - 仅用于向解码器馈送信号的内部解调器 - 将解调后的音频分发给: - **解码器订阅者:** SSTV/AFSK 解码器处理 - **UI 订阅者:** 浏览器中的实时音频监控 - 统计跟踪:每个订阅者的消息投递/丢弃计数 - 优雅处理慢速消费者 **链式处理示例(SSTV):** 1. SDR → IQBroadcaster → 内部 FM 解调器(SSTV) 2. FM 解调器 → AudioBroadcaster 输入队列 3. AudioBroadcaster → 解码器订阅者 → SSTV 解码器 → 图像输出 4. AudioBroadcaster → UI 订阅者 → 浏览器音频播放器 **为什么使用广播器?** - **解耦:** 生产者无需了解消费者 - **可扩展性:** 无需修改生产者即可添加消费者 - **监控:** 每个订阅者的统计和健康状态监控 - **可靠性:** 慢速消费者不会阻塞快速生产者 * **前端:** 前端是一个使用 React、Redux Toolkit 和 Material-UI 构建的单页应用。它通过 socket.io 连接与后端通信,以实现实时更新,包括解码数据的显示和实时音频监控。 * **后端:** 后端是一个使用 FastAPI 构建的 Python 应用程序。它为前端提供 REST API 和 socket.io 接口。它管理着工作进程、解码器生命周期,并协调用于信号分发的发布/订阅架构。 * **工作进程:** 工作进程负责繁重的工作。它们执行诸如卫星跟踪、SDR 流式传输、信号解调、数据解码(SSTV 已实现,AFSK/LoRa 开发中)和天线控制等任务。工作进程使用 IQ 广播器和音频广播器进行高效的多消费者信号分发。 ## 第三方库与技术 ### 后端 * **[FastAPI](https://fastapi.tiangolo.com/):** 一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示构建 Python 3.7+ 的 API。 * **[SQLAlchemy](https://www.sqlalchemy.org/):** Python SQL 工具包和对象关系映射器,为应用程序开发人员提供 SQL 的全部功能和灵活性。 * **[Skyfield](https://rhodesmill.org/skyfield/):** 一个现代的 Python 天文学库,用于计算地球轨道上的恒星、行星和卫星的位置。 * **[SGP4](https://pypi.org/project/sgp4/):** SGP4 卫星传播模型的 Python 实现。 * **[Socket.IO](https://python-socketio.readthedocs.io/en/latest/):** 一个用于实时、双向、基于事件的通信的库。 * **[pyrtlsdr](https://pypi.org/project/pyrtlsdr/):** RTL-SDR 库的 Python 封装。 * **[SoapySDR](https://pypi.org/project/SoapySDR/):** 一个供应商和平台中立的 SDR 支持库。 * **[SatDump](https://github.com/SatDump/SatDump):** 卫星解码套件,用于气象图像解码工作流程。 * **[gr-satellites](https://github.com/daniestevez/gr-satellites):** 用于卫星通信解码的 GNU Radio 树外模块。 ### 前端 * **[React](https://reactjs.org/):** 一个用于构建用户界面的 JavaScript 库。 * **[Redux Toolkit](https://redux-toolkit.js.org/):** 官方、固执己见、开箱即用的工具集,用于高效的 Redux 开发。 * **[Material-UI](https://mui.com/):** 一个流行的 React UI 框架,提供全面的 UI 工具套件。 * **[Vite](https://vitejs.dev/):** 一个构建工具,旨在为现代 Web 项目提供更快、更精简的开发体验。 * **[Socket.IO Client](https://socket.io/docs/v4/client-api/):** Socket.IO 的客户端库。 * **[Leaflet](https://leafletjs.com/):** 一个开源的 JavaScript 库,用于移动设备友好的交互式地图。 * **[satellite.js](https://github.com/shashwatak/satellite-js):** 一个用于传播卫星轨道的 JavaScript 库。 ## SDR 设备支持 专用的工作进程为多种接收器系列提供 IQ 采集、FFT 处理和解调支持: * **RTL-SDR**(USB 或 `rtl_tcp`)工作进程 * **SoapySDR** 设备,本地或通过 SoapyRemote 连接:RTL-SDR、Airspy、AirspyHF+、HackRF、HydraSDR、LimeSDR、PlutoSDR、UHD/USRP 和 SDRplay(RSP 系列) * **UHD/USRP** 无线电设备,通过 UHD 工作进程支持 * **需要其他 SoapySDR 设备?** 请在 GitHub 上提交 issue 并请求支持。 SDR 架构使用发布/订阅模式(IQ 广播器)将 IQ 采集与信号处理分离: * **IQ 采集工作进程**将原始样本流式传输到 **IQ 广播器** * **IQ 广播器**独立分发给多个订阅者: * **FFT 处理器**,用于频谱/瀑布图显示 * **解调器**(FM/SSB/AM),用于普通和内部模式下的音频输出 * **IQ 录制器**,用于 SigMF 格式的文件捕获 * **原始 IQ 解码器**(BPSK、GMSK),绕过解调环节 * **音频广播器**将来自内部解调器的解调音频分发给: * **数据解码器**(AFSK),用于信号解码 * **UI 音频流**,用于浏览器中的实时监听 ## IQ 录制与回放 地面站包含使用 [SigMF(信号元数据格式)](https://github.com/gnuradio/SigMF) 标准的全面 IQ 录制和回放功能: ### 录制特性 * **SigMF 格式:** 将 IQ 数据录制为 `.sigmf-data` 文件,并附带 `.sigmf-meta` JSON 元数据 * **自动元数据:** 捕获中心频率、采样率、时间戳和录制时长 * **卫星跟踪:** 自动用目标卫星名称和 NORAD ID 标记录制内容 * **瀑布图快照:** 在录制时保存瀑布图显示的 PNG 快照 * **多段支持:** 将参数变化(频率、采样率)作为单独的捕获段处理 * **实时监控:** UI 中显示实时计时器和可视录制指示器 ### 回放特性 * **虚拟 SDR 设备:** 录制内容在设备列表中显示为 "SigMF Playback" SDR * **完整处理流水线:** 回放支持 FFT 显示、解调和所有信号处理 * **等同实时的解码:** 回放期间,解调器和解码器的运行方式与接收实时 SDR 输入时完全相同 * **录制浏览器:** 可排序的录制列表,带有元数据预览(采样率、时长、时间戳) * **无缝集成:** 在实时 SDR 和回放之间切换,无需更改工作流程 ## 自动化观测 地面站包含一个用于计划卫星过境的自动化观测系统: * **监控的卫星:** 定义卫星监控模板,包括硬件配置、信号参数和任务定义。 * **自动过境调度:** 基于可配置的标准(最小仰角、前瞻窗口)自动计算并调度即将到来的过境。 * **灵活的任务组合:** 在单个观测中组合 IQ 录制(SigMF)、音频录制、协议解码和 AI 转录。 * **硬件编排:** 在计划运行期间控制 SDR 设备、天线转子(进行卫星跟踪)和设备(进行多普勒校正)。 * **实时观测能力:** 在自动过境期间观看频谱瀑布图、收听解调后的音频并查看实时解码器输出。 * **多 SDR 观测:** 在一个 SDR 上运行自动观测,而其他 SDR 可以并行录制、解码和收听同一过境。 * **状态管理:** 跟踪观测状态(计划中、运行中、已完成、失败、已取消、已错过),并自动清理旧条目。 * **会话管理:** 自动观测在隔离的内部 VFO 会话中运行(命名空间:"internal:")。
## 入门指南
关于开发环境设置、构建步骤和测试,请参阅 `DEVELOPMENT.md`。
## 应用程序配置
地面站后端的运行时选项存储在 `backend/data/configs/app_config.json` 中,并可在 UI 的 `设置 -> 设置` 中进行编辑。
配置优先级为:
1. CLI 标志(最高优先级)
2. `app_config.json`
3. 内置默认值(最低优先级)
UI 还会显示某个值当前是否被 CLI 覆盖,以及更改是热生效还是需要重启。
`/settings/preferences` 作为兼容性路由保留,现在渲染为统一设置页面内的一个标签页。
## Docker
### 从源代码构建
该仓库包含一个多阶段 `Dockerfile`,用于构建 React 前端和一个包含 SDR 库的 Python 环境。
```
docker build -t ground-station .
# 选项 1:标准桥接模式(适用于本地 SDR)
docker run --rm -p 7000:7000 --device /dev/bus/usb ground-station
# 选项 2:主机网络(SoapySDR 远程服务器通过 mDNS 发现所必需)
docker run --rm --network host --device /dev/bus/usb ground-station
```
### 使用预构建的 Docker 镜像
每个版本都提供预构建的多架构 Docker 镜像。关于使用特定版本的详细说明,请参阅 [Releases 页面](https://github.com/sgoudelis/ground-station/releases)。
### 拉取镜像
```
# 最新发行标签(推荐)
docker pull ghcr.io/sgoudelis/ground-station:
# 或直接拉取特定架构的标签
docker pull ghcr.io/sgoudelis/ground-station:-amd64
docker pull ghcr.io/sgoudelis/ground-station:-arm64
```
### 运行容器
**选项 1:启用 SoapySDR 远程服务器发现(推荐)**
使用宿主网络模式,以启用 SoapySDR 远程服务器的自动 mDNS 发现:
```
# AMD64
docker run -d \
--platform linux/amd64 \
--network host \
--name ground-station \
--restart unless-stopped \
--device=/dev/bus/usb \
--privileged \
-v /path/to/data:/app/backend/data \
-e GS_ENVIRONMENT=production \
-e GR_BUFFER_TYPE=vmcirc_mmap_tmpfile \
ghcr.io/sgoudelis/ground-station:
# ARM64(Raspberry Pi 等)
docker run -d \
--platform linux/arm64 \
--network host \
--name ground-station \
--restart unless-stopped \
-v /dev:/dev \
--privileged \
-v /path/to/data:/app/backend/data \
-e GS_ENVIRONMENT=production \
-e GR_BUFFER_TYPE=vmcirc_mmap_tmpfile \
ghcr.io/sgoudelis/ground-station:
```
**选项 2:标准桥接模式(无 SoapySDR 远程发现)**
使用带有端口映射的标准桥接网络模式:
```
# AMD64
docker run -d \
--platform linux/amd64 \
-p 7000:7000 \
--name ground-station \
--restart unless-stopped \
--device=/dev/bus/usb \
--privileged \
-v /path/to/data:/app/backend/data \
-e GS_ENVIRONMENT=production \
-e GR_BUFFER_TYPE=vmcirc_mmap_tmpfile \
ghcr.io/sgoudelis/ground-station:
# ARM64(Raspberry Pi 等)
docker run -d \
--platform linux/arm64 \
-p 7000:7000 \
--name ground-station \
--restart unless-stopped \
-v /dev:/dev \
--privileged \
-v /path/to/data:/app/backend/data \
-e GS_ENVIRONMENT=production \
-e GR_BUFFER_TYPE=vmcirc_mmap_tmpfile \
ghcr.io/sgoudelis/ground-station:
```
**重要提示:**
- 将 `/path/to/data` 替换为您希望的数据目录路径
- 选项 1(宿主网络)对于通过 mDNS 自动发现 SoapySDR 远程服务器是必需的
- 选项 2 适用于本地 SDR 和所有其他功能
- 对于树莓派硬件,仅推荐树莓派 5
- 对于 ARM64,使用 `-v /dev:/dev` 可确保所有 USB 设备可访问
- 在 `http://:7000` 访问 Web 界面
## 贡献指南
我们欢迎贡献!有关如何开始的详细信息,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 文件。
## 致谢
本项目使用 SatNOGS API 获取发射器信息。
## 许可证
本项目根据 GNU GPL v3 许可证授权。详情请参阅 [LICENSE](LICENSE) 文件。


### 多目标跟踪控制台
*多目标跟踪控制台视图,显示一个活跃的国际空间站目标,带有单个目标控制和实时跟踪遥测数据*
### SDR 瀑布图视图
*活跃卫星通信期间,带有实时转录叠加的瀑布图视图*
### 瀑布图数据包解码(GMSK)
*带有实时 GMSK 数据包解码和解码输出详情的瀑布图视图*
### 遥测数据包查看器(十六进制 + ASCII)
*数据包查看器,以十六进制显示遥测有效载荷字节,并附带 ASCII 码对照*
### TLE 数据同步
*TLE 同步页面,显示实时进度和卫星数据库更新*
### SDR 硬件管理
*综合的 SDR 设备管理界面,支持 RTL-SDR、SoapySDR 和 UHD/USRP 无线电设备,并具备远程功能*
### 文件浏览器与解码器
*文件浏览器视图,显示解码后的气象图像、数据包输出和保存的转录记录*
### 观测概览
*自动化观测仪表盘,显示即将到来的过境窗口和任务状态*
### DSP 拓扑与性能
*显示 IQ 样本流经的线程和进程链,展示 DSP 流水线的性能和数据流*
## 核心特性
* **实时卫星跟踪:** 使用高精度轨道模型跟踪数百颗卫星。TLE 数据自动从 CelesTrak 和 SatNOGS 更新。
* **多目标跟踪舰队:** 同时运行多个目标跟踪器,每个跟踪器拥有独立的设备/转子控制路径,从而可以并行操作多个目标-硬件链。
* **自动化天线转子控制:** 与常用的天线转子接口,在卫星过顶时自动进行跟踪。
* **设备控制(Hamlib):** 在卫星过境期间,控制兼容 Hamlib 的设备并进行多普勒校正。
* **SDR 集成:** 流式传输并记录来自各种 SDR 设备的实时无线电信号,包括 RTL-SDR、SoapySDR 和 UHD/USRP 无线电设备。
* **IQ 录制与回放:** 以 SigMF 格式记录原始 IQ 数据,附带完整元数据(中心频率、采样率、卫星信息),并通过虚拟 SDR 设备回放录制内容以供分析和调试。
* **数据解码:** 解码 SSTV、FSK、GFSK、GMSK 和 BPSK(使用 AX25 USP Geoscan 帧)。LoRa 和 AFSK 解码器目前无法正常工作;需要帮助。
* **AI 驱动的转录:** 通过 Gemini Live 或 Deepgram 实时将解调后的音频转录为文本。注重隐私,使用用户自己的密钥,支持可选翻译,并可将文件输出到 `backend/data/transcriptions/`。
* **计划观测:** 定义详细的观测任务,在卫星过境期间自动监听、解码、转录和录制音频及 IQ 数据,无需人工干预。
* **SatDump 集成:** 通过 SatDump 解码来自 METEOR-M2(LRPT 和 HRPT)的气象卫星图像,并与自动化观测结合。
* **性能监控:** 实时可视化信号处理流水线,显示组件间(SDR → FFT → 解调器 → 解码器 → 浏览器)的数据流、队列健康状态、吞吐量速率和组件统计数据,以诊断瓶颈并优化性能。
* **响应式 Web 界面:** 基于 Material-UI 构建的现代、响应式且直观的 Web 界面,可无缝适配桌面、平板和移动设备,让您可以在网络的任何位置控制地面站的各个方面。在平板电脑和手机上体验出色。
## 计划观测与自动过境录制
地面站包含一个全面的自动化观测系统,可以在无需用户干预的情况下调度和执行卫星过境:
* **监控的卫星:** 定义卫星监控模板,包括硬件配置、信号参数和任务定义。系统会自动为所有符合条件的过境生成计划观测。
* **自动过境调度:** 基于可配置的标准(最小仰角、前瞻窗口)自动计算并调度即将到来的卫星过境。调度器使用 APScheduler 在信号捕获时触发观测,并在信号丢失时停止。
* **灵活的任务组合:** 每个观测可以包含多个并发任务:IQ 录制(SigMF 格式)、音频录制(WAV)、协议解码(AFSK、GMSK、SSTV)以及可选的 AI 转录。
* **硬件编排:** 在计划观测期间自动控制 SDR 设备、天线转子(进行卫星跟踪)和设备(进行多普勒校正)。
* **实时观测能力:** 用户可以通过 Web 界面实时观察任何自动过境 - 查看频谱瀑布图、收听解调后的音频以及观看实时解码器输出。当使用与自动观测相同的 SDR 时,用户可以在不干扰的情况下进行监控,但请注意,更改 SDR 的中心频率或带宽将影响正在进行的观测。
* **多 SDR 观测:** 自动观测可以在一个 SDR 上运行,而其他 SDR 可以并行录制、解码和收听同一过境。
* **状态管理:** 实时观测状态跟踪(计划中、运行中、已完成、失败、已取消、已错过),并自动清理已完成的旧观测。
* **会话管理:** 自动观测在隔离的内部 VFO 会话中运行(命名空间:"internal:
*多目标跟踪控制台视图,显示一个活跃的国际空间站目标,带有单个目标控制和实时跟踪遥测数据*
### SDR 瀑布图视图
*活跃卫星通信期间,带有实时转录叠加的瀑布图视图*
### 瀑布图数据包解码(GMSK)
*带有实时 GMSK 数据包解码和解码输出详情的瀑布图视图*
### 遥测数据包查看器(十六进制 + ASCII)
*数据包查看器,以十六进制显示遥测有效载荷字节,并附带 ASCII 码对照*
### TLE 数据同步
*TLE 同步页面,显示实时进度和卫星数据库更新*
### SDR 硬件管理
*综合的 SDR 设备管理界面,支持 RTL-SDR、SoapySDR 和 UHD/USRP 无线电设备,并具备远程功能*
### 文件浏览器与解码器
*文件浏览器视图,显示解码后的气象图像、数据包输出和保存的转录记录*
### 观测概览
*自动化观测仪表盘,显示即将到来的过境窗口和任务状态*
### DSP 拓扑与性能
*显示 IQ 样本流经的线程和进程链,展示 DSP 流水线的性能和数据流*
- Real-time UI updates
- State management
- Interactive satellite maps
- Spectrum & waterfall display
- Audio playback & recording
- IQ recording & playback controls
- Decoder monitoring & output display] %% Backend Layer B[Backend: FastAPI + Socket.IO
- WebSocket connections
- Worker process management
- Database operations
- TLE data fetching
- Recording & file management
- Decoder lifecycle management] %% Worker Layer subgraph Workers["Worker Processes"] direction TB W1[Tracker Supervisor + Tracker Instances
- One tracker instance per rotator
- Antenna rotator control
- Rig/radio control
- Real-time tracking calculations
- Hardware state management] W2[SDR IQ Acquisition
- Raw IQ sample streaming
- IQ Broadcaster pub/sub
- Multi-consumer support] W2A[FFT Processor
- Spectrum computation
- Waterfall generation
- Real-time FFT analysis] W2B[Demodulators
- FM/SSB/AM modes
- Normal & Internal modes
- Frequency translation
- Audio processing
- Multi-VFO support] W2C[IQ Recorder
- SigMF format recording
- Metadata capture
- Satellite info tagging
- Waterfall snapshot saving] W2D[Decoders
- SSTV image decoder ✓
- AFSK packet decoder WIP
- LoRa/GMSK decoders WIP
- Audio Broadcaster for monitoring] W3[SDR Local Probe
- Device discovery
- Local SoapySDR enumeration
- Hardware capability detection] W4[SDR Remote Probe
- Remote SoapySDR discovery
- Network device scanning
- Remote capability detection] end %% Hardware Layer subgraph Hardware["Hardware Interfaces"] direction LR H1[Antenna Rotators
- Hamlib compatible
- Az/El control] H2[Radios/Rigs
- CAT control
- Frequency tuning] H3[Local SDR Devices
- RTL-SDR
- SoapySDR devices
- UHD/USRP] H4[Remote SDR Devices
- SoapyRemote
- rtl_tcp servers
- Network receivers] H5[SigMF Playback
- Virtual SDR device
- Recording playback
- SigMF metadata reader] end %% Storage Layer subgraph Storage["Data Storage"] S1[SigMF Recordings
- .sigmf-data files
- .sigmf-meta files
- Waterfall snapshots] S2[Decoded Outputs
- SSTV images
- Packet data] end %% External Services subgraph External["External Data Sources"] E1[TLE Data Sources
- CelesTrak
- SatNOGS DB] E2[Satellite Databases
- Transmitter info
- Orbital data] end %% Connections - Frontend to Backend A <---|Socket.IO
Bidirectional| B %% Backend to Workers B ---|Message Queues
Commands & Status| W1 B ---|Message Queues
Stream Control| W2 B ---|Message Queues
Discovery Requests| W3 B ---|Message Queues
Remote Scanning| W4 %% SDR IQ Distribution via IQ Broadcaster W2 ---|IQ Broadcaster
Subscribe| W2A W2 ---|IQ Broadcaster
Subscribe| W2B W2 ---|IQ Broadcaster
Subscribe| W2C W2 ---|IQ Broadcaster
Subscribe Raw IQ| W2D %% Demodulator to Decoder Chain W2B ---|Internal Mode
Audio Broadcaster| W2D %% Data back to Backend W2A ---|FFT Data
Spectrum/Waterfall| B W2B ---|Audio Data
Demodulated| B W2D ---|Decoded Data
Images/Text/Packets| B W2D ---|UI Audio Stream
Live Monitoring| B %% Recording Storage W2C ---|Write SigMF
Recording Files| S1 W2D ---|Write Decoded
Output Files| S2 %% Hardware Control W1 ---|Control Commands| H1 W1 ---|Frequency Control| H2 W2 ---|IQ Data Streaming| H3 W2 ---|Network Streaming| H4 W2 ---|Playback Source| H5 W3 ---|Device Enumeration| H3 W4 ---|Remote Discovery| H4 %% Storage Access H5 ---|Read Files| S1 B ---|File Management| S1 B ---|File Management| S2 %% External Data B ---|HTTP/API Requests| E1 B ---|Database Queries| E2 %% Dark Mode Styling classDef frontend fill:#1a237e,stroke:#3f51b5,stroke-width:2px,color:#ffffff classDef backend fill:#2e7d32,stroke:#4caf50,stroke-width:2px,color:#ffffff classDef worker fill:#e65100,stroke:#ff9800,stroke-width:2px,color:#ffffff classDef hardware fill:#4a148c,stroke:#9c27b0,stroke-width:2px,color:#ffffff classDef storage fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff classDef external fill:#b71c1c,stroke:#f44336,stroke-width:2px,color:#ffffff class A frontend class B backend class W1,W2,W2A,W2B,W2C,W2D,W3,W4 worker class H1,H2,H3,H4,H5 hardware class S1,S2 storage class E1,E2 external %% Dashed borders for subgraphs style Workers stroke-dasharray: 5 5 style Hardware stroke-dasharray: 5 5 style Storage stroke-dasharray: 5 5 style External stroke-dasharray: 5 5 ``` ### 信号处理数据流 此图表展示了无线电信号如何从 SDR 硬件流经系统到达解码器和用户界面: ``` flowchart TB %% SDR Source SDR[SDR Hardware
RTL-SDR, SoapySDR, UHD] %% IQ Broadcaster IQB[IQ Broadcaster
Pub/Sub Pattern
Deep copy for each subscriber] %% Primary Consumers subgraph Consumers["IQ Consumers"] FFT[FFT Processor
→ Spectrum Display] REC[IQ Recorder
→ SigMF Files] DEMOD[Demodulator
FM/SSB/AM] IQDEC[IQ Decoders
GMSK/FSK/BPSK] end %% Demodulator Branches subgraph DemodBranch["Demodulator Types"] direction TB NORM[Normal Mode
User Playback] INT[Internal Mode
For Decoders] end %% Audio Broadcaster for Internal Demodulators AUDIOB[Audio Broadcaster
Pub/Sub Pattern
Deep copy for each subscriber] %% Decoder Chain subgraph DecoderChain["Audio-based Decoder Processing"] direction TB DEC[Decoder
AFSK] UIAUDIO[UI Audio Stream
Live Monitoring] end %% Output Destinations subgraph Outputs["Outputs"] SPECUI[Spectrum/Waterfall UI] SIGFILE[SigMF Recording Files] PLAYBACK[Audio Playback to User] DECOUT[Decoded Data
Images/Text/Packets] AUDIOUI[UI Audio Player
Decoder Monitoring] end %% Connections SDR -->|Raw IQ Samples| IQB SDR -->|Raw IQ Samples| FFT IQB -->|Subscribe| REC IQB -->|Subscribe| DEMOD IQB -->|Subscribe| IQDEC DEMOD -->|Branch| NORM DEMOD -->|Branch| INT NORM -->|Audio Queue| PLAYBACK INT -->|Audio Queue| AUDIOB AUDIOB -->|Subscribe: decoder| DEC AUDIOB -->|Subscribe: ui| UIAUDIO FFT -->|FFT Data| SPECUI REC -->|Write| SIGFILE DEC -->|Decoded Output| DECOUT IQDEC -->|Decoded Output| DECOUT UIAUDIO -->|Audio Chunks| AUDIOUI %% Styling classDef hardware fill:#4a148c,stroke:#9c27b0,stroke-width:2px,color:#ffffff classDef broadcaster fill:#d84315,stroke:#ff5722,stroke-width:3px,color:#ffffff classDef processor fill:#e65100,stroke:#ff9800,stroke-width:2px,color:#ffffff classDef output fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff classDef decoder fill:#1b5e20,stroke:#4caf50,stroke-width:2px,color:#ffffff class SDR hardware class IQB,AUDIOB broadcaster class FFT,REC,DEMOD,NORM,INT processor class SPECUI,SIGFILE,PLAYBACK,DECOUT,AUDIOUI output class DEC,UIAUDIO decoder ``` #### 关键概念 **IQ 广播器(发布/订阅模式):** - SDR 以高速率产生原始 IQ 样本 - IQBroadcaster 同时分发给多个消费者 - 每个订阅者获得独立的队列和深拷贝的样本 - 慢速消费者:消息被丢弃而非阻塞生产者 - 支持:FFT 处理器、解调器、IQ 录制器、解码器(LoRa/GMSK) **音频广播器(解码模式):** - 仅用于向解码器馈送信号的内部解调器 - 将解调后的音频分发给: - **解码器订阅者:** SSTV/AFSK 解码器处理 - **UI 订阅者:** 浏览器中的实时音频监控 - 统计跟踪:每个订阅者的消息投递/丢弃计数 - 优雅处理慢速消费者 **链式处理示例(SSTV):** 1. SDR → IQBroadcaster → 内部 FM 解调器(SSTV) 2. FM 解调器 → AudioBroadcaster 输入队列 3. AudioBroadcaster → 解码器订阅者 → SSTV 解码器 → 图像输出 4. AudioBroadcaster → UI 订阅者 → 浏览器音频播放器 **为什么使用广播器?** - **解耦:** 生产者无需了解消费者 - **可扩展性:** 无需修改生产者即可添加消费者 - **监控:** 每个订阅者的统计和健康状态监控 - **可靠性:** 慢速消费者不会阻塞快速生产者 * **前端:** 前端是一个使用 React、Redux Toolkit 和 Material-UI 构建的单页应用。它通过 socket.io 连接与后端通信,以实现实时更新,包括解码数据的显示和实时音频监控。 * **后端:** 后端是一个使用 FastAPI 构建的 Python 应用程序。它为前端提供 REST API 和 socket.io 接口。它管理着工作进程、解码器生命周期,并协调用于信号分发的发布/订阅架构。 * **工作进程:** 工作进程负责繁重的工作。它们执行诸如卫星跟踪、SDR 流式传输、信号解调、数据解码(SSTV 已实现,AFSK/LoRa 开发中)和天线控制等任务。工作进程使用 IQ 广播器和音频广播器进行高效的多消费者信号分发。 ## 第三方库与技术 ### 后端 * **[FastAPI](https://fastapi.tiangolo.com/):** 一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示构建 Python 3.7+ 的 API。 * **[SQLAlchemy](https://www.sqlalchemy.org/):** Python SQL 工具包和对象关系映射器,为应用程序开发人员提供 SQL 的全部功能和灵活性。 * **[Skyfield](https://rhodesmill.org/skyfield/):** 一个现代的 Python 天文学库,用于计算地球轨道上的恒星、行星和卫星的位置。 * **[SGP4](https://pypi.org/project/sgp4/):** SGP4 卫星传播模型的 Python 实现。 * **[Socket.IO](https://python-socketio.readthedocs.io/en/latest/):** 一个用于实时、双向、基于事件的通信的库。 * **[pyrtlsdr](https://pypi.org/project/pyrtlsdr/):** RTL-SDR 库的 Python 封装。 * **[SoapySDR](https://pypi.org/project/SoapySDR/):** 一个供应商和平台中立的 SDR 支持库。 * **[SatDump](https://github.com/SatDump/SatDump):** 卫星解码套件,用于气象图像解码工作流程。 * **[gr-satellites](https://github.com/daniestevez/gr-satellites):** 用于卫星通信解码的 GNU Radio 树外模块。 ### 前端 * **[React](https://reactjs.org/):** 一个用于构建用户界面的 JavaScript 库。 * **[Redux Toolkit](https://redux-toolkit.js.org/):** 官方、固执己见、开箱即用的工具集,用于高效的 Redux 开发。 * **[Material-UI](https://mui.com/):** 一个流行的 React UI 框架,提供全面的 UI 工具套件。 * **[Vite](https://vitejs.dev/):** 一个构建工具,旨在为现代 Web 项目提供更快、更精简的开发体验。 * **[Socket.IO Client](https://socket.io/docs/v4/client-api/):** Socket.IO 的客户端库。 * **[Leaflet](https://leafletjs.com/):** 一个开源的 JavaScript 库,用于移动设备友好的交互式地图。 * **[satellite.js](https://github.com/shashwatak/satellite-js):** 一个用于传播卫星轨道的 JavaScript 库。 ## SDR 设备支持 专用的工作进程为多种接收器系列提供 IQ 采集、FFT 处理和解调支持: * **RTL-SDR**(USB 或 `rtl_tcp`)工作进程 * **SoapySDR** 设备,本地或通过 SoapyRemote 连接:RTL-SDR、Airspy、AirspyHF+、HackRF、HydraSDR、LimeSDR、PlutoSDR、UHD/USRP 和 SDRplay(RSP 系列) * **UHD/USRP** 无线电设备,通过 UHD 工作进程支持 * **需要其他 SoapySDR 设备?** 请在 GitHub 上提交 issue 并请求支持。 SDR 架构使用发布/订阅模式(IQ 广播器)将 IQ 采集与信号处理分离: * **IQ 采集工作进程**将原始样本流式传输到 **IQ 广播器** * **IQ 广播器**独立分发给多个订阅者: * **FFT 处理器**,用于频谱/瀑布图显示 * **解调器**(FM/SSB/AM),用于普通和内部模式下的音频输出 * **IQ 录制器**,用于 SigMF 格式的文件捕获 * **原始 IQ 解码器**(BPSK、GMSK),绕过解调环节 * **音频广播器**将来自内部解调器的解调音频分发给: * **数据解码器**(AFSK),用于信号解码 * **UI 音频流**,用于浏览器中的实时监听 ## IQ 录制与回放 地面站包含使用 [SigMF(信号元数据格式)](https://github.com/gnuradio/SigMF) 标准的全面 IQ 录制和回放功能: ### 录制特性 * **SigMF 格式:** 将 IQ 数据录制为 `.sigmf-data` 文件,并附带 `.sigmf-meta` JSON 元数据 * **自动元数据:** 捕获中心频率、采样率、时间戳和录制时长 * **卫星跟踪:** 自动用目标卫星名称和 NORAD ID 标记录制内容 * **瀑布图快照:** 在录制时保存瀑布图显示的 PNG 快照 * **多段支持:** 将参数变化(频率、采样率)作为单独的捕获段处理 * **实时监控:** UI 中显示实时计时器和可视录制指示器 ### 回放特性 * **虚拟 SDR 设备:** 录制内容在设备列表中显示为 "SigMF Playback" SDR * **完整处理流水线:** 回放支持 FFT 显示、解调和所有信号处理 * **等同实时的解码:** 回放期间,解调器和解码器的运行方式与接收实时 SDR 输入时完全相同 * **录制浏览器:** 可排序的录制列表,带有元数据预览(采样率、时长、时间戳) * **无缝集成:** 在实时 SDR 和回放之间切换,无需更改工作流程 ## 自动化观测 地面站包含一个用于计划卫星过境的自动化观测系统: * **监控的卫星:** 定义卫星监控模板,包括硬件配置、信号参数和任务定义。 * **自动过境调度:** 基于可配置的标准(最小仰角、前瞻窗口)自动计算并调度即将到来的过境。 * **灵活的任务组合:** 在单个观测中组合 IQ 录制(SigMF)、音频录制、协议解码和 AI 转录。 * **硬件编排:** 在计划运行期间控制 SDR 设备、天线转子(进行卫星跟踪)和设备(进行多普勒校正)。 * **实时观测能力:** 在自动过境期间观看频谱瀑布图、收听解调后的音频并查看实时解码器输出。 * **多 SDR 观测:** 在一个 SDR 上运行自动观测,而其他 SDR 可以并行录制、解码和收听同一过境。 * **状态管理:** 跟踪观测状态(计划中、运行中、已完成、失败、已取消、已错过),并自动清理旧条目。 * **会话管理:** 自动观测在隔离的内部 VFO 会话中运行(命名空间:"internal:
标签:业余无线电, 云安全态势管理, 前端应用, 卫星爱好者, 卫星监控, 卫星跟踪, 卫星通信, 多目标跟踪, 实时信号, 实时跟踪, 开源, 数据解码, 无线电控制, 无线电设备, 监控套件, 研究工具, 自定义脚本, 航天, 软件定义无线电, 逆向工具, 通信套件