a set of script to predict passes and make automated recordings of satellites. Intended to be run headless on an SoC.
Original forked from https://github.com/va7eex/Pi_WXRX
Improvements made for https://keet.space
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.8 KiB
89 lines
2.8 KiB
import requests
|
|
import json
|
|
import array
|
|
import sys
|
|
#Where we pull the data from.
|
|
web_tle = [ 'http://www.celestrak.com/NORAD/elements/weather.txt', 'https://www.celestrak.com/NORAD/elements/stations.txt' ]
|
|
|
|
#celestrak uses a different key value than I do, find all instances of their keys and replace with mine.
|
|
sats_of_interest = { 'NOAA-15':'NOAA 15', 'NOAA-18':'NOAA 18', 'NOAA-19':'NOAA 19', 'METEOR-M1':'METEOR-M 1', 'METEOR-M2':'METEOR-M 2', 'ISS':'ISS (ZARYA)' }
|
|
|
|
#NOAA 15 [B]
|
|
#1 25338U 98030A 16173.50363904 .00000079 00000-0 52195-4 0 9991
|
|
#2 25338 98.7825 177.6616 0010829 167.3279 192.8174 14.25734916941605
|
|
|
|
data = {}
|
|
line_num = 0
|
|
cur_sat_line = -1
|
|
cur_sat = ""
|
|
|
|
#This was originally intended to check that the data I was receiving was legitimate, very half-assed.
|
|
def check_line1(str):
|
|
if( len(str) == 69 ):
|
|
fields = {}
|
|
fields['line number'] = int(str[0:1])
|
|
fields['satellite number + classification'] = str[3:9]
|
|
fields['international designator'] = str[10:17]
|
|
fields['epoch'] = float(str[19:32])
|
|
fields['1st mean motion'] = float(str[34:43])
|
|
fields['2nd mean motion'] = str[45:52]
|
|
fields['BSTAR drag term'] = str[54:61]
|
|
fields['the number 0'] = int(str[62:63])
|
|
fields['element set number + checksum'] = int(str[65:69])
|
|
|
|
else:
|
|
return False
|
|
return True
|
|
|
|
def check_line2(str):
|
|
if( len(str) == 69 ):
|
|
fields = {}
|
|
fields['line number'] = str[0:1]
|
|
fields['satellite number'] = str[3:7]
|
|
fields['inclination'] = str[9:16]
|
|
fields['right ascension'] = str[18:25]
|
|
fields['eccentricity'] = str[27:33]
|
|
fields['argument of perigee'] = str[35:42]
|
|
fields['mean anomaly'] = str[44:51]
|
|
fields['mean motion + revolution number + checksum'] = str[53:69]
|
|
print fields
|
|
return fields
|
|
|
|
for field, data in fields.iteritems():
|
|
if( not float(data).isnum() ):
|
|
print field, data, "is not an number!"
|
|
return False
|
|
else:
|
|
return False
|
|
return True
|
|
|
|
for tle in web_tle:
|
|
page = requests.get(tle, stream=True)
|
|
for line in page.iter_lines():
|
|
#I don't actually remember why I made this var 'hsat'
|
|
for hsat, sat in sats_of_interest.iteritems():
|
|
if( line.startswith(sat) ):
|
|
cur_sat_line = line_num
|
|
cur_sat = hsat
|
|
|
|
#Enable this for data integrity check if you want.
|
|
if( line_num == cur_sat_line + 1 and cur_sat_line >= 0 ):
|
|
if( check_line1(line) ):
|
|
data[cur_sat] = line
|
|
# else:
|
|
# sys.exit("Malformed Data (Line 1), Exiting. " + line)
|
|
|
|
if( line_num == cur_sat_line + 2 and cur_sat_line >= 0 ):
|
|
if( check_line2(line) ):
|
|
data[cur_sat] = data[cur_sat] + '\n' + line
|
|
# else:
|
|
# sys.exit("Malformed Data (Line 2), Exiting. " + line)
|
|
|
|
line_num = line_num + 1
|
|
|
|
|
|
for s, tle in data.iteritems():
|
|
print s, '\n', tle
|
|
|
|
with open('sat_tle.txt', 'w') as fp:
|
|
json.dump(data, fp)
|
|
|