我正在使用astropy来定义一个围绕地球的冻土带轨道,随后,我想提取物体在时间上传播时的ECI和大地坐标。我能够得到一些东西,但它不符合我的期望(从另一个SW提取的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')发布于 2021-01-13 16:02:21
当我写到你可以更有效地做到这一点时,我错误地假设可以直接在一系列时间步长上调用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)三元组列表中生成一个数组,您仍然可以大大简化。
我不确定这是否真的回答了你最初的问题,似乎你找到了与代码无关的答案。尽管如此,我还是希望这能有所帮助!
https://stackoverflow.com/questions/65635802
复制相似问题