Berechnen, welche Satellitenpässe sichtbar sind

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?

Vergessen Sie nicht die Sichtbarkeit während der hellen Mondphasen. ;)
Ich mag diese Frage. Der Code dafür wäre eine großartige Ergänzung zu pyephem.

Antworten (2)

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
           }
Gute Arbeit, ich frage mich, ob es eine Möglichkeit gibt, einige dieser Winkelbibliotheken zu verwenden, um Dinge wie Iridium-Flares vorherzusagen . Heavens-oben tut es , aber ich habe immer gedacht, dass da eine nicht triviale Mathematik vor sich geht.

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.

@uhoh Ich mag die gemeldete Genauigkeit von Skyfield und seine Geschwindigkeit mit numpy. Derzeit arbeite ich mit PyEphem auf einem Himbeer-Pi 3B+ und lerne Geduld. Ungefähr 16 Sekunden, um die nächsten ~120 Durchgänge von den SVPOST-TLEs zu erhalten, ohne Ausnahmefehler von None-Werten. Es muss das Suchdatum ab und zu ein paar Mal nach oben verschoben werden, ähnlich wie ich es gerade gepostet habe, um die None(s) zu verlieren. Und die TLEs können, selbst wenn das am besten geeignete TLE-Epochendatum ausgewählt ist, wenn ich es richtig verstehe, immer noch ein oder zwei Kilometer entfernt sein. Völlig genau für meine aktuellen Zwecke. Ich plane einen genaueren Blick auf Skyfield.
Ja. Einer der ersten Kommentare in meinen PyEphem-Projekten lautet: „Denken Sie an UTC und vermeiden Sie die sich ständig ändernden feinen Details der lokalen Zeitzonenpolitik, Datenbanken und des Codes“. Die meisten meiner Python-Projekte sind völlig tz-naiv, wie Harryissacs Code hier, sodass sie vollständig feldportabel sind (keine Internetverbindung erforderlich, um sie auszuführen, außer um meine TLE-Bibliothek zu aktualisieren, bevor ich ins Feld gehe).
Ja, ein weiterer Grund, warum ich Pyephem mag. Einfachheit. Aber ich kann Brandons Arbeit schätzen, ein sehr, sehr genaues Paket zu entwickeln und zu warten, das möglicherweise häufige Online-Updates der einen oder anderen Art erfordert.
Klarstellung ... nach einem Refactoring führt das rpi 3B+ mit Pyephem ~ 120 Durchgänge in ~ 4,5 Sekunden aus, und auch das kann wahrscheinlich weiter verbessert werden. Es liest und durchsucht eine TLE-Bibliothek mit Tausenden von Einträgen, und das ist zweifellos ein guter Prozentsatz dieser Verarbeitungszeit, Lesen, Verarbeiten und Auswählen der am besten geeigneten TLE für jedes Durchgangssuchdatum. Ich wollte die Fähigkeiten des Rpi nicht mit einem so langsamen Bericht ungeklärt bei Pyephem lassen.