Skip to content
← Home

RFPI · RF systems · Remote sensing · 2026

RFPI weather-satellite ground station

I built a Raspberry Pi and RTL-SDR station that schedules METEOR passes, records the configured 137.9 MHz LRPT downlink, and decodes MSU-MR imagery. SQLite catalogs the pass metadata and products. Of the 255 passes it has recorded, the 120 with enough saved data to place appear on the globe below, and the 42 that produced imagery open it from their dots.

DENVER / WGS84 SATELLITE PASSES
Loading the pass archive…

When I started archiving passes from the station, I wanted a way to see them at once instead of scrolling through a catalog table, and this globe is that view. Each dashed line is the orbit predicted from the TLE the station saved for that pass, and each dot is the satellite’s predicted position when the recording started (or, for the weather passes that decoded, at the first image scan). Scrolling plays the passes back in order from September 14 to October 4, the Play button and timeline let you run through them yourself, and selecting a dot shows what the station received on that pass.

I was fairly strict about the positions. Every saved TLE is propagated with SGP4 through Skyfield, converted from TEME into the Earth-fixed ITRS frame, and placed on the WGS84 ellipsoid, and the NASA Blue Marble imagery is mapped onto that same ellipsoid so the orbits and the basemap line up with each other. The TLEs were less than a day old at capture time on average and never more than two days old, which should keep the position error on the order of a few kilometers. That figure is inferred from how fresh the elements were, not measured against a known reference, so treat it as an estimate of propagation error rather than a validated accuracy for the station. What surprised me was how much of the archive could not be placed at all. 135 of the 255 recorded passes are missing something I would need, in almost every case because the capture manifest was never saved, so I left those passes off the globe rather than fill in positions I could not back up.

Passes with imagery
42 of 116 LRPT, to 2026-10-04
Recorded passes
255 LRPT, FM, APRS
Configured LRPT
137.9 MHz

How a pass is captured

I see the station as four pieces working in tandem. The scheduler uses Skyfield and a cached set of orbital elements to calculate rise, peak, and set times for each pass, and it is the only process allowed to use the RTL-SDR, which keeps two recordings from competing for the radio. When a pass starts, the scheduler launches SatDump, which turns the CADU stream into the MSU-MR channels, composites, and projections. SQLite keeps a record of every pass (time, satellite, predicted peak, file size, image count, and archive location), and once an hour the desktop pulls a read-only rsync copy of the catalog, logs, recordings, and imagery off the Pi.


System stack

Edge
Raspberry Pi 3B · Raspberry Pi OS · systemd
RF
RTL-SDR Blog V4 · V-dipole · configured 137.9 MHz LRPT
Software
Python · Skyfield · SatDump · SQLite
Archive
Hourly rsync pull · manual desktop processing