Исходные данные об эталонной орбите JPL Horizons для Juno - как получить теперь, когда они были обновлены?

Из-за медленных откликов гелиевых клапанов Juno не было поручено выполнить большой маневр дельта-v, чтобы спуститься с орбиты ~ 53 дня на орбиту ~ 14 дней, первоначально запланированную на 19 октября 2016 года.

Первоначально я извлек запланированную орбиту из JPL Horizons , упомянутой здесь несколько месяцев назад. Теперь его нет — по крайней мере, я не могу его найти. Я хотел бы получить его снова в качестве упражнения, чтобы понять его.

Только для одного примера, для этого вопроса я хотел бы использовать Горизонты, чтобы быстро дать мне приблизительные орбитальные элементы (а и ϵ по крайней мере) за 14-дневный оборот вокруг Юпитера. Я могу понять, как извлечь их из векторов состояния, но было бы здорово использовать эту удобную систему.

   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

Теперь последние две строки:

   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

Основной вопрос: я хотел бы получить доступ к исходной эталонной орбите до обновления. Могу ли я как-нибудь получить его снова, используя Horizions? Я хотел бы получить векторы состояния с высокой степенью детализации, используя оригинал ref_160226_180221_160226_V0.5, по крайней мере, на протяжении всего 2017 года. Есть ли способ сделать это через Интернет, telnet или по электронной почте?

Второстепенный вопрос: если вы посмотрите на таблицы, траектории исправлены - дата/время окончания одного совпадает с датой/временем начала следующего, за исключением иногда перекрытия 00:01 (минута), которое может быть округлено в таблице. отображать.

Однако в последних двух строках обновленной таблицы предпоследняя строка заканчивается на 2016 JUL 29 21:00, а последняя строка начинается на месяц раньше на 2016 JUN 29 21:00. Это опечатка, или они как-то усредняются за этот месяц?


введите описание изображения здесь

вверху: Расчетное расстояние между космическим кораблем Юнона и барицентром Юпитера от JPL Horizons. Тонкая (синяя) линия: исходная эталонная орбита, Толстая (зеленая) линия: обновленная орбита показана до 10 декабря 2016 г. - примерно, когда должно быть принято окончательное обязательство по «понижению» орбиты. Примечание. Данные были загружены с интервалом в 2 часа, поэтому неравномерность минимальных расстояний связана с грубой выборкой невероятно быстрого пролета.

Это данные тонкой (синей) линии, к которым я хотел бы снова получить доступ.

naif.jpl.nasa.gov/pub/naif/JUNO/kernels/spk это то, что вам нужно?
Мой ответ на space.stackexchange.com/questions/19181/… отвечает и на это?
@barrycarter это интересно и полезно, но это не ответ, спасибо!
@oefe Я не знаю. Я вижу три типа файлов ( .bsp, .bsp.lbl, .orb) с именами , spk_ref_160226_180221_160226но без _V0.5, но я не знаю, как их использовать в Horizons. Является ли это возможным? Мой единственный текущий компьютерный язык — это python. Skyfield использует .bspданные для основных тел Солнечной системы, но я не думаю, что они предназначены для всех.
@oefe Похоже, что .bspфайл расширения содержит SPK, который представляет собой таблицу коэффициентов Чебышева, и, возможно, я смогу найти что-нибудь, чтобы ее прочитать, или я могу научиться читать ее с помощью Python самостоятельно, если у меня будет достаточно времени, и если бы у меня было хорошее четкое объяснение / Документация по формату. Я ищу это сейчас, поскольку оно было связано с какой-то страницы Horizons: github.com/SETI/pds-tools
@uhoh, вы правы: sk = SpiceKernel('spk_ref_160226_180221_160226.bsp')сбой с «ValueError: тип данных SPK 1 еще не поддерживается сегментом»
@oefe хорошо - так или иначе, я предполагаю, что то, что мне нужно, находится там, поэтому я буду продолжать искать способ прочитать это без использования компилятора. Спасибо за вашу помощь!
@uhoh, видимо, это известная проблема в jplephem: github.com/brandon-rhodes/python-jplephem/issues/14 в комментариях есть ссылка на некоторый код Python для чтения этого формата.
@oefe спасибо за это! Скачал, сегодня посмотрю. В то время как «Увы» от Брэндона Роудса часто является окончательным, это похоже на то, что у него может быть счастливый конец.
@oefe еще раз спасибо за вашу помощь! Я заставил его работать и опубликовал ответ с описанием и примером. Это именно то, что мне было нужно!

Ответы (1)

Комментарии от @oefe указали мне на решение! Я опубликую это здесь. Поскольку я не эксперт, я буду давать минимум объяснений, чтобы не вводить в заблуждение.

Хорошей ссылкой является обязательное чтение SPK:

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

Мне указали на следующую папку, в которой есть решения в форме ядра в виде .bspфайлов:

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

Я ищу опорную орбиту spk_ref_160226_180221_160226.bps, которая была рассчитана в феврале 2016 года до того, как Юнона достигла Юпитера.

Дополнительные полезные «подсказки» находятся в том же имени файла с расширением .bsp.lblс такой информацией, как даты, центр и коды bodyID, которые я использовал в сценарии Python ниже.

Мне также указали на это обсуждение в python-jplephem Github, в котором указано, что ядра «типа данных 1 (модифицированные массивы разностей)» имеют другую структуру и не могут быть прочитаны jplephem:

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

и это обсуждение указало на решение - скрипт Python, spktype01который был написан Shushi Uetsuki (whiskie14142). Кажется, это точная транскрипция/преобразование в Python из оригинального FORTRAN, и он хорошо и откровенно прокомментирован.

https://github.com/whiskie14142/spktype01

Поскольку я запускаю Python в среде, где Skyfield уже установлен, кажется, что модули jplephem уже доступны. Поэтому я просто запускаю это в папке, содержащей только скрипт ниже и spktype01.pyфайл с github. Оно работает! Спасибо всем причастным!

Ниже я показываю, что грубая выборка отображает различные минимальные расстояния между Юноной и барицентром системы Юпитера. Находя каждый из этих минимумов и производя повторную выборку с субминутными интервалами, можно увидеть, что все периджовы, по существу, находятся на одном и том же расстоянии.

введите описание изображения здесь

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()
Вы также можете проверить github.com/AndrewAnnex/SpiceyPy , который является интерфейсом Python напрямую к NAIF SPICE. Вы можете загрузить любое ядро ​​SPICE и выполнить любой вызов SPICE через этот интерфейс. Это довольно хорошо сделано, и сопровождающий очень отзывчив на любой вопрос.