如何使用AstroPy将以地心惯性坐标系(ECI)转换为以地心为基准的地固坐标系(ECEF)?其他方法呢?

7
我在地心惯性坐标系(ECI)中有卫星轨道的位置(x,y,z)和速度(Vx,Vy,Vz)向量,并最终希望获得大地坐标(纬度,经度和高度)。
根据其他Stack Overflow问题,似乎我需要将其转换为地心固定坐标系(ECEF)作为中间步骤(因此ECI-> ECEF-> Lat / Lon / Alt)。
我知道ECI和ECEF共享相同的原点(地球质心)和相同指向北极的z轴。然而,我不确定我需要进行什么实际的方程或调整来将ECI转换为ECEF。
否则,如果有人知道Astropy或类似工具箱上的任何预设转换,那就更好了。(我没有在Astro Py或Space Py上看到ECI作为选项)
这是我用来生成轨道并获取位置和速度向量的代码。
from scipy.constants import kilo
import orbital
from orbital import earth, KeplerianElements, Maneuver, plot, utilities
from orbital.utilities import Position, Velocity  
import matplotlib.pyplot as plt
import numpy as np

orbitPineapple = KeplerianElements.with_period(5760, body=earth, 
e=0.05, i=(np.deg2rad(0)), arg_pe=(np.deg2rad(30)))
plot(orbitPineapple)
plt.show()
print(orbitPineapple.r)
print(orbitPineapple.v)

输出: 位置(x=5713846.540659178, y=3298890.8383577876, z=0.0) 速度(x=-3982.305479346745, y=6897.555421488496, z=0.0)


你可以提供一些示例输入和期望输出吗?这将使我们更容易找到实际适用于你的解决方案。 - MSeifert
我将编辑我的问题,包括我用来生成轨道并获取位置和速度向量的代码。 - Rose
现在我有一个样本卫星轨道的ECI位置和速度。位置(x=5713846.540659178, y=3298890.8383577876, z=0.0),速度(x=-3982.305479346745, y=6897.555421488496, z=0.0)。当卫星处于相同位置时,我想获取卫星的纬度、经度和高度。我读到需要先将ECI转换为ECEF,才能转换为纬度和经度。问题是ECI是一个固定的坐标系,不像ECEF和纬度/经度/高度那样随着地球旋转。我不确定如何将ECI转换为ECEF。 - Rose
1
ECI和ECEF不共享相同的Z轴:ECEF通常具有由最佳椭球拟合地球(WGS84)的短轴给出的Z轴,并且相对于ECI中的固定Z轴,该轴会发生进动和摆动。在特定时间点(例如J2000的2000年1月1日正午地球时间),ECI和ECEF可能共享Z轴。 - M Kloster
1个回答

6

有许多不同的地心惯性坐标系,答案取决于您使用的坐标系。最常见的是所谓的J2000;它是相对于2000年1月1日地球的方向定义的。另一个常见的坐标系是GCRF,几乎相同(误差在80毫角秒以内)。

如果是这两个坐标系之一,您应该能够创建一个astropy EarthLocation对象,并像以下方式访问latlonheight属性:

from astropy import coordinates as coord
from astropy import units as u
from astropy.time import Time
now = Time('2017-09-27 12:22:00')
# position of satellite in GCRS or J20000 ECI:
cartrep = coord.CartesianRepresentation(x=5713846.540659178, 
                                        y=3298890.8383577876,
                                        z=0., unit=u.m)
gcrs = coord.GCRS(cartrep, obstime=now)
itrs = gcrs.transform_to(coord.ITRS(obstime=now))
loc = coord.EarthLocation(*itrs.cartesian.cartrep )
print(loc.lat, loc.lon, loc.height)

时间因素如何考虑?假设我想获取一个ISS轨道的纬度/经度/高度,其位置为(x= -2686197.06,y= -6402017.61,z= 10956.56),UTC时间(今天)为2017/09/28 16:53:40.293或J2000中的559889620.2930000。 - Rose
使用正确的时间对于获得从GCRS到ITRS的转换是很重要的。因此,如果您拥有与存储在名为“now”的astropy.time.Time对象中的xyz位置相对应的时间,则应使用itrs = coord.GCRS(cartrep, obstime=now).transform_to(coord.ITRS(obstime=now))。我已编辑我的答案以反映这一点。 - Stuart P Littlefair
我尝试使用新版本,但出现了类型错误:TypeError: transform_to() got an unexpected keyword argument 'obstime',该错误出现在以下代码行:itrs = gcrs.transform_to(coord.ITRS, obstime=now) - Rose
修正版:从astropy导入坐标作为coord,导入单位作为 u,导入时间和Time 模块xyz = [-2686197.0596728502, -6402017.6107924329, 10956.564679617248]now = time.Time('2017-09-28 16:53:40') #xyz所对应的UTC时间cartrep = coord.CartesianRepresentation(*xyz, unit=u.m) #将[m]单位添加到xyz中gcrs = coord.GCRS(cartrep, obstime=now) #从GCRS(地心惯性坐标系)转换到ITRS(地球固定坐标系) itrs = gcrs.transform_to(coord.ITRS(obstime=now)) loc = coord.EarthLocation(*itrs.cartesian.xyz)print('') print(loc.lat, loc.lon, loc.height) - Rose
3
运行您的代码时出现错误:'CartesianRepresentation'对象没有属性'cartrep' - Raksha
1
@Raksha 是的,我也是这样。根据文档,在编写时正确的方法是使用 xyz 属性:https://docs.astropy.org/en/stable/api/astropy.coordinates.CartesianRepresentation.html#astropy.coordinates.CartesianRepresentation - Aleksander Lidtke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接