问题描述
我正在使用 astropy 来定义围绕地球的苔原轨道,随后,我想在物体及时传播时提取 ECI 和大地坐标。我能够得到一些东西,但它与我的预期不一致(从另一个 SW 中提取的 ECI 坐标)。两条轨道甚至不在同一平面上,这显然是错误的。
谁能告诉我我是否明显做错了什么?
下图显示了两个结果。橙色与 Astropy。
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,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],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')
解决方法
当我写到您可以更有效地执行此操作时,我错误地假设 Orbit.propagate
可以在时间步长数组上直接调用,例如:
>>> tt = np.arange(0,1440,10) * u.min
>>> orb = tundra1.propagate(tt)
虽然这“有效”,因为它返回一个带有一系列纪元的新轨道,但似乎 Orbit
并不是真正设计用于处理一系列纪元并试图做类似 orb.represent_as
的事情只返回数组中第一个纪元的值。这将是对 poliastro 的一个很好的可能的增强。
但是,您为散点图编写的代码仍然可以显着简化为如下所示:
>>> tt = np.arange(0,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
的情况下执行此操作,而只需在没有 for 循环的情况下调用 tundra1.propagate(tt).represent_as(CartesianRepresentation).xyz
。但如上所示,您仍然可以通过使用 np.vstack
从 (x,y,z)
三元组列表中创建数组来简化很多。
不过,我不确定这是否真的回答了您最初的问题,您似乎发现该问题的答案与代码并不真正相关。不过,我希望这会有所帮助!