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?
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
}
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.
tildalola
Stu