Извлечение геодезических и ECI-координат орбиты BCI

Я использую астронию для определения орбиты тундры вокруг Земли, а затем я хотел бы извлечь ECI и геодезические координаты по мере того, как объект распространяется во времени. Я смог получить что-то, но это не соответствует тому, что я ожидал (координаты ECI извлечены из другого ПО). Две орбиты даже не лежат в одной плоскости, что явно неверно.

Может ли кто-нибудь сказать мне, если я делаю что-то явно неправильно?

На графике ниже показаны два результата. Оранжевый с Астропией.

Сравнение орбит

import astropy
from astropy import units as u
from poliastro.bodies import Earth
from astropy.coordinates import CartesianRepresentation
from poliastro.twobody import Orbit
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

epoch = astropy.time.Time('2020-01-01T00:00:00.000',  scale='tt')

# Tundra
tundra1 = Orbit.from_classical(attractor=Earth,
    a = 42164 *u.km,
    ecc = 0.2684 * u.one,
    inc = 63.4 * u.deg,
    raan = 25 * u.deg,
    argp = 270 * u.deg,
    nu = 50 * u.deg,
    # epoch=epoch
)

def plot_orb(orb, start_t, end_t, step_t, ax, c='k'):
    orb_list = []
    for t in np.arange(start_t, end_t, step_t):
        single_orb = orb.propagate(t*u.min)
        orb_list = orb_list + [single_orb]

    xyz = orb.sample().xyz

    ax.plot(*xyz,'r')
    s_xyz_ar = np.zeros((len(orb_list), 3))
    for i, s_orb in enumerate(orb_list):
        s_xyz = s_orb.represent_as(CartesianRepresentation).xyz
        s_xyz_ar[i, :] = s_xyz
    ax.scatter(s_xyz_ar[:, 0], s_xyz_ar[:, 1], s_xyz_ar[:, 2], c)

    return s_xyz_ar, t

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

s_xyz_ar1, t1 = plot_orb(orb=tundra1, start_t=0, end_t=1440, step_t=10, ax=ax, c='k')

person EP1    schedule 08.01.2021    source источник
comment
Не могли бы вы опубликовать результаты, которые вы получили, и объяснить немного больше о том, что вы ожидали? Я только что запустил ваш код с помощью astropy 4.0 и poliastro 0.14.0 и получил результат, который, я думаю, вы ожидали, с точками диаграммы рассеяния, идеально соответствующими красной траектории орбиты. В вашем коде также есть некоторые вещи, которые довольно неэффективны, но мы можем решить это позже.   -  person Iguananaut    schedule 10.01.2021
comment
Спасибо за ваш комментарий.... Я добавил изображение двух орбит. Я бы ожидал, что они оба будут идентичными, но, как вы можете видеть, они даже не находятся в одной плоскости. Я новичок в астрономии, поэтому я явно делаю что-то не так. И да, я знаю, что мой код очень неэффективен, особенно способ распространения орбиты во времени, но это был единственный способ, который я пока нашел для этого. Любые предложения будут более чем приветствоваться. Что касается полиастро, я сначала попытался использовать его, но не смог найти способ распространения орбиты на определенное смещение во времени. Есть ли способ сделать это?   -  person EP1    schedule 11.01.2021
comment
Оказывается, разница была связана с разной эпохой, предполагаемой двумя SW. После того, как это было исправлено, все совпало. Но мне было бы очень интересно узнать, как заставить код работать более эффективно и избавиться от цикла for.   -  person EP1    schedule 12.01.2021
comment
Я вижу, я думаю, что не понял ваш вопрос должным образом. В этом случае я не смог воспроизвести его. Я не понял, что вы ранее имели в виду под координатами ECI, извлеченными из другого ПО, и в этом случае было бы важно знать, что было сделано по-другому с этим программным обеспечением.   -  person Iguananaut    schedule 13.01.2021


Ответы (1)


Когда я писал, что вы можете сделать это более эффективно, я ошибочно предполагал, что Orbit.propagate можно вызывать непосредственно в массиве временных шагов, например:

>>> tt = np.arange(0, 1440, 10) * u.min
>>> orb = tundra1.propagate(tt)

Хотя это работает, поскольку возвращает новую орбиту с массивом эпох, похоже, что Orbit на самом деле не предназначено для работы с массивом эпох, и попытка сделать что-то вроде orb.represent_as просто возвращает значение для первой эпохи в массиве. Это было бы хорошим возможным улучшением полиастро.

Однако код, который вы написали для точечной диаграммы, все же можно значительно упростить до чего-то вроде этого:

>>> tt = np.arange(0, 1440, 10) * u.min
>>> xyz = np.vstack([tundra1.propagate(t).represent_as(CartesianRepresentation).xyz for t in tt])
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111, projection='3d')
>>> ax.scatter(*xyz.T)
>>> fig.show()

Результат:

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

В идеале вы должны иметь возможность сделать это без np.vstack и вместо этого просто вызвать tundra1.propagate(tt).represent_as(CartesianRepresentation).xyz без цикла for. Но, как показано выше, вы все еще можете многое упростить, используя np.vstack для создания массива из списка троек (x, y, z).

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

person Iguananaut    schedule 13.01.2021