Skip to main content

Python bindings for astroz - high-performance astrodynamics library

Project description

astroz Python Bindings

High-performance SGP4/SDP4 satellite propagation, powered by Zig with SIMD acceleration (AVX512/AVX2). Automatically handles both near-earth and deep-space satellites.

Platforms: macOS, Linux | Requires: Python 3.10+

Quick Start

python-sgp4 Compatible API (Recommended)

Drop-in replacement for python-sgp4:

from astroz.api import Satrec, SatrecArray, jday, WGS72
import numpy as np

# Single satellite (same syntax as python-sgp4)
sat = Satrec.twoline2rv(line1, line2, WGS72)
jd, fr = jday(2024, 5, 6, 12, 0, 0.0)
error, position, velocity = sat.sgp4(jd, fr)

# Batch propagation (270-330M props/sec with SIMD)
sat_array = SatrecArray(satrecs)
e, r, v = sat_array.sgp4(jd, fr)  # Scalars or arrays

# Skip velocities for 30% faster propagation
e, r, _ = sat_array.sgp4(jd_array, fr_array, velocities=False)

High-Level API

from astroz import propagate
import numpy as np

# Load and propagate - automatically optimized for 300M+ props/sec
positions = propagate("starlink", np.arange(1440))  # 1 day at 1-min intervals
# positions: (1440, num_satellites, 3) in km, ECEF coordinates

Loading Sources

from astroz import propagate, Constellation

# CelesTrak groups
positions = propagate("starlink", times)
positions = propagate("iss", times)
positions = propagate("gps", times)
positions = propagate("all", times)  # ~13k active satellites

# By NORAD ID
positions = propagate(None, times, norad_id=25544)  # ISS
positions = propagate(None, times, norad_id=[25544, 48274])  # Multiple

# Local file or URL
positions = propagate("satellites.tle", times)
positions = propagate("https://example.com/tles.txt", times)

# For repeated propagation, pre-parse to avoid overhead
c = Constellation("starlink")
positions1 = propagate(c, times1)
positions2 = propagate(c, times2)

Groups: all, starlink, oneweb, planet, spire, gps, glonass, galileo, beidou, stations/iss, weather, geo

Propagation

from astroz import propagate, Constellation
from datetime import datetime, timezone
import numpy as np

times = np.arange(1440)  # 1 day at 1-min intervals

# Simple (defaults: now UTC, ECEF output)
positions = propagate("starlink", times)

# With options
positions = propagate(
    "starlink",
    np.arange(14 * 1440),  # 2 weeks
    start_time=datetime(2024, 6, 1, tzinfo=timezone.utc),
    output="geodetic",  # "ecef" (default), "teme", or "geodetic"
)

# With velocities
positions, velocities = propagate("starlink", times, velocities=True)

Conjunction Screening

from astroz import screen
import numpy as np

times = np.arange(1440)

# Single target (fastest - uses fused propagate+screen, no full position array)
min_dists, min_t_indices = screen("starlink", times, threshold=50.0, target=0)
# Returns per-satellite minimum distance to target and time index

# All-vs-all screening
pairs, t_indices = screen("starlink", times, threshold=10.0)
# Returns all conjunction events within threshold

Migrating from python-sgp4

Step 1: Change the Import (2x faster)

# Before
from sgp4.api import Satrec, SatrecArray, jday

# After
from astroz.api import Satrec, SatrecArray, jday

That's it. Your existing code works unchanged and runs 2x faster.

Step 2: Use Batch Methods (5-12x faster)

If you have loops, switch to batch methods:

# Before: loop (1.3M props/sec)
results = []
for jd, fr in zip(jd_list, fr_list):
    e, r, v = sat.sgp4(jd, fr)
    results.append(r)

# After: batch (15M props/sec) - 12x faster
jd_array = np.array(jd_list)
fr_array = np.array(fr_list)
e, r, v = sat.sgp4_array(jd_array, fr_array)

Step 3: Use SatrecArray for Multiple Satellites (100x faster)

# Before: loop over satellites (1.3M props/sec)
for sat in satellites:
    e, r, v = sat.sgp4_array(jd, fr)

# After: batch all satellites (290M props/sec) - 100x faster
sat_array = SatrecArray(satellites)
e, r, v = sat_array.sgp4(jd, fr)

Step 4: Skip Velocities If Not Needed (30% faster)

# If you only need positions
e, r, _ = sat_array.sgp4(jd, fr, velocities=False)

Performance Summary

