【问题标题】:How to convert Earth Centered Inertial (ECI) coordinates to Earth Centered Earth Fixed (ECEF) AstroPy? Other?如何将地球中心惯性 (ECI) 坐标转换为地球中心固定 (ECEF) AstroPy?其他?
【发布时间】:2017-09-26 18:46:38
【问题描述】:

我在卫星轨道的地球中心惯性坐标 (ECI) 中有位置 (x,y,z) 和速度 (Vx,Vy,Vz) 向量,最终希望得到大地坐标(纬度、经度、 & 海拔)。

根据这个other Stack Overflow question,我似乎需要转换为地心地球固定 (ECEF) 坐标作为中间步骤(因此 ECI --> ECEF --> Lat/Lon/Alt)。

我知道 ECI 和 ECEF 共享相同的原点(地球质心)和指向北极的相同 z 轴。但是,我不确定将 ECI 转换为 ECEF 需要执行哪些实际方程式或调整。

否则,如果有人知道 Astropy 上的任何罐头转换或类似的东西,那就更好了。 (我还没有看到 ECI 作为 Astro Py 或 Space Py 的选项)。

这是我用来生成轨道并获取位置和速度向量的代码。

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)

【问题讨论】:

  • 您能否提供一些示例性输入和预期输出?这样可以更轻松地找到真正适合您的解决方案。
  • 我将编辑我的问题以包含我用来生成我的轨道并获取位置和速度向量的代码。
  • 所以现在我在 ECI 中有一个样本卫星轨道的位置和速度。 Position(x=5713846.540659178, y=3298890.8383577876, z=0.0) Velocity(x=-3982.305479346745, y=6897.555421488496, z=0.0) 我想得到卫星的纬度、经度和高度位置。我读到我首先需要从 ECI 转换为 ECEF 才能转换为纬度和经度。问题是 ECI 是一个固定的坐标系,它不会像 ECEF 和纬度/经度/纬度那样随地球旋转。我不确定如何将 ECI 转换为 ECEF。
  • ECI 和 ECEF 不共享相同的 Z 轴:ECEF 通常有一个 Z 轴,由最适合地球的椭球体 (WGS84) 的短轴给出,该轴既进动又相对于 ECI 中的固定 Z 轴摆动一点。 ECI 和 ECEF 可以在特定时间点共享 Z 轴(例如,对于 J2000,地球时间为 2000 年 1 月 1 日中午)。

标签: python coordinate-systems coordinate-transformation coordinate astropy


【解决方案1】:

有许多不同的地心惯性坐标系,答案取决于你的坐标在哪一个。

最常见的是所谓的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)

【讨论】:

  • 如何考虑时间因素?假设我想获得位置为 (x= -2686197.06, y= -6402017.61, z= 10956.56) 和 UTC 时间(今天) 2017/09/28 16:53:40.293 或 559889620.2930000 的 ISS 轨道的纬度/经度/纬度在 J2000 中。
  • 对给定位置使用正确的时间对于正确地从 GCRS 到 ITRS 的转换非常重要。因此,如果您将与xyz 中的位置对应的时间存储在名为nowastropy.time.Time 对象中,则应使用itrs = coord.GCRS(cartrep, obstime=now).transform_to(coord.ITRS(obstime=now))。我已经编辑了我的答案以反映这一点
  • 我试用了新版本,出现类型错误:TypeError: transform_to() got an unexpected keyword argument 'obstime' for the line itrs = gcrs.transform_to(coord.ITRS, obstime=now)
  • 运行您的代码时出现错误'CartesianRepresentation' object has no attribute 'cartrep'
  • @Raksha 是的,这里也一样。根据文档,正确的方法(至少在撰写本文时)是使用 xyzattirbute: docs.astropy.org/en/stable/api/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多