Datos de la órbita de referencia original de JPL Horizons para Juno: ¿cómo recuperarlos ahora que se han actualizado?

Debido a las respuestas lentas de la válvula de helio , Juno no recibió instrucciones de ejecutar la gran maniobra delta-v para descender de la órbita de ~53 días a la órbita de ~14 días programada originalmente para el 19 de octubre de 2016.

Originalmente extraje la órbita planificada de JPL Horizons mencionada aquí hace meses. Ahora se ha ido, o al menos no puedo encontrarlo. Me gustaría recuperarlo de nuevo como ejercicio para entenderlo.

Solo por ejemplo, para esta pregunta me gustaría usar Horizons para obtener rápidamente los elementos orbitales aproximados (a y ϵ al menos) para las órbitas de 14 días alrededor de Júpiter. Puedo descubrir cómo extraerlos de los vectores de estado, pero sería genial usar este práctico sistema.

   Trajectory name                       Start (TDB)         Stop (TDB)
   ------------------------------     -----------------   -----------------
   rec_110805_111026_120302           2011-Aug-05 17:19   2011 OCT 26 00:00
   rec_111026_120308_120726           2011 OCT 26 00:00   2012 MAR 08 12:00   
   rec_120308_120825_121109           2012 MAR 08 12:00   2012 AUG 25 00:00
   rec_120825_130515_130708           2012 AUG 25 00:00   2013 MAY 15 00:00
   rec_130515_131005_131031           2013 MAY 15 00:00   2013 OCT 05 12:00
   rec_131005_131014_131101_reco      2013 OCT 05 12:00   2013 OCT 14 00:01
   rec_131014_131114_140222           2013 OCT 14 00:01   2013 NOV 14 06:00
   ref_131114_171017_140311_V0.2      2013 NOV 14 06:00   2015 MAR 26 00:00
   ref_150326_180221_150326_V0.1      2015 MAR 26 00:00   2016 FEB 26 00:01
   ref_160226_180221_160226_V0.1      2016 FEB 26 00:00   2016 APR 13 18:00
   pre_160413_161016_160818_pj01_V0.1 2016 APR 13 18:00   2016 OCT 16 23:00
   ref_160226_180221_160226_V0.5      2016 OCT 16 23:00   2018 FEB 21 11:40

Ahora las dos últimas líneas son:

   pre_160413_161016_160818_pj01_V0.1 2016 APR 13 18:00   2016 JUL 29 21:00
   nob_160729_170201_161019.V0.1      2016 JUN 29 21:00   2017 FEB 01 00:00

Pregunta principal: me gustaría acceder a la órbita de referencia original antes de la actualización. ¿Hay alguna forma de que pueda volver a obtenerlo usando Horizions? Me gustaría obtener vectores de estado con granularidad fina usando el original ref_160226_180221_160226_V0.5durante todo 2017 al menos. ¿Hay alguna forma de hacerlo a través de la web, telnet o por correo electrónico?

Pregunta secundaria: si observa las tablas, las trayectorias están parcheadas: la fecha/hora en que termina una coincide con la fecha/hora en que comienza la siguiente, excepto a veces por una superposición de 00:01 (un minuto) que podría estar redondeando en la tabla monitor.

Sin embargo, en las dos últimas líneas de la tabla actualizada, la penúltima línea termina en 2016 JUL 29 21:00mientras que la última línea comienza un mes antes en 2016 JUN 29 21:00. ¿Es esto un error tipográfico, o de alguna manera se promediaron juntos durante ese mes?


ingrese la descripción de la imagen aquí

arriba: Distancia calculada entre la nave espacial Juno y el baricentro de Júpiter del JPL Horizons. Línea delgada (azul): órbita de referencia original, línea gruesa (verde): se muestra la órbita actualizada hasta el 10 de diciembre de 2016, aproximadamente cuando se debe realizar el compromiso final para la quema de "reducción" de la órbita. Nota: los datos se descargaron con un intervalo de tiempo de 2 horas, por lo que las distancias mínimas desiguales se deben a un muestreo aproximado del sobrevuelo increíblemente rápido.

Son los datos de la línea delgada (azul) a los que me gustaría volver a acceder.

¿Mi respuesta a space.stackexchange.com/questions/19181/… responde esto también?
@barrycarter es interesante y útil, pero tampoco es una respuesta, ¡gracias!
@oefe No sé. Veo tres tipos de archivos ( .bsp, .bsp.lbl, .orb) con los nombres spk_ref_160226_180221_160226pero sin el _V0.5, pero no sé cómo usarlos dentro de Horizons. ¿Es posible? Mi único lenguaje de programación actual es Python. Skyfield utiliza los .bspdatos de los principales cuerpos del sistema solar, pero no creo que esté destinado a todos ellos.
@oefe Parece que el .bsparchivo de extensión contiene el SPK, que es una tabla de coeficientes de Chebyshev, y probablemente pueda encontrar algo para leerlo o puedo aprender a leerlo con python yo mismo con el tiempo suficiente y si tuviera una buena explicación clara/ documentación del formato. Estoy buscando esto ahora, ya que estaba vinculado desde alguna página de Horizons: github.com/SETI/pds-tools
@uhoh, tiene razón: sk = SpiceKernel('spk_ref_160226_180221_160226.bsp')falla con "ValueError: tipo de datos SPK 1 segmento aún no admitido"
@oefe ok, de una forma u otra, asumo que lo que necesito está allí, así que seguiré buscando una manera de leerlo sin tener que usar un compilador. ¡Gracias por tu ayuda!
@uhoh aparentemente es un problema conocido en jplephem: github.com/brandon-rhodes/python-jplephem/issues/14 hay un enlace a un código de Python para leer este formato en los comentarios
@oefe gracias por eso! He descargado y echaré un vistazo más tarde hoy. Si bien un "Alas" de Brandon Rhodes suele ser definitivo, parece que este puede tener un final feliz.
@oefe gracias de nuevo por tu ayuda! Lo hice funcionar y publiqué una respuesta con una descripción y un ejemplo. ¡Esto es exactamente lo que necesitaba!