Pattern python-sgp4 astroz Speedup
sat.sgp4() loop 1.3M/s 2.5M/s 2x
sat.sgp4_array() 2.7M/s 15M/s 5x
SatrecArray.sgp4() 3M/s 290M/s 100x

Compatibility Notes

astroz supports the core python-sgp4 API for satellite propagation. Some rarely-used attributes are not implemented:

  • TLE metadata: classification, intldesg, elnum, revnum, ephtype
  • Intermediate elements: Om, am, em, im, mm, nm, om (osculating elements after propagation)
  • Element rates: argpdot, mdot, nodedot
  • Gravity constants: j2, j3, j4, mu, etc. (available via astroz.constants)

For typical satellite tracking and visualization, astroz is a full drop-in replacement.

Performance

Constellation (13,478 sats x 1,440 steps) Throughput
1 thread 37.7M props/sec
16 threads 303M props/sec

Benchmarked on AMD Ryzen 7 7840U with AVX512.

Set ASTROZ_THREADS to control thread count (defaults to all cores).

Orbital Mechanics

from astroz import (
    hohmann_transfer, bi_elliptic_transfer, lambert,
    orbital_velocity, orbital_period, escape_velocity,
    EARTH_MU,
)

# Hohmann transfer: LEO (400 km) to GEO
result = hohmann_transfer(EARTH_MU, 6778, 42164)
print(f"Total ΔV: {result['total_dv']:.3f} km/s")
print(f"Transfer time: {result['transfer_time_days']:.2f} days")

# Bi-elliptic transfer (more efficient for large radius ratios)
result = bi_elliptic_transfer(EARTH_MU, 6778, 42164, 100000)
print(f"Total ΔV: {result['total_dv']:.3f} km/s")

# Lambert solver: find transfer orbit between two positions
r1 = (7000.0, 0.0, 0.0)
r2 = (0.0, 7000.0, 0.0)
tof = 3600.0  # 1 hour
result = lambert(EARTH_MU, r1, r2, tof)
print(f"Departure velocity: {result['departure_velocity']}")

# Orbital velocity, period, escape velocity
v = orbital_velocity(EARTH_MU, 6778)          # Circular orbit at 400 km
T = orbital_period(EARTH_MU, 6778)            # Period in seconds
v_esc = escape_velocity(EARTH_MU, 6778)       # Escape velocity

Numerical Propagation

Propagate orbits with perturbation models (J2, atmospheric drag) using RK4 or Dormand-Prince 8(7) adaptive integrators. r_eq is required when using J2 or drag perturbations. Drag uses an exponential Earth atmosphere model (sea-level density 1.225 kg/m^3, scale height 7.249 km, cutoff altitude 1500 km). drag_area is in m^2 and drag_mass in kg.

from astroz import propagate_numerical, EARTH_MU, EARTH_J2, EARTH_R_EQ

# Initial state: LEO circular orbit [x, y, z, vx, vy, vz] (km, km/s)
state = (6778.0, 0.0, 0.0, 0.0, 7.668, 0.0)

# Two-body propagation (1 orbit, 60s steps)
times, states = propagate_numerical(state, 0.0, 5554.0, 60.0, EARTH_MU)

# With J2 perturbation
times, states = propagate_numerical(
    state, 0.0, 5554.0, 60.0, EARTH_MU,
    j2=EARTH_J2, r_eq=EARTH_R_EQ,
)

# With J2 + atmospheric drag
times, states = propagate_numerical(
    state, 0.0, 86400.0, 60.0, EARTH_MU,
    j2=EARTH_J2, r_eq=EARTH_R_EQ,
    drag_cd=2.2, drag_area=10.0, drag_mass=500.0,
    integrator="dp87",  # or "rk4"
)

Constants

from astroz import EARTH_MU, EARTH_R_EQ, EARTH_J2, SUN_MU, MOON_MU

print(f"Earth μ: {EARTH_MU} km³/s²")
print(f"Earth radius: {EARTH_R_EQ} km")
print(f"Earth J2: {EARTH_J2}")
print(f"Sun μ: {SUN_MU} km³/s²")
print(f"Moon μ: {MOON_MU} km³/s²")

Building

Requires Zig and Python 3.10+.

cd bindings/python
pip install -e .

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

astroz-0.10.1-cp314-cp314-manylinux_2_36_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.36+ x86-64

astroz-0.10.1-cp314-cp314-macosx_15_0_universal2.whl (1.1 MB view details)

Uploaded CPython 3.14macOS 15.0+ universal2 (ARM64, x86-64)

astroz-0.10.1-cp313-cp313-manylinux_2_36_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.36+ x86-64

