Erstellung eines Fahrplans für Bodenstations-Pässe mit Skyfield
Ansys STK ist bereit für den Sonnenuntergang: Berechnen Sie mithilfe von Skyfield SGP4-Passvorhersagen für Ihr Amateurfunkgerät oder Ihre CubeSat-Bodenstation.
Inhalt
- Warum brauchst du einen lokalen Passplaner
- Installieren
- Schritt 1: Aktuelle TLEs abrufen
- Schritt 2: Definiere deine Bodenstation
- Schritt 3: Finden Sie Ereignisse, die auf-, kulminieren und untergehen
- Schritt 4: Doppler-Shift über einen Pass
- Schritt 5: Verknüpfen Sie das Budget für jeden Pass
- Schritt 6: Senden Sie iCalendar aus, damit die Pässe in Ihrem Kalender erscheinen
- Schritt 7: Starte es auf Cron
- STK Cloud Stück für Stück ersetzen
- Weiterführende Literatur
Warum brauchst du einen lokalen Passplaner
Wenn Sie eine SatNOGS-Station, eine Amateurfunkhütte, die AO-91/ISS/NOAA verfolgt, oder ein Cubesat-Bodensegment im Frühstadium betreiben, benötigen Sie automatische Passvorhersagen. Kommerzielle Tools (STK, NOVA) sind übertrieben. Die kostenlosen Web-Prädiktoren (AMSAT, Heavens-Above) schreiben nicht gut. Da STK Cloud im März 2026 untergeht, ist Skyfield — der moderne Python-Nachfolger von PyEphem — die sauberste kostenlose Alternative.
In diesem Beitrag wird ein vollständiger Bodenstationsplaner in etwa 80 Python-Zeilen beschrieben: Holen Sie sich neue TLEs, berechnen Sie die Pässe der nächsten 24 Stunden für eine Satellitenliste, filtern Sie nach Mindesthöhe, berechnen Sie den Doppler für Ihre Downlink-Frequenz und senden Sie iCalendar aus, sodass Pässe in Ihrer Kalender-App erscheinen.
Installieren
pip install skyfield requests icalendar
Das war's. Skyfield ruft beim ersten Durchlauf seine eigenen Ephemeriden (DE421, IERS) ab — etwa 17 MB werden lokal zwischengespeichert.
Schritt 1: Aktuelle TLEs abrufen
TLEs driften — benutze sie innerhalb von 7 Tagen nach der Epoche. Ruft den aktuellen Elementsatz von Celestrak ab:
from skyfield.api import load
stations_url = 'https://celestrak.org/NORAD/elements/gp.php?GROUP=amateur&FORMAT=tle'
sats = load.tle_file(stations_url)
by_name = {s.name: s for s in sats}
print(f'Loaded {len(sats)} amateur-radio satellites')
Wählen Sie Ihre Ziele nach Namen aus (in der Celestrak-Datei wird zwischen Groß- und Kleinschreibung unterschieden):
targets = [
by_name['AO-91 (FOX-1B)'],
by_name['ISS (ZARYA)'],
by_name['NOAA 19'],
by_name['GreenCube (IO-117)'],
]
Schritt 2: Definiere deine Bodenstation
from skyfield.api import wgs84, load
ts = load.timescale()
my_station = wgs84.latlon(40.0150, -105.2705, elevation_m=1624) # Boulder, CO
min_elevation_deg = 10 # horizon mask to skip low passes
Verwenden Sie den Parameter elevation_m— er wirkt sich erheblich auf den Neigungsbereich bei niedrigen Höhenwinkeln aus.
Schritt 3: Finden Sie Ereignisse, die auf-, kulminieren und untergehen
Satellite.find_events() gibt eine einfache Liste von Ereignissen zurück (0 = Anstieg, 1 = Höhepunkt, 2 = Beginn). Verarbeite sie dreifach:
from datetime import timedelta
t0 = ts.now()
t1 = ts.from_datetime(t0.utc_datetime() + timedelta(hours=24))
for sat in targets:
t, events = sat.find_events(my_station, t0, t1,
altitude_degrees=min_elevation_deg)
# Group into rise/peak/set triples
triples = zip(t[0::3], t[1::3], t[2::3])
for rise, culm, setting in triples:
# Peak elevation
topo = (sat - my_station).at(culm)
alt, az, dist = topo.altaz()
print(f'{sat.name:30s} {rise.utc_iso():20s} peak {alt.degrees:4.1f}° slant {dist.km:4.0f} km')
Ignoriere Satelliten, die sich bereits über dem Horizont bei t0 befinden (die Eventliste beginnt mit einem Kulminat-/Satzpaar).
Schritt 4: Doppler-Shift über einen Pass
Bei Amateur-UHF (435 MHz) kann ein Durchgang Ihren Mobilfunkanbieter um ±10 kHz verschieben — Ihr Receiver muss das verfolgen. Berechnung des Momentan-Dopplers anhand der Reichweitenrate:
import numpy as np
FREQ_HZ = 435_800_000 # AO-91 downlink
C = 299_792_458.0 # m/s
def doppler_shift(sat, observer, t):
"""Positive when satellite approaching (received frequency is higher)."""
# Numerical range rate from 1s apart
dt = 1.0 # seconds
t_next = ts.from_datetime(t.utc_datetime() + timedelta(seconds=dt))
r0 = (sat - observer).at(t).distance().m
r1 = (sat - observer).at(t_next).distance().m
range_rate = (r1 - r0) / dt # m/s, positive = moving away
return -FREQ_HZ * range_rate / C # Hz, positive = approaching
# Sample across a pass
for pct in [0, 25, 50, 75, 100]:
t_sample = ts.from_datetime(
rise.utc_datetime() + (setting.utc_datetime() - rise.utc_datetime()) * pct / 100
)
d = doppler_shift(sat, my_station, t_sample)
print(f' {pct:3d}% pass: doppler = {d:+8.0f} Hz')
Bei einem typischen 6-minütigen AO-91-Overhead-Pass werden Sie einen Doppler-Sweep von etwa +10 kHz (Anstieg) über 0 (Zenit) bis −10 kHz (eingestellt) sehen. Verfolgen Sie dies auf dem Haupt-VFO des Funkgeräts, damit Sie kein Signal verlieren.
Schritt 5: Verknüpfen Sie das Budget für jeden Pass
Sobald Sie den Neigungsbereich ermittelt haben, geben Sie ihn in den rftools Free-Space Path Loss Calculator ein oder berechnen Sie ihn direkt:
def fspl_db(distance_m, freq_hz):
return 20 * np.log10(4 * np.pi * distance_m * freq_hz / C)
# At zenith of an AO-91 pass (~800 km slant at 40° elevation from Boulder)
fspl = fspl_db(800_000, FREQ_HZ)
print(f'FSPL = {fspl:.1f} dB') # ~143 dB
Für ein vollständiges Monte-Carlo-Link-Budget mit ITU-R-Ausbreitungsmodellen verwenden Sie den Satellite Link Budget Analyzer und teilen Sie die Szenario-URL mit Ihrem Stationslogbuch.
Schritt 6: Senden Sie iCalendar aus, damit die Pässe in Ihrem Kalender erscheinen
Hier wird der Scheduler für Menschen nützlich:
from icalendar import Calendar, Event
from datetime import datetime
import pytz
cal = Calendar()
cal.add('prodid', '-//rftools ground station//')
cal.add('version', '2.0')
for sat in targets:
t, events = sat.find_events(my_station, t0, t1, altitude_degrees=10)
triples = zip(t[0::3], t[1::3], t[2::3])
for rise, culm, setting in triples:
topo = (sat - my_station).at(culm)
alt, az, _ = topo.altaz()
ev = Event()
ev.add('summary', f'{sat.name} (peak {alt.degrees:.0f}°)')
ev.add('dtstart', rise.utc_datetime())
ev.add('dtend', setting.utc_datetime())
ev.add('description', f'Culminate at {culm.utc_iso()}, AZ {az.degrees:.0f}°')
cal.add_component(ev)
with open('passes.ics', 'wb') as f:
f.write(cal.to_ical())
print('Wrote passes.ics — import into Google Calendar / Apple Calendar / Outlook')
Importiere passes.ics in Apple-Kalender/Google-Kalender/Outlook und du erhältst 5 Minuten vor jedem Durchgang Push-Benachrichtigungen.
Schritt 7: Starte es auf Cron
Fügen Sie das Skript in ~/bin/station-passes.py ein und cronieren Sie es einmal täglich:
# Refresh pass schedule nightly at 03:00 local
0 3 * * * /usr/bin/python3 ~/bin/station-passes.py > ~/passes.ics 2>> ~/station.log
Verbinde es mit curl --upload-file mit einem Webdav-Kalender und dein Handy sieht jeden Pass automatisch.
STK Cloud Stück für Stück ersetzen
Für Amateur-/Cubesat-/kleine kommerzielle Unternehmen ersetzt das kombinierte Toolkit die täglichen Treiberfunktionen von STK Cloud:
| STK Cloud-Funktion | Kostenloser Ersatz |
|---|---|
| Vorhersage bestehen | Skyfield |
| Budget verknüpfen | rftools Satellite Link Budgetanalysator |
| Doppler/Entfernungskurven | Skyfield-Reichweitenrate |
| Höhenmasken + Gelände | Skyfield + lokales DEM (SRTM) |
| 3D-Visualisierung | Cesium.js |
| Verbindungsscreening | SOCRATES |
Weiterführende Literatur
- Skyfield-Dokumentation
- Celestrak TLE-Kataloge
- rftools Satellite Pass Predictor — gehostete Version dieses Schedulers für die gängigsten Amateursatelliten
- Migration von STK Cloud: Kostenlose Alternativen — der Begleitbeitrag zum Ersetzen des gesamten STK-Workflows
Häufig gestellte Fragen
Verwandte Artikel
Scripting Satellite Link Budgets with ITU-Rpy (Python Examples)
STK-free link budgets: sweep frequency, rain availability, and elevation in pure Python with ITU-Rpy, the reference implementation of P.618/P.676/P.840.
30. Apr. 2026
Satellite CommunicationsSizing a 9600-baud UHF Downlink for a 3U CubeSat: Full Walkthrough
End-to-end link budget for an amateur-band 3U cubesat: EIRP, slant range, ground-station G/T, propagation losses and Monte Carlo margin.
29. Apr. 2026
Satellite CommunicationsMigrating from STK Cloud: Free Alternatives for Link Budget and Orbit Analysis
Ansys is sunsetting STK Cloud in March 2026. Here are free open-source replacements for what it did best: ITU-R link budgets and orbital pass prediction.
29. Apr. 2026