Calcular qué pases de satélite son visibles

Usando la biblioteca de Python pyephem, estoy calculando los pases para la ISS en función de los datos de TLE y mi latitud/longitud, pero ¿cómo puedo saber cuáles de los muchos pases que devuelve por día son visibles?

Entiendo que los satélites solo son visibles alrededor del amanecer o el atardecer, pero ¿hay alguna forma sistemática de calcular si un pase está o no en el rango de tiempo en el que podría ser visible?

No te olvides de la visibilidad durante las fases brillantes de la Luna. ;)
Me gusta esta pregunta. El código para hacer esto sería una gran adición a pyephem.

Respuestas (2)

Después de investigar un poco, encontré la respuesta a mi problema en Celestrak. Tienen un excelente artículo sobre exactamente esto que resumiré aquí, aunque si estás interesado en hacerlo, deberías leerlo aquí .

Hay 3 requisitos principales para que un satélite sea visible:

• 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.

Podemos ignorar el primer punto porque, por definición, un pase calculado por cualquier biblioteca o sitio web tiene que estar sobre el horizonte para que sea un pase sobre la ubicación especificada.

Este segundo punto es crucial para lo que me interesa. El sol debe estar al menos a -6˚ por debajo del horizonte para que esté lo suficientemente oscuro como para que la luz del sol reflejada en el satélite sea lo suficientemente brillante en relación con el cielo para sobresalir. , esto se llama el crepúsculo náutico. Entonces, el sol debe haberse puesto, pero tampoco debe estar por debajo de -18˚, de lo contrario, no puede llegar suficiente luz solar al satélite para que sea visible. Es por eso que solo puede ver los satélites durante unas pocas horas al amanecer o al anochecer.

El tercer punto es que el objeto no debe ser eclipsado por la tierra. Si no está utilizando pyephem u otra biblioteca que calcula esto, le sugiero que lea su artículo que detalla cómo calcularlo. Dado que pyephem calcula si el objeto está eclipsado, no entraré en las matemáticas aquí y simplemente diré que esto se puede encontrar usando iss.eclipsed, por ejemplo.

Para unir todo esto, usando pyephem uno puede encontrar el siguiente pase y si es visible así:

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
           }
Buen trabajo, me pregunto si hay alguna manera de usar algunas de esas bibliotecas de ángulos para predecir cosas como las llamaradas de Iridium . Heavens-above lo hace , pero siempre he pensado que se trata de algunas matemáticas no triviales.

Mi sugerencia de mejora del código de harryissac se ofrece para eliminar cualquier excepción causada por un valor Ninguno ( que 'ocurrirá' ocasionalmente sin esta corrección ). Esto es solo un fragmento que eliminará la posibilidad de una Excepción de cualquier valor de tupla Ninguno. Esto parecía demasiado largo para ponerlo en un comentario, así que lo ofrezco aquí.

Todo esto debe tener una sangría de un nivel para que coincida con el código de Harry. Disculpas por no estar tan familiarizado con el formato aquí. Después de esta parte del código de harryissac:

now = datetime.datetime.utcnow()   
observer.date = now   

tr, azr, tt, altt, ts, azs = observer.next_pass(sat)    

inserte este código con o sin sus comentarios. Los comentarios ayudan a explicar:

# --- 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 --------------  

Si alguien tiene una versión más corta o una corrección, adelante y comente.

Si se desea una explicación más completa de por qué es necesaria esta solución, publique un comentario y editaré una explicación más completa. La documentación de PyEphem advierte sobre posibles valores Ninguno cuando se usa next_pass para satélites terrestres.

Brandon Rhodes nos ha proporcionado un paquete PyEphem rico en funciones al colocar un envoltorio de python alrededor del código Xephem de Elwood Downey. Hay un beneficio útil definido en saber cuándo puede devolver Ninguno en lugar de algún otro valor esperado.

@uhoh Me gusta la precisión reportada de Skyfield y su velocidad usando numpy. Actualmente estoy trabajando con PyEphem, en una raspberry pi 3B+, y estoy aprendiendo paciencia. Alrededor de 16 segundos para obtener los siguientes ~120 pases de los TLE de SVPOST, sin errores de excepción de los valores Ninguno. Necesita cambiar la fecha de búsqueda varias veces de vez en cuando, de forma similar a lo que acabo de publicar, para perder Ninguno(s). Y los TLE, incluso con la fecha de época de TLE más apropiada seleccionada, si entiendo bien, aún pueden estar a uno o dos kilómetros de distancia. Bastante preciso para mis propósitos actuales. Planeo una mirada más cercana a Skyfield.
Sí. Entre los primeros comentarios en mis proyectos PyEphem está "piense en UTC y evite los detalles finos que cambian constantemente de la política, las bases de datos y el código de la zona horaria local". La mayoría de mis proyectos de python son completamente ingenuos, como el código de harryissac aquí, por lo que pueden ser completamente portátiles (no se necesita conexión a Internet para ejecutarlos, excepto para actualizar mi biblioteca TLE antes de ir al campo).
Sí, otra razón por la que me gusta pyephem. Sencillez. Pero puedo apreciar el trabajo de Brandon para desarrollar y mantener un paquete muy, muy preciso, que podría requerir actualizaciones frecuentes en línea de un tipo u otro.
Aclaración... después de una refactorización, el rpi 3B+ con pyephem hace ~120 pases en ~4,5 segundos, y eso probablemente también se pueda mejorar aún más. Lee y busca a través de una biblioteca TLE con miles de entradas y ese es sin duda un buen porcentaje de ese tiempo de procesamiento, leyendo, procesando y seleccionando el TLE más apropiado para cada fecha de búsqueda de pase. No quería dejar las habilidades del rpi con pyephem con un informe tan lento, sin explicación.