使用 SatNOGS 架設衛星地面站的實作與分析
Introduction
過去我一直衛星是如何與地面站通訊這件事充滿興趣,包含,衛星如何被追蹤、地面站如何取得軌道資料(TLE 還有就是 SDR 接收到的訊號如何轉換成可解碼的 IF Frequency等等。
因此我決定以 SatNOGS(Satellite Networked Open Ground Station 作為切入點,架設一個可以自動排程、追蹤、接收衛星信號的完整 ground station
實作過程讓我對衛星任務運作與Ground Segment有具體的理解
SatNOGS 介紹
SatNOGS 是一個全球性的衛星地面站網路,使用者可以:
(1)架設自己的 Ground Station , (2)加入 SatNOGS 全球 Network , (3)接收並上傳衛星觀測資料
其架構包含:
- SatNOGS Network: 排程、任務分配、收集結果
- SatNOGS Client: 在本地端控制 SDR、rotator、recording
- SatNOGS DB: 衛星資料庫(頻率、modulation、TLE 等)
官方參考文件
- Build SatNOGS
- Ground Station Setup
System Architecture

在官方文件中可以看到,要建構 SatNOGS 的地面接收站有多種選擇,可以看到上面的 client 端可以是任何使用 Linux 的裝置,而訊號的接收會是使用軟體定義無線電(Software-Defined Radio) 加上訊號放大器,而天線則是可以是指向性或者是全向天線,另外可以選擇是否要加上 rotator。
1 | +---------------------------+ |
說明:
- SatNOGS Network
依據衛星 TLE 與軌道預測,自動分配可用地面站進行觀測(Observation) - SatNOGS Client
本地端負責控制 SDR、接收訊號、執行 doppler correction、並輸出觀測結果 - SDR 裝置
將天線接收到的 RF 轉成 baseband / IF(取決於設定) - 天線
決定接收品質(Gain、方向性、Noise等)
這部分最關鍵是:
SatNOGS Client 必須依據 TLE 預測天線方向與 doppler correction,才能成功收到衛星信號
TLE(Two-Line Element set)包含衛星的軌道參數與對應的 epoch,用來描述衛星在特定時間點的軌道狀態,並作為預測衛星位置與運動的數學模型。所以 SatNOGS client 會根據 TLE 計算衛星在每一時刻相對於地面站的 方位角(Azimuth)與仰角(Elevation)。 若地面站配備 rotator,天線即可依據計算結果即時追蹤衛星;即使沒有 rotator,系統仍可判斷衛星何時進入與離開地面站的可視範圍(AOS/LOS)
而在 Doppler correction 方面,SatNOGS client 會利用 TLE 推算衛星相對地面站的徑向速度,並依此計算下行訊號的 Doppler 頻率偏移。由於低軌衛星的相對速度極高,頻率偏移可能達數 kHz 以上,因此系統需動態調整 SDR 的接收中心頻率,以確保窄頻下行訊號能持續落在接收頻寬內~
Environment
Hardware
- Raspberry Pi 4
- SDR Device (HackRF One)
- Antenna
OS/ Software
- Ubuntu
- Ansible
- SatNOGS client packages
我沒有使用 Rotator,我想先用我手邊現有的材料,先兜出一個雛形,之後再選擇性的擴增架構。
Setup
安裝跟燒錄 Ubuntu image 這裡就不贅述了~~ 可以直接參考這份 文件
當你連上樹梅派後,要安裝 SatNOGS 的軟體
1 | curl -sfL https://satno.gs/install | sh -s -- |
Configure
SatNOGS 提供一個叫做 satnogs-setup 的設定腳本,可以提供設定 menu,並且設定完畢後會透過 Ansible 去部署客戶端軟體。 下面介紹會用到的設定值
1 | satnogs-setup |
Observations

這時候可以登入並註冊你的 Ground Station 到 SatNOGS Network

建立並且註冊完畢後,需要把 API Key 填入你的 client config 當中
排程觀測

在 SatNOGS Network 中可以在 Observations > Schedules 去排程觀測,可以選定想要觀測的衛星,並且選擇 Transmitter 和要用哪個 Ground Station 進行觀測,這裡就選擇自己的 Ground Station 即可,之後可以選定開始跟結束時間,當按下 calculate 時,下面的 Timeline 就會顯示出可被 schedule 的時間,為了方便我都是先 select all 後直接按 Schedule。
排程完畢後,你的 Ground Station 就會在指定的觀測時間進行觀測,然後結果苦已在你主頁中的 Recent Observations 中找到觀測結果。

觀測結果
本次觀測對象為臺灣的 福衛7號 FORMOSAT-7(COSMIC-2) ,Download Link Frequency 為 400.9000 MH(CW)。從 waterfall 圖中可以清楚觀察到一條連續且平滑彎曲的高能量軌跡,代表衛星在通過地面站上空期間,其下行載波頻率隨時間產生明顯的 Doppler Shift
觀測詳細資訊

在 AOS(Acquisition of Signal) 初期,衛星以高速朝向地面站接近,相對速度為負,使接收頻率偏移至標稱頻率以下。隨著衛星仰角逐漸升高並接近最高點( Max Elevation ≈ 78° ),相對徑向速度趨近於零,頻率偏移亦逐漸回到中心頻率附近。當衛星開始遠離地面站進入 LOS(Loss of Signal) 階段,Doppler Shift 方向反轉,接收頻率逐步偏移至標稱頻率以上。
此現象與低軌道衛星約 7–8 km/s 的高速運動完全一致,也驗證了 SatNOGS Client 依據 TLE 進行軌道預測與即時 Doppler correction 的正確性。整體頻率軌跡連續且穩定,顯示地面站時間同步、TLE 新鮮度與 SDR 設定皆在可接受範圍內
這邊中間的亮線是甚麼? 其實就是衛星的 CW 載波,由於衛星在高速移動,相對速度在變,所以根據 Doppler Shift 公式: $ \Delta f = \frac{v}{c} f_0$
- $\Delta f$ 代表偏移頻率,單位是 Hz。代表意義會是 實際接收頻率跟衛星的 Nominal downlink frequency 之差 也就是 $f_{\text{received}} - f_0$
- $v$ 代表衛星相對於地面接收站的速度分量,並不是衛星的總速度,而是 沿著地面站 ↔ 衛星視線方向的速度分量
- 接近你 → $v < 0$(頻率下降)
- 遠離你 → $v > 0$(頻率上升)
- 正上方 → $v ≈ 0$
- $c$ 光速,約等於 $3 × 10^8 \text{m/s}$
- $f_0$ 衛星的標稱下行頻率,對於本次觀測來說 $f_0 = 400.900Mhz$ 這個數值來自於衛星規格
Nominal downlink frequency 通常是衛星文件所定義在理論上的donwlink frequency 但實際情況會有 doppler effect, 衛星跟地面接收站也不會是相對靜止,因此頻率一定會偏移,也就不太可能只在 400.9Mhz 正中央看到載波
這裡可以把觀測到的數字代入驗證,低軌道衛星速度約等於 $v_{\text{orbital}} \approx 7.5 \text{ km/s}$,也藉是 $7500 m/s$
$ \Delta f = \frac{7500}{3 x 10^8} \cdot 4.0009 \times 10^8$ 結果算出的 $\Delta f$ 會約等於 $10022.5$ Hz 也就是 $10$ kHz 跟圖上觀測到的 shift 範圍一致 ( -10kHz ~ +10kHz)
Audio, Text and Metadata

這次觀測接收到的音訊並非可解碼的數位資料,而是 Doppler 位移後的載波訊號轉換至音訊頻段的結果。 隨著衛星接近地面站,音調逐漸升高,並且會在最高仰角附近達到峰值;隨後在衛星遠離時逐漸降低。 這種現象與低軌衛星通過地面站時的 Doppler 效應完全一致,顯示 RF 載波追蹤正常。

而收到的資料並非有效的遙測封包,應該是 FORMOSAT-7 在該頻率使用 CW beacon,而不是可解碼的數位調變格式,所以只能呈現零星符號,這也代表RF 接收成功,但調變與解碼設定需與衛星規格一致
Metadata

觀測使用 HackRF SDR,取樣率為 8 MHz,中心頻率設定為 400.900 MHz,並依據 Space-Track.org 提供的 TLE 資料啟用 Doppler correction
Results
透過這次實作,我理解到 TLE 與軌道預測的重要性,若 TLE 過期,tracking 與 doppler correction 都會錯位,會導致完全搜不到訊號




