Как преобразовать координаты Земли с центром в инерциальной системе координат (ECI) в координаты с фиксированной координатой по центру Земли (ECEF) AstroPy? Другой?

У меня есть векторы положения (x, y, z) и скорости (Vx, Vy, Vz) в центрированных по центру Земли инерциальных координатах (ECI) для спутниковой орбиты, и в конечном итоге я хочу получить геодезические координаты (широта, долгота и высота) .

Согласно этому другие Вопрос о переполнении стека кажется, что мне нужно преобразовать в координаты Земли по центру Земли (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)


person Rose    schedule 26.09.2017    source источник
comment
Не могли бы вы включить некоторые типовые исходные данные и ожидаемые результаты? Это значительно упростит поиск решения, которое действительно работает для вас.   -  person MSeifert    schedule 27.09.2017
comment
Я отредактирую свой вопрос, включив в него код, который я использую для создания орбиты и получения векторов положения и скорости.   -  person Rose    schedule 27.09.2017
comment
Итак, прямо сейчас у меня есть координаты и скорость в ECI для образца орбиты спутника. Положение (x = 5713846,540659178, y = 3298890,8383577876, z = 0,0) Скорость (x = -3982,305479346745, y = 6897,555421488496, z = 0,0), и я хочу получить широту, долготу и высоту спутника, когда он находится в одном месте. должность. Я прочитал, что мне сначала нужно преобразовать ECI в ECEF, чтобы преобразовать в lat и lon. Проблема в том, что ECI - это фиксированная система координат, которая не вращается вместе с Землей, как ECEF и lat / lon / alt. Я не знаю, как преобразовать ECI в ECEF.   -  person Rose    schedule 27.09.2017
comment
ECI и ECEF не используют одну и ту же ось Z: ECEF обычно имеет ось Z, заданную малой осью эллипсоида, наилучшим образом подходящего к Земле (WGS84), и эта ось как прецессирует, так и немного колеблется относительно фиксированной Z -ось в ECI. ECI и ECEF могут совместно использовать ось Z в определенный момент времени (например, в полдень 1 января 2000 года по земному времени для J2000).   -  person M Kloster    schedule 03.05.2021


Ответы (1)


Существует несколько различных инерциальных систем отсчета с центром в Земле, и ответ зависит от того, в какой из них у вас есть координаты.

Самый распространенный - это так называемый J2000; который определяется относительно ориентации Земли 1 января 2000 года. Другой распространенный - GCRF, который почти такой же (с точностью до 80 миллисекунд).

Если это один из этих двух, у вас должна быть возможность создать объект астропии EarthLocation и получить доступ к атрибутам lat, lon и height следующим образом

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)
person Stuart P Littlefair    schedule 27.09.2017
comment
Как время будет учитываться? Скажем, я хочу получить широту / долготу / высоту для орбиты МКС с положением (x = -2686197,06, y = -6402017,61, z = 10956,56) и временем UTC (сегодня) 2017/09/28 16: 53: 40.293 или 559889620.2930000 в J2000. - person Rose; 28.09.2017
comment
Использование правильного времени для данной позиции важно для правильного перехода от GCRS к ITRS. Поэтому, если у вас есть время, соответствующее положению в xyz, хранящемуся в astropy.time.Time объекте с именем now, вы должны использовать itrs = coord.GCRS(cartrep, obstime=now).transform_to(coord.ITRS(obstime=now)). Я отредактировал свой ответ, чтобы отразить это - person Stuart P Littlefair; 29.09.2017
comment
Я попробовал новую версию и получил ошибку типа: TypeError: transform_to() got an unexpected keyword argument 'obstime' для строки itrs = gcrs.transform_to(coord.ITRS, obstime=now) - person Rose; 29.09.2017
comment
Фиксированная версия: из астропии импортировать координаты как координаты из единиц импорта астропии как u из времени импорта астропии из Astropy.time import Time xyz = [-2686197.0596728502, -6402017.6107924329, 10956.564679617248] now = time.Time ('2017-09-28 16: 53:40 ') # Время в формате UTC для xyz cartrep = Coord.CartesianRepresentation (* xyz, unit = um) # добавление единиц [м] в xyz gcrs = Coord.GCRS (cartrep, obstime = now) itrs = gcrs.transform_to (Координаты ITRS (obstime = сейчас)) loc = Coord.EarthLocation (* itrs.cartesian.xyz) print ('') print (loc.lat, loc.lon, loc.height) - person Rose; 03.10.2017
comment
я получаю сообщение об ошибке при запуске вашего кода 'CartesianRepresentation' object has no attribute 'cartrep' - person Raksha; 28.08.2019
comment
@ Ракша, да, здесь то же самое. Согласно документам, правильный способ (по крайней мере, на момент написания) - использовать xyzattirbute: docs.astropy.org/en/stable/api/ - person Aleksander Lidtke; 29.07.2021