Satellite Observer
Author
Pure-Dart SGP4/SDP4 propagation engine: orbit propagation, topocentric look-angles, pass prediction, and naked-eye visibility windows. Zero runtime dependencies - just Dart math. The computation layer that pairs with the Celestrak data package.
- Dart
- SGP4/SDP4
- Orbital Mechanics
PROPAGATION ENGINE
The core is a faithful Dart port of the SGP4/SDP4 algorithm, split across sgp4_core.dart, deep_space.dart, and gravity_constants.dart. Given a set of general perturbation elements (TLEs or OMM), the propagation engine advances a satellite to any future or past epoch and returns its ECI (Earth-Centered Inertial) state vector.
The engine is deliberately stateless: each propagation call takes elements and a target time and returns a result - no mutable satellite object to track.
OBSERVER GEOMETRY
On top of the propagation engine sits an observer layer: given the observer's geodetic latitude, longitude, and altitude, the package converts ECI position into topocentric look-angles - azimuth, elevation, and range - at any requested time. This is what feeds a compass bearing and altitude reading in a sky-view UI.
PASS PREDICTION AND VISIBILITY
PassFinder walks a time window, detects elevation zero-crossings (rise and set), and refines them with a root-finding step for sub-second accuracy. Each predicted pass includes rise time, set time, max elevation, and compass headings at the key moments.
Visibility filtering goes further: a pass is marked as potentially naked-eye visible only when the satellite is sunlit (above Earth's shadow cone) and the observer's sky is dark enough - both conditions evaluated from geometry, no empirical tables. TwilightPhase (astronomical, nautical, civil) feeds the sky-darkness check.
ARCHITECTURE
The celestrak package is listed only as a dev_dependency (used in the example/), not a runtime dependency - the propagation engine operates on GpElements (general perturbation elements) which can be populated from any source. This separation is an explicit architectural decision: the data layer and the computation layer are independently publishable and testable.
KEY TAKEAWAYS
- Full SGP4/SDP4 in pure Dart - no native bindings or FFI
- Topocentric look-angles from any geodetic observer position
- Pass prediction with sub-second rise/set accuracy via root refinement
- Naked-eye visibility filter: satellite sunlit + sky dark, computed from geometry
- Zero runtime dependencies - only Dart's core meta package