Interface to the Predict satellite tracking and orbital prediction library
Project description
PyPredict
NOTE: To preserve compatibility with
predict
, pypredict uses north latitude and west longitude for terrestrial coordinates.
Do you want accurate and time-tested satellite tracking and pass prediction in a convenient python wrapper? You're in the right place.
PyPredict is a C Python extension directly adapted from the ubiquitous predict satellite tracking command line application. Originally written for the commodore 64, predict has a proven pedigree; We just aim to provide a convenient API. PyPredict is a port of the predict codebase and should yield identical results.
If you think you've found an error in pypredict
, please include output from predict
on same inputs to the bug report.
If you think you've found a bug in predict, please report and we'll coordinate with upstream.
Installation
sudo apt-get install python-dev
sudo python setup.py install
Usage
Observe a satellite (relative to a position on earth)
import predict
tle = """0 LEMUR 1
1 40044U 14033AL 15013.74135905 .00002013 00000-0 31503-3 0 6119
2 40044 097.9584 269.2923 0059425 258.2447 101.2095 14.72707190 30443"""
qth = (37.771034, 122.413815, 7) # lat (N), long (W), alt (meters)
predict.observe(tle, qth) # optional time argument defaults to time.time()
# => {'altitude': 676.8782276657903,
# 'azimuth': 96.04762045174824,
# 'beta_angle': -27.92735429908726,
# 'decayed': 0,
# 'doppler': 1259.6041017128405,
# 'eci_obs_x': -2438.227652191655,
# 'eci_obs_y': -4420.154476060397,
# 'eci_obs_z': 3885.390601342013,
# 'eci_sun_x': 148633398.020844,
# 'eci_sun_y': -7451536.44122029,
# 'eci_sun_z': -3229999.50056359,
# 'eci_vx': 0.20076213530665032,
# 'eci_vy': -1.3282146055077213,
# 'eci_vz': 7.377067234096598,
# 'eci_x': 6045.827328897242,
# 'eci_y': -3540.5885778261277,
# 'eci_z': -825.4065096776636,
# 'eclipse_depth': -87.61858291647795,
# 'elevation': -43.711904591801726,
# 'epoch': 1521290038.347793,
# 'footprint': 5633.548906707907,
# 'geostationary': 0,
# 'has_aos': 1,
# 'latitude': -6.759563817939698,
# 'longitude': 326.1137007912563,
# 'name': '0 LEMUR 1',
# 'norad_id': 40044,
# 'orbit': 20532,
# 'orbital_model': 'SGP4',
# 'orbital_phase': 145.3256815318047,
# 'orbital_velocity': 26994.138671706416,
# 'slant_range': 9743.943478523843,
# 'sunlit': 1,
# 'visibility': 'D'
# }
Show upcoming transits of satellite over ground station
# start and stop transit times as UNIX timestamp
transit_start = 1680775200
transit_stop = 1681034400
p = predict.transits(tle, qth, transit_start, transit_stop)
print("Start of Transit\tTransit Duration (s)\tPeak Elevation")
for transit in p:
print(f"{transit.start}\t{transit.duration()}\t{transit.peak()['elevation']}")
Modeling an entire constellation
Generating transits for a lot of satellites over a lot of ground stations can be slow. Luckily, generating transits for each satellite-groundstation pair can be parallelized for a big speed-up.
import itertools
from multiprocessing.pool import Pool
import time
import predict
import requests
# Define a function that returns arguments for all the transits() calls you want to make
def _transits_call_arguments():
now = time.time()
tle = requests.get('http://tle.spire.com/25544').text.rstrip()
for latitude in range(-90, 91, 15):
for longitude in range(-180, 181, 15):
qth = (latitude, longitude, 0)
yield {'tle': tle, 'qth': qth, 'ending_before': now+60*60*24*7}
# Define a function that calls the transit function on a set of arguments and does per-transit processing
def _transits_call_fx(kwargs):
try:
transits = list(predict.transits(**kwargs))
return [t.above(10) for t in transits]
except predict.PredictException:
pass
# Map the transit() caller across all the arguments you want, then flatten results into a single list
pool = Pool(processes=10)
array_of_results = pool.map(_transits_call_fx, _transits_call_arguments())
flattened_results = list(itertools.chain.from_iterable(filter(None, array_of_results)))
transits = flattened_results
NOTE: If precise accuracy isn't necessary (for modeling purposes, for example) setting the tolerance argument
to the above
call to a larger value, say 1 degree, can provide a significant performance boost.
Call predict analogs directly
predict.quick_find(tle.split('\n'), time.time(), (37.7727, 122.407, 25))
predict.quick_predict(tle.split('\n'), time.time(), (37.7727, 122.407, 25))
API
observe(tle, qth[, at=None]) Return an observation of a satellite relative to a groundstation. qth groundstation coordinates as (lat(N),long(W),alt(m)) If at is not defined, defaults to current time (time.time()) Returns an "observation" or dictionary containing: altitude _ altitude of satellite in kilometers azimuth - azimuth of satellite in degrees from perspective of groundstation. beta_angle decayed - 1 if satellite has decayed out of orbit, 0 otherwise. doppler - doppler shift between groundstation and satellite. eci_obs_x eci_obs_y eci_obs_z eci_sun_x eci_sun_y eci_sun_z eci_vx eci_vy eci_vz eci_x eci_y eci_z eclipse_depth elevation - elevation of satellite in degrees from perspective of groundstation. epoch - time of observation in seconds (unix epoch) footprint geostationary - 1 if satellite is determined to be geostationary, 0 otherwise. has_aos - 1 if the satellite will eventually be visible from the groundstation latitude - north latitude of point on earth directly under satellite. longitude - west longitude of point on earth directly under satellite. name - name of satellite from first line of TLE. norad_id - NORAD id of satellite. orbit orbital_phase orbital_model orbital_velocity slant_range - distance to satellite from groundstation in meters. sunlit - 1 if satellite is in sunlight, 0 otherwise. visibility transits(tle, qth[, ending_after=None][, ending_before=None]) Returns iterator of Transit objects representing passes of tle over qth. If ending_after is not defined, defaults to current time If ending_before is not defined, the iterator will yield until calculation failure.
NOTE: We yield passes based on their end time. This means we'll yield currently active passes in the two-argument invocation form, but their start times will be in the past.
Transit(tle, qth, start, end) Utility class representing a pass of a satellite over a groundstation. Instantiation parameters are parsed and made available as fields. duration() Returns length of transit in seconds peak(epsilon=0.1) Returns epoch time where transit reaches maximum elevation (within ~epsilon) at(timestamp) Returns observation during transit via quick_find(tle, timestamp, qth) aboveb(elevation, tolerance) Returns portion of transit above elevation. If the entire transit is below the target elevation, both endpoints will be set to the peak and the duration will be zero. If a portion of the transit is above the elevation target, the endpoints will be between elevation and elevation + tolerance (unless endpoint is already above elevation, in which case it will be unchanged) quick_find(tle[, time[, (lat, long, alt)]]) time defaults to current time (lat, long, alt) defaults to values in ~/.predict/predict.qth Returns observation dictionary equivalent to observe(tle, time, (lat, long, alt)) quick_predict(tle[, time[, (lat, long, alt)]]) Returns an array of observations for the next pass as calculated by predict. Each observation is identical to that returned by quick_find.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
File details
Details for the file pypredict-1.7.2.tar.gz
.
File metadata
- Download URL: pypredict-1.7.2.tar.gz
- Upload date:
- Size: 48.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c2a7889102a6c7a579b7b8704b491f63b60162810e89b72d09eff0d975ed3beb |
|
MD5 | 590fafb2fd8d0ca80cfd50eaf7d189d5 |
|
BLAKE2b-256 | 70f2e1041deefb8ba480547877e6d8d65c2084fdf9ca69a0df21d9bcfc3f6cbd |
File details
Details for the file pypredict-1.7.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: pypredict-1.7.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 123.2 kB
- Tags: CPython 3.11, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a10b4ffdee63b8bf18a9917eb68f1a905647a9738803017a4f3f576c6b8cf51c |
|
MD5 | de54f1f8dde4896311344bb694828a6b |
|
BLAKE2b-256 | a474e36082e3b731e2effa938a10ae8be611db9d29499c78053ceddaa80623cb |
File details
Details for the file pypredict-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: pypredict-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 123.2 kB
- Tags: CPython 3.10, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cc06aaec93c5645fdfd5c556632adde4d5b741d8e32f46f03b6a439a2e9a5dce |
|
MD5 | a8ffc7bd98b2ffc62553e8432c4210ce |
|
BLAKE2b-256 | d536885f69ad5228606ad947e079e838e186ade0ec73a36227933644e400700c |
File details
Details for the file pypredict-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: pypredict-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 123.1 kB
- Tags: CPython 3.9, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 36046b4c9484627eb3d7591ea6c9eb6ac4a80a905123fea6d469f241b7e7496e |
|
MD5 | c22fc1e5c9dcd5ed142db4b80eb945cf |
|
BLAKE2b-256 | 45c9404a312e6afdf196d999baee1fca36ed668ef5a715d9205615124835018f |
File details
Details for the file pypredict-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: pypredict-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 123.3 kB
- Tags: CPython 3.8, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d6d00d263a5449c3a37325e64f264e864ffb6f6be8c15851ea3fb6746722e8c4 |
|
MD5 | b7626878236e1bbc6d1d365d0cc7871f |
|
BLAKE2b-256 | 49e3b73920ba9230d32de78f02592f0de880410624f64747b2275b6084fe9e75 |
File details
Details for the file pypredict-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
.
File metadata
- Download URL: pypredict-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 122.9 kB
- Tags: CPython 3.7m, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e58ed1a87f6067edcbe55ea9a4e2bb4d37baf4d6afa846629b4cfb5815c1c12d |
|
MD5 | fc585b47c336d737b2136c7cb94e7445 |
|
BLAKE2b-256 | 53c8af141af35f1663f41598a7fb8f986afba8ac0f6259b9086134349d981825 |
File details
Details for the file pypredict-1.7.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl
.
File metadata
- Download URL: pypredict-1.7.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl
- Upload date:
- Size: 108.5 kB
- Tags: CPython 2.7mu, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7e4c556abab554b4334ee3b6bc7ab8515a1dfbc103f85ba0407b88ca773c723a |
|
MD5 | be65958b460798ccbc6bc0f5a4977777 |
|
BLAKE2b-256 | 1a0dd0f5fd120a93a3ade184f2b9307850840ace4c7511804f9481a261d6714a |
File details
Details for the file pypredict-1.7.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
.
File metadata
- Download URL: pypredict-1.7.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl
- Upload date:
- Size: 108.5 kB
- Tags: CPython 2.7m, manylinux: glibc 2.5+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 24aaaeb982fd2747e6944e6aa0d5fa267530d8fcea20355467ebae2a5e46f920 |
|
MD5 | c04b8a67544441c2caaab5d768679e79 |
|
BLAKE2b-256 | 50f84a3a6e89583f0b952dbed141018102670bfa1c374c017acc0d440a5db168 |