astroz-0.10.1-cp313-cp313-macosx_15_0_universal2.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 15.0+ universal2 (ARM64, x86-64)

astroz-0.10.1-cp312-cp312-manylinux_2_36_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.36+ x86-64

astroz-0.10.1-cp312-cp312-macosx_15_0_universal2.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 15.0+ universal2 (ARM64, x86-64)

astroz-0.10.1-cp311-cp311-manylinux_2_36_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.36+ x86-64

astroz-0.10.1-cp311-cp311-macosx_15_0_universal2.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 15.0+ universal2 (ARM64, x86-64)

astroz-0.10.1-cp310-cp310-manylinux_2_36_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.36+ x86-64

File details

Details for the file astroz-0.10.1-cp314-cp314-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp314-cp314-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 fcedef34be3b25ae61b7efd326478d5a57f661ffe140c45503ab7d365e8de73b
MD5 ebb7e2c7dc1a81fd3da40d758c8369b9
BLAKE2b-256 2439fd8d25af8af316de98fe32e4c354587bac48762c1613b469fec60a1c2bf1

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp314-cp314-manylinux_2_36_x86_64.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.10.1-cp314-cp314-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp314-cp314-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 d5db217bf5c93f4905425b33c70cd5e3f11cd2aee15e78e6d9f2c2a366715321
MD5 2a006db18f55fc49a8d42bfaef4ec2f8
BLAKE2b-256 7e9fafaec5f0ef698909293e1f13a535076a431657299eb777afc51d1279c35e

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp314-cp314-macosx_15_0_universal2.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.10.1-cp313-cp313-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp313-cp313-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 34b45502354cd74ea835f1d2e5ab00449dfce7e4694f74ca41cc8209322ffc43
MD5 d015a32c5788ddd1478205be5a047b88
BLAKE2b-256 8dcab17a0a4bf703d7d0446bf11e61cb0f85bb86ead68952c31c2fdf465168a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp313-cp313-manylinux_2_36_x86_64.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.10.1-cp313-cp313-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp313-cp313-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 844a90683917104185132132c193b0c515da0d76b768273138cbbda74996bd77
MD5 32f2467c30bcb09e019a4601c5e2b887
BLAKE2b-256 48b1e33f73bd2f51cc4b7a7158ac5711fb961d0bb3db391c4ab29595e8c58b4a

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp313-cp313-macosx_15_0_universal2.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.10.1-cp312-cp312-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp312-cp312-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 cf067c2969063d14ae9702f93d6ba8de8c9f7901cbd3ab655cd9ba82ac095a64
MD5 d511a35fa6bc7989ab5cecae54be4be5
BLAKE2b-256 353b4340bb33b64cd4d976f8bc28e02dd0cc677cdbd07d578dfa2ca9da56573e

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp312-cp312-manylinux_2_36_x86_64.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.10.1-cp312-cp312-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp312-cp312-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 4d433d7594a2637628968d419ae0896ad500e990b35cd785f631db6f8ac7138f
MD5 39e1942f434b8f290c7ff00e4eec132a
BLAKE2b-256 d6180102b8eef4e934ccd44de287cd4d33b0cefe2b34b0c1eba9263e3285179a

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp312-cp312-macosx_15_0_universal2.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.10.1-cp311-cp311-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp311-cp311-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 574e7db8cc480e95345e162ee296e1cc48215ad2bf65d04d8173947c2d58a2af
MD5 8b4cfac473192bb23398cc30aea43714
BLAKE2b-256 da4c50cd712e5cea6d83796da6d9f52c8ace2d391e823dc40f1b51998f22b222

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp311-cp311-manylinux_2_36_x86_64.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.10.1-cp311-cp311-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp311-cp311-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 0b48f64abd4ea7433c2cf32fc3afb0b8e70fac73dd0996573afb907150888053
MD5 8c5d1ca3cbe15cb37b3becb23b879eec
BLAKE2b-256 3b944fd3260c508df97ec2e94860beb1862e4c8b2b816825ba342a7f148205ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp311-cp311-macosx_15_0_universal2.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.10.1-cp310-cp310-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for astroz-0.10.1-cp310-cp310-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 470b3dfc16086a840b4840773eeb7d454fc61177f3b01e638e2354501adaa4b5
MD5 4335d7bc55620ab34fa6912f337d8ee8
BLAKE2b-256 67af8492b327ff6b0d3c8de2ec669b066fa700b28647a492bee80ce38b19dc3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.10.1-cp310-cp310-manylinux_2_36_x86_64.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page