Понимание информации, содержащейся в XML-данных Deep Space Network?

Активность НАСА в сети дальнего космоса можно удобно просмотреть по адресу https://eyes.nasa.gov/dsn/dsn.html , но если вам нужны данные в более необработанной форме XML, к ним можно получить доступ, как описано в этом ответе .

Ниже приведен небольшой скрипт Python, который считывает XML в список словарей и сохраняет его на диск в виде JSON.

Словари организованы на более высоком уровне по тарелкам, а затем по космическим аппаратам на тарелки.

Вопрос: Каковы наиболее вероятные значения всех полей данных, содержащихся в XML-данных Deep Space Network?

Это пример URL-адреса из другого ответа, который используется в приведенном ниже сценарии: https://eyes.nasa.gov/dsn/data/1365107113.xml .

def dictify(r,root=True): # https://stackoverflow.com/questions/2148119/how-to-convert-an-xml-string-to-a-dictionary-in-python/30923963#30923963
    if root:
        return {r.tag : dictify(r, False)}
    d=copy(r.attrib)
    if r.text:
        d["_text"]=r.text
    for x in r.findall("./*"):
        if x.tag not in d:
            d[x.tag]=[]
        d[x.tag].append(dictify(x,False))
    return d

import xml.etree.ElementTree as ET
from copy import copy
import requests, json, pprint

# https://deepspace.jpl.nasa.gov/dsnnow/
# https://eyes.nasa.gov/dsn/dsn.html
# https://space.stackexchange.com/questions/17046/is-there-any-publicly-available-logging-or-wayback-machine-for-dsn-now-activi

N     = 1365107113

url   = "https://eyes.nasa.gov/dsn/data/" + str(N) + ".xml"

r     = requests.get(url)

text  = r.text

a     = ET.fromstring(text)

things = [dictify(x) for x in a]

with open (str(N) + '_XML', 'w') as outfile:
    json.dump(things, outfile)

pp = pprint.PrettyPrinter(indent=1)

for i, thing in enumerate(things):
    print "i = ", i
    pp.pprint(thing)

Вот последние две «вещи», которые печатает:

i =  14
{'dish': {'_text': '\n\t\t',
          'azimuthAngle': '16.999969',
          'created': '2013-04-04T07:00:42.036Z',
          'downSignal': [{'dataRate': '2291.963470',
                          'frequency': '8445767679.000001',
                          'power': '-482.579407',
                          'signalType': 'none',
                          'signalTypeDebug': 'IDLE OFF 0 MCD2',
                          'spacecraft': 'RSTS',
                          'spacecraftId': '99'}],
          'elevationAngle': '88.000488',
          'isArray': 'false',
          'isDDOR': 'false',
          'isMSPA': 'false',
          'name': 'DSS43',
          'target': [{'downlegRange': '-1.0',
                      'id': '99',
                      'name': 'RSTS',
                      'rtlt': '-1.0',
                      'uplegRange': '-1.0'}],
          'upSignal': [{'dataRate': '',
                        'frequency': '',
                        'power': '',
                        'signalType': 'none',
                        'signalTypeDebug': '  ',
                        'spacecraft': 'RSTS',
                        'spacecraftId': '99'}],
          'updated': '2013-04-04T07:00:42.036Z',
          'windSpeed': '0.000000'}}
i =  15
{'timestamp': {'_text': '1365107113334'}}

Ответы (2)

На просмотр данных из DSN у меня ушло несколько дней. Вот мой анализ полей из файлов данных XML.

station

  • name: Позывной станции.
  • friendlyName: Общее название станции (Голдстоун, Мадрид, Канберра).
  • timeUTC: Время создания этого отчета с использованием универсального скоординированного времени в миллисекундах (1/1000 секунды) с эпохи Unix (1 января 1970 г.).
  • timeZoneOffset: добавьте это число, timeUTCчтобы получить местное время этой станции, опять же в миллисекундах, начиная с эпохи Unix.

dish

  • name: Идентификатор блюда. Обычно за «DSS» следуют две десятичные цифры.
  • azimuthAngle, elevationAngle: Астрономический азимут и высота, на которую в данный момент направлена ​​эта антенна, в градусах с десятичной долей.
  • windSpeed: скорость ветра вокруг тарелки в км/ч.
  • isMSPA: Если "true", тарелка прослушивает более одной цели (Multiple Spacecraft Per Aperture).
  • isArray: Если "true", блюдо является частью массива тарелок.
  • isDDOR: Если установлено значение "true", антенна используется для односторонней дальности Delta Differential .
  • created, updated: Время создания и модификации файлов (чего?), в формате ISO 8601 .

target

  • name: позывной целевого космического корабля.
  • id: Десятичный идентификационный номер для каждого космического корабля. По-видимому, присваивается последовательно (начиная с 1) при добавлении космического корабля в базу данных.
  • uplegRange, downlegRange: Расчетное расстояние до цели и от цели в км. Должно быть таким же, если только не используется массив или DDOR. Кажется, в 2 раза меньше.
  • rtlt: Время прохождения света туда и обратно в секундах. Кажется, в 2 раза меньше.

