Mit der Python-Bibliothek pyephem berechne ich Pässe für die ISS basierend auf TLE-Daten und meinem Lat / Long, aber wie kann ich feststellen, welche der vielen Pässe, die es pro Tag zurückgibt, sichtbar sind?
Ich verstehe, dass Satelliten nur bei Sonnenauf- oder -untergang sichtbar sind, aber gibt es eine systematische Methode, um zu berechnen, ob ein Pass in dem Zeitbereich liegt, in dem er sichtbar sein könnte?
Nach einigen Recherchen habe ich die Antwort auf mein Problem auf Celestrak gefunden. Sie haben einen großartigen Artikel darüber, den ich hier zusammenfassen werde, aber wenn Sie daran interessiert sind, sollten Sie ihn hier lesen .
Es gibt 3 Hauptanforderungen, damit ein Satellit sichtbar ist:
• The satellite must be above the observer's horizon.
• The sun must be below the observer's horizon enough to darken the sky.
• The satellite must be illuminated by the sun.
Den ersten Punkt können wir ignorieren, da ein von einer Bibliothek oder Website berechneter Pass per Definition über dem Horizont liegen muss, damit es sich um einen Pass über den angegebenen Ort handelt.
Dieser zweite Punkt ist entscheidend für das, was mich interessiert. Die Sonne muss mindestens -6˚ unter dem Horizont stehen, damit es dunkel genug ist, dass das vom Satelliten reflektierte Licht der Sonne relativ zum Himmel hell genug ist, um hervorzustechen , das nennt man die nautische Dämmerung. Die Sonne muss also untergegangen sein, darf aber auch nicht unter -18˚ stehen, sonst gelangt nicht genug Sonnenlicht zum Satelliten, um sichtbar zu werden. Aus diesem Grund können Sie Satelliten nur für einige Stunden in der Morgen- oder Abenddämmerung sehen.
Der dritte Punkt ist, dass das Objekt nicht von der Erde verdunkelt werden darf. Wenn Sie Pyephem oder eine andere Bibliothek, die dies berechnet, nicht verwenden, empfehle ich Ihnen dringend, ihren Artikel zu lesen, in dem detailliert beschrieben wird, wie es berechnet wird. Da pyephem berechnet, ob das Objekt verfinstert ist, werde ich hier nicht auf die Mathematik eingehen und einfach sagen, dass dies zum Beispiel mit iss.eclipsed gefunden werden kann.
Um dies alles zusammenzufügen, kann man mit pyephem den nächsten Pass finden und ob er so sichtbar ist:
def seconds_between(d1, d2):
return abs((d2 - d1).seconds)
def datetime_from_time(tr):
year, month, day, hour, minute, second = tr.tuple()
dt = datetime.datetime(year, month, day, hour, minute, int(second))
return dt
def get_next_pass(lon, lat, alt, tle):
sat = ephem.readtle(str(tle[0]), str(tle[1]), str(tle[2]))
observer = ephem.Observer()
observer.lat = str(lat)
observer.long = str(lon)
observer.elevation = alt
observer.pressure = 0
observer.horizon = '-0:34'
now = datetime.datetime.utcnow()
observer.date = now
tr, azr, tt, altt, ts, azs = observer.next_pass(sat)
duration = int((ts - tr) *60*60*24)
rise_time = datetime_from_time(tr)
max_time = datetime_from_time(tt)
set_time = datetime_from_time(ts)
observer.date = max_time
sun = ephem.Sun()
sun.compute(observer)
sat.compute(observer)
sun_alt = degrees(sun.alt)
visible = False
if sat.eclipsed is False and -18 < degrees(sun_alt) < -6 :
visible = True
return {
"rise_time": timegm(rise_time.timetuple()),
"rise_azimuth": degrees(azr),
"max_time": timegm(max_time.timetuple()),
"max_alt": degrees(altt),
"set_time": timegm(set_time.timetuple()),
"set_azimuth": degrees(azs),
"elevation": sat.elevation,
"sun_alt": sun_alt,
"duration": duration,
"visible": visible
}
Meine vorgeschlagene Verbesserung von Harryissacs Code wird angeboten, um alle Ausnahmen zu beseitigen, die durch einen None -Wert verursacht werden (der gelegentlich ohne diesen Fix auftritt ). Dies ist nur ein Ausschnitt, der die Möglichkeit einer Ausnahme von allen None-Tupelwerten ausschließt. Dies erschien mir zu lang, um einen Kommentar abzugeben, also biete ich es hier an.
Dies sollte alles um eine Ebene eingerückt sein, um mit Harrys Code übereinzustimmen. Entschuldigung, dass Sie mit der Formatierung hier noch nicht so vertraut sind. Nach diesem Teil des Codes von harryissac:
now = datetime.datetime.utcnow()
observer.date = now
tr, azr, tt, altt, ts, azs = observer.next_pass(sat)
Fügen Sie diesen Code mit oder ohne Kommentare ein. Die Kommentare helfen zu erklären:
# --- improvement to eliminate any None values -- START ------------
while (tr == None or
tt == None or
ts == None or
ts < tr
):
# Sometimes PyEphem needs a nudge to a later time in order for
# next_pass() to be fully populated with valid data. Therefore
# as long as there remains any None value returned, continue to
# re-compute in 15 minute jumps until any None is replaced with
# valid data. 15 minute jumps should produce a fully populated
# tuple before yet another pass begins. A valid time should
# ensure a valid azimuth as well. This fix catches all the
# Exceptions I 'have' encountered in similar earth satellite
# code, such as for ISS, when using PyEphem.
observer.date = now + datetime.timedelta(minutes=15)
sat.compute(observer)
tr, azr, tt, altt, ts, azs = observer.next_pass(sat)
# --- improvement to eliminate any None values -- END --------------
Wenn jemand eine kürzere Version oder Korrektur hat, machen Sie weiter und kommentieren Sie.
Wenn eine vollständigere Erklärung gewünscht wird, warum diese Korrektur erforderlich ist, posten Sie einen Kommentar und ich werde eine ausführlichere Erklärung bearbeiten. Die PyEphem-Dokumentation warnt vor möglichen None-Werten, wenn next_pass für Erdsatelliten verwendet wird.
Brandon Rhodes hat uns ein funktionsreiches PyEphem-Paket gegeben, indem er einen Python-Wrapper um den Xephem-Code von Elwood Downey gelegt hat. Es ist definitiv ein nützlicher Vorteil zu wissen, wann ein None anstelle eines anderen erwarteten Werts zurückgegeben werden kann.
TildalWelle
Stu