tle_orbits
The tle_orbits library parses Two-Line Element (TLE) records and
provides a small set of helpers for portable approximate orbit
propagation and ground-track generation.
The current version defaults to an approximate automatic propagation mode that dispatches between dedicated near-earth and deep-space variants. The near-earth variant applies low-order B* drag damping together with J2 secular and short-period position corrections. The deep-space variant uses its own long-period and resonance-aware corrections so high-period orbits no longer share the near-earth path. The two-body Keplerian approximation is also available as an explicit baseline model for comparison and simple fallback use. Propagated states can also be queried together with direct velocity outputs in inertial, Earth-fixed, or local ENU frames.
API documentation
Open the ../../apis/library_index.html#tle_orbits link in a web browser.
Loading
To load all entities in this library, load the loader.lgt file:
| ?- logtalk_load(tle_orbits(loader)).
Testing
To test this library predicates, load the tester.lgt file:
| ?- logtalk_load(tle_orbits(tester)).
Representation
Parsed TLE records are represented as:
```
tle(
Name,
satellite(CatalogNumber, Classification, designator(LaunchYear, LaunchNumber, Piece)),
epoch_julian_date(EpochJulianDate),
drag(MeanMotionDot, MeanMotionDdot, BStar),
orbit(InclinationDegrees, RightAscensionDegrees, Eccentricity,
ArgumentOfPerigeeDegrees, MeanAnomalyDegrees, MeanMotionRevolutionsPerDay),
ephemeris_type(EphemerisType),
element_set(ElementSetNumber),
revolution(RevolutionNumber)
)
```
If the optional title line is absent, Name is the atom none.
Public API
parse/2parses one or more TLE records fromatom(Atom),chars(List),codes(List),stream(Stream), orfile(Path)sources.parse_lines/4parses a single TLE record from an optional name and the two fixed-width element lines.propagate/3propagates to a defaultgeographic(Latitude,Longitude,Height)coordinate in WGS84 using the defaultapproximatemodel.propagate/4supports the frameseci,ecef, andwgs84_3dusing the defaultapproximatemodel.propagate/5additionally allows choosing one of theapproximate,approximate_near_earth,approximate_deep_space, ortwo_bodymodels.propagate_state/4returnsstate(Position,Velocity)in a requested frame using the defaultapproximatemodel.propagate_state/5additionally allows choosing one of theapproximate,approximate_near_earth,approximate_deep_space, ortwo_bodymodels. Velocity is derived directly from the propagated orbital elements in ECI and then analytically transformed to ECEF or local ENU when requested.ground_track/5samplessample(DateTime, geographic(Latitude,Longitude,Height))points over a time range using a fixed step in seconds and the defaultapproximatemodel.ground_track/6additionally allows choosing one of theapproximate,approximate_near_earth,approximate_deep_space, ortwo_bodymodels.
Supported propagation time specifications are:
date_time(Year, Month, Day, Hours, Minutes, Seconds)julian_date(JulianDate)offset_seconds(SecondsSinceEpoch)
Examples
Parse one named TLE record:
| ?- tle_orbits::parse(atom('ISS (ZARYA)\n1 25544U 98067A 24120.51782528 .00012051 00000-0 21940-3 0 9995\n2 25544 51.6393 184.4452 0003580 32.9443 327.1663 15.50957687452123\n'), TLEs).
Propagate to a WGS84 3D geodetic coordinate using the TLE epoch:
| ?- TLEs = [TLE], tle_orbits::propagate(TLE, offset_seconds(0.0), Coordinate).
Propagate to ECI or ECEF coordinates:
| ?- tle_orbits::propagate(TLE, offset_seconds(600.0), eci, ECI).
| ?- tle_orbits::propagate(TLE, offset_seconds(600.0), ecef, ECEF).
Select the propagation model explicitly:
| ?- tle_orbits::propagate(TLE, offset_seconds(600.0), eci, two_body, ECI).
| ?- tle_orbits::propagate(TLE, offset_seconds(600.0), eci, approximate_near_earth, ECI).
| ?- tle_orbits::propagate(TLE, offset_seconds(600.0), eci, approximate, ECI).
| ?- tle_orbits::propagate(TLE, offset_seconds(43200.0), eci, approximate_deep_space, ECI).
Request propagated state plus velocity:
| ?- tle_orbits::propagate_state(TLE, offset_seconds(600.0), eci, State).
| ?- tle_orbits::propagate_state(TLE, offset_seconds(600.0), wgs84_3d, approximate, State).
Generate a ground track sampled every 10 minutes:
| ?- tle_orbits::ground_track(
TLE,
date_time(2024, 4, 29, 12, 25, 40.0),
date_time(2024, 4, 29, 13, 25, 40.0),
600.0,
Samples
).
Notes
Parsing validates the TLE checksums and rejects malformed records.
The
approximatefamily includes low-order B* drag handling, near-earth short-period corrections, and a separate deep-space approximation with independent solar, lunar, and resonance-aware perturbation terms. It is a portable approximation, not an implementation of standards-grade SGP4/SDP4.State velocity output is no longer estimated using centered finite differences. The library now computes ECI velocity directly from the propagated orbital elements and transforms that velocity analytically to ECEF and local ENU.
Position and velocity frame conversion now share the same Earth-rotation basis to keep propagated state components internally consistent across frames.
The geodetic output path reuses the
crs_projectionslibrary for converting propagatedecef(X,Y,Z)coordinates togeographic/3coordinates.