upSignal

  • signalType: noneесли установка/снятие/отслеживание, carrierесли только несущая частота, dataесли что-то действительно отправляется.
  • signalTypeDebug: Неизвестный; предназначен для программистов.
  • power: Мощность передаваемого сигнала в кВт.
  • frequency: Частота передаваемого сигнала в МГц .
  • dataRate: бит в секунду передаваемых данных.
  • spacecraft: Позывной целевого космического корабля.
  • spacecraftId: Идентификационный номер целевого космического корабля.

downSignal

  • signalType: noneесли установка/снятие/отслеживание, carrierесли только несущая частота, dataесли что-то действительно принимается.
  • signalTypeDebug: Неизвестный; предназначен для программистов.
  • spacecraft: Позывной целевого космического корабля.
  • spacecraftId: Идентификационный номер целевого космического корабля.
  • dataRate: Биты в секунду полученных данных.
  • frequency: Частота принимаемого сигнала, в Гц . Обратите внимание на другие единицы измерения и более высокую точность, чем у upSignal; это было бы полезно для анализа эффекта Доплера движения космического корабля.
  • power: Мощность принимаемого сигнала в дБм . Было несколько случаев, когда две цели одной и той же антенны имели почти одинаковую мощность, за исключением смещения на значение 300: обычно -1xx,xx и -4xx,xx дБм. Поэтому я думаю, что 300 вычитается из мощности как флаг для определенного состояния (которое мне еще предстоит определить). Код для обработки этого значения должен выглядеть так:
if (power < -300.00)
   power = power + 300.00

Пожалуйста, попробуйте это, нарисуйте результаты и сообщите нам, если это сработает!


Вы заметите, что единицы не согласованы. Время может быть в формате Unix или в формате ISO 8601. Частота может быть в Гц или МГц. Мощность может быть в кВт или дБм.

Я был бы обеспокоен тем, что единицы могут измениться в будущем или изменились в прошлом. Поэтому я бы рекомендовал выполнить «проверку работоспособности» значений и соответствующим образом настроить их. Частота например:

if (frequency < 40.0)
    # Gigahertz
    frequency = frequency * 1E9
else if (frequency < 40000)
    # Megahertz
    frequency = frequency * 1E6
# else Hertz

Частоты радиодиапазона IEEE (из Википедии):

S   2 to 4 GHz  Short wave
C   4 to 8 GHz  Compromise between S and X
X   8 to 12 GHz     Used in WW II for fire control, X for cross (as in crosshair). Exotic.
Ku  12 to 18 GHz    Kurz-under
K   18 to 27 GHz    Kurz (German for "short")
Ka  27 to 40 GHz    Kurz-above
буквы для частот были выбраны случайно, чтобы запутать врагов. "id" цели - это "универсальный" идентификатор NASA для космических кораблей, вот список: ssd.jpl.nasa.gov/horizons_batch.cgi?batch=1&COMMAND= '*' Uplegrange и Downlegrange различаются, если космический корабль движется быстро; если вниз < вверх, s/c становится ближе.

Следовать за

DSN хранит данные внутри в формате под названием «TRK-2-34». Это описано в техническом примечании DSN 820-013. Я нашел 15 статей, в которых упоминается использование этого формата данных. В двух из этих документов прямо указано, что это «внутренний документ». Также рассмотрите этот пост в блоге:

Это техническая статья о том, как использовать Deep Space Network (DSN). Я собираюсь начать кратко и погрузиться глубоко. Вы можете погуглить/вики по материалам верхнего уровня. Я хочу разобраться, как преобразовать типы данных в формате DSN в дальность и скорость дальности в километрах/километрах в секунду.

Я хочу сделать это, потому что это было излишне тяжело для меня. Не из-за теории, а из-за отсутствия документации или руководств . Я уже разглагольствовал, что представление DSN о машине для продажи — это мешок запчастей, некоторые дубликаты, некоторые плохие, без инструкций.

и

Документация по формату TRK-2-34 на самом деле исчерпывающая , но не объясняет, как соединить части вместе, чтобы получить пригодные для использования измерения.

и

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

и

DSN делает прекрасные вещи, но они не являются публичной коммерческой компанией. Если вы хотите использовать DSN для отслеживания вашего драгоценного космического корабля, вам придется играть с игрушками, которые они вам дают. Вам понадобится полуприличный априорный вектор состояния для вашего космического корабля, симулятор для его распространения и извлечения геометрии, бинарный синтаксический анализатор, справочник ТРК-2-34 и все шаги, перечисленные выше.

https://clarkpatricknewman.wordpress.com/category/nasa/dsn/

Описание формата ТРК-2-34 (820-013) не является публичной информацией. Похоже, единственный способ получить копию — отправить свой космический корабль и заплатить DSN за его отслеживание.

Это сулит плохие шансы на то, что это получит свой «авторитетный источник». Если хотите, пожалуйста, не стесняйтесь оставлять комментарий или ответ, указывая на это, поскольку вы хорошо задокументировали эту вероятность здесь!