Respuestas (1)

¡Los comentarios de @oefe me señalaron la solución! Lo publicaré aquí. Como no soy un experto, mantendré las explicaciones mínimas para evitar decir algo engañoso.

Una buena referencia es la lectura requerida de SPK:

http://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/spk.html

Me señalaron la siguiente carpeta, que tiene soluciones en forma de kernel como .bsparchivos:

http://naif.jpl.nasa.gov/pub/naif/JUNO/kernels/spk/

La que estoy buscando es una órbita de referencia spk_ref_160226_180221_160226.bpsque se calculó en febrero de 2016 antes de que Juno llegara a Júpiter.

Se encuentran "pistas" útiles adicionales en el mismo nombre de archivo con extensión .bsp.lblcon información como fechas, centros y códigos de identificación del cuerpo, que he usado en el script de Python a continuación.

También me señalaron esta discusión en python-jplephem Github, que señala que los núcleos de "tipo de datos 1 (matrices de diferencias modificadas)" tienen una estructura diferente y jplephem no puede leerlos:

https://github.com/brandon-rhodes/python-jplephem/issues/14

y esa discusión apuntó a una solución: un script de Python spktype01que ha sido escrito por Shushi Uetsuki (whiskie14142). Parece ser una transcripción/conversión fiel a Python del FORTRAN original, y está bien comentado, y con franqueza.

https://github.com/whiskie14142/spktype01

Dado que estoy ejecutando Python en un entorno donde Skyfield ya está instalado, parece que los módulos jplephem ya están disponibles. Así que solo ejecuto esto en una carpeta que contiene solo el script a continuación y el spktype01.pyarchivo de github. ¡Funciona! ¡Gracias a todos los involucrados!

A continuación, muestro que el muestreo grueso muestra distancias mínimas variables entre Juno y el baricentro del sistema de Júpiter. Al encontrar cada uno de esos mínimos y volver a muestrear a intervalos de menos de un minuto, se puede ver que los periJoves están esencialmente a la misma distancia.

ingrese la descripción de la imagen aquí

from spktype01 import SPKType01
import numpy as np
import matplotlib.pyplot as plt

Juno_kernel = SPKType01.open('spk_ref_160226_180221_160226.bsp')

JD_coarse   = np.arange(2457558.5, 2457754.5+1, 0.2)
# print(Juno_kernel)

center, bodyID = 5, -61  # Jupiter barycenter, Juno Spacecraft

coarse_data = []
for JD in JD_coarse:

    spkpos, spkvel = Juno_kernel.compute_type01(center, bodyID, JD)

    coarse_data.append(spkpos)

coarse_data = np.array(coarse_data)

rc = np.sqrt((coarse_data**2).sum(axis=1))

inflections = (rc[2:] - rc[1:-1]) * (rc[1:-1] - rc[:-2]) <= 0.0 
i_inflects  = np.where(inflections)[0] + 1
i_peris     = [i for i in i_inflects if rc[i] < 1E+06]   # I am lazy
JD_peris = JD_coarse[i_peris]

dminutes = np.linspace(-180, 180, 1001)
ddays    = dminutes / (24. * 60.)

periJoves = []
for JD_peri in JD_peris:

    JD_fine = JD_peri + ddays

    fine_data = []
    for JD in JD_fine:

        spkpos, spkvel = Juno_kernel.compute_type01(center, bodyID, JD)

        fine_data.append(spkpos)

    fine_data = np.array(fine_data)

    r_fine = np.sqrt((fine_data**2).sum(axis=1))

    periJoves.append(r_fine)

if 1 == 1:
    plt.figure()

    plt.subplot(1,2,1)
    plt.plot(JD_coarse - JD_coarse[0], rc)
    plt.yscale('log')
    plt.ylim(1E+04, 1E+07)
    plt.xlabel('days (arb)', fontsize=14)


    plt.subplot(1,2,2)
    for periJove in periJoves:
        plt.plot(dminutes, periJove)
    plt.yscale('log')
    plt.ylim(1E+04, 1E+07)
    plt.xlabel('minutes (arb)', fontsize=14)

    plt.show()
También puede consultar github.com/AndrewAnnex/SpiceyPy , que es una interfaz de Python para NAIF SPICE directamente. Puede cargar cualquier kernel de SPICE y hacer cualquier llamada de SPICE que desee a través de esta interfaz. Está bastante bien hecho y el mantenedor es muy receptivo a cualquier pregunta.