Skip to content
ATTronPublic

About

Astrodynamics and Spacecraft Toolkit. Features fast orbit prop, celestial precession, CCSDS parsing, RF parsing, fits image parsing, and more!

Topics

Resources

Stars

276 stars

Watchers

2 watching

Forks

Repository files navigation

Continuous Integration API Docs

Astronomical and Spacecraft Toolkit Written in Zig

astroz is an astrodynamics and spacecraft toolkit with a fast SGP4/SDP4 propagator at its core.

Orbital Mechanics Spacecraft Ops Astronomy
SGP4/SDP4 propagation CCSDS packets FITS parsing
TLE & OMM parsing VITA49 packets WCS coordinates
Orbital maneuvers Attitude determination Star precession
Force models (J2-J4, drag, SRP, third-body) CSPICE ephemeris Celestial bodies
Dormand-Prince 8(7) integrator Monte Carlo sims

Performance

SGP4 (near-earth) or SDP4 (deep-space) is picked per satellite from its orbital period. Satellites are propagated 8 at a time with SIMD (AVX512, or AVX2/SSE at 4 wide), and constellations are split across threads in time-major order. ASTROZ_THREADS sets the thread count; the default is every available core.

Single-Threaded (1.2M propagations, single satellite)

Implementation Props/sec Speedup vs python-sgp4
astroz 30.8M 11x
Rust sgp4 5.1M 1.8x
heyoka 3.8M 1.3x
satkit 3.5M 1.2x
python-sgp4 2.8M 1x

Multi-Threaded Constellation (13,478 satellites × 1,440 times)

Implementation 1 Thread 16 Threads
astroz 37.7M/s 303M/s
heyoka 15.7M/s 155.6M/s
Rust sgp4 (rayon) 4.4M/s 47.9M/s
satkit 3.5M/s 3.5M/s
python-sgp4 2.7M/s 2.7M/s

Measured on an AMD Ryzen 7 7840U (16 threads), each implementation in its fastest configuration (SIMD, pre-allocated outputs, batch mode). The scripts for astroz, Rust sgp4 and python-sgp4 are in benchmarks/ (see the Justfile).

The Cesium visualization example propagates the whole active catalog (about 13,000 satellites) at interactive rates. There is a live demo.

Accuracy

What the test suite checks (zig build test):

Component Reference Tolerance
SGP4 Vallado AIAA 2006-6753 vectors 10 m position, 1 mm/s velocity
SDP4 (GPS, GEO, HEO) python-sgp4 10 m position
SGP4 over one day python-sgp4 100 m position, 0.1 m/s velocity
J2 acceleration Analytical 1%
Two-body propagation Analytical Kepler 1 m after one orbit
Two-body energy Conservation 1e-10 relative over 100 orbits

CI also checks the Python bindings against python-sgp4 to within 1 m.

With CSPICE enabled: zig build test -Denable-cspice=true

Python

Wheels are published for Linux (x86_64, arm64) and macOS (arm64), Python 3.10 to 3.14:

pip install astroz

astroz.api follows the python-sgp4 API and also handles deep-space (SDP4) satellites:

from astroz.api import Satrec, jday, WGS72

line1 = "1 25544U 98067A   24127.82853009  .00015698  00000+0  27310-3 0  9995"
line2 = "2 25544  51.6393 160.4574 0003580 140.6673 205.7250 15.50957674452123"
sat = Satrec.twoline2rv(line1, line2, WGS72)

jd, fr = jday(2024, 5, 6, 12, 0, 0.0)
error, position, velocity = sat.sgp4(jd, fr)

The Python README covers batch propagation, the high-level propagate/screen API, orbital mechanics helpers and numbers for migrating from python-sgp4.

Usage

Requires Zig 0.17.0.

  • Fetch the package so it gets recorded in your build.zig.zon. Pin a release tag or commit for reproducible builds, or follow the latest main:
# pinned to a tag or commit
zig fetch --save https://github.com/ATTron/astroz/archive/<tag-or-commit>.tar.gz

# latest main
zig fetch --save git+https://github.com/ATTron/astroz
  • Wire the astroz module into your compile step in build.zig:
const astroz = b.dependency("astroz", .{ .target = target, .optimize = optimize });
exe.root_module.addImport("astroz", astroz.module("astroz"));
  • Propagate a satellite. Satellite picks SGP4 or SDP4 for you:
const astroz = @import("astroz");

var tle = try astroz.Tle.parse(tle_string, allocator);
defer tle.deinit();

const sat = try astroz.Satellite.init(tle, astroz.constants.wgs84);
const result = try sat.propagate(60.0); // minutes from epoch
const pos = result[0]; // [x, y, z] km
const vel = result[1]; // [vx, vy, vz] km/s

Examples

Run them all with zig build example, or only compile them with zig build build-examples.

Zig

  • sgp4.zig: TLE and OMM parsing (including six-digit catalog numbers), SGP4 one time and eight at once with SIMD, Satellite picking SGP4 or SDP4, and the Earth-fixed position.

  • constellation.zig: a mixed near-earth and deep-space constellation propagated in batches, then screened for close approaches with Screening.

  • numerical_propagation.zig: one orbit propagated with two-body (RK4 and Dormand-Prince 8(7)), with J2, and with J2, solar radiation pressure and Sun/Moon gravity. Uses SPICE ephemeris when built with -Denable-cspice=true after zig build fetch-kernels.

  • spacecraft.zig: impulse, plane change and phase change maneuvers and how they change the orbit, then attitude propagation.

  • mission_design.zig: Earth to Mars by Hohmann and bi-elliptic transfer, the transfer propagated, and Monte Carlo statistics on it.

  • packets.zig: building and parsing CCSDS packets and parsing a VITA 49 stream.

  • astronomy.zig: star precession and reading a FITS image into a PNG.

    sample FITS image rendered as PNG

Python

  • python_sgp4.py: the python-sgp4 compatible API.
  • constellation.py: loading a constellation from CelesTrak or a TLE/OMM file, propagating to Earth-fixed and geodetic coordinates, and screening it for close approaches.
  • orbital_mechanics.py: circular-orbit numbers, Hohmann and bi-elliptic transfers, Lambert's problem and numerical propagation with J2.
  • Cesium visualization (live demo): the active catalog propagated and rendered in Cesium.

About

Astrodynamics and Spacecraft Toolkit. Features fast orbit prop, celestial precession, CCSDS parsing, RF parsing, fits image parsing, and more!

Topics

Resources

Stars

276 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages