Skyfield: достижение результатов sgp4 с периодичностью 1 секунда за заданный интервал времени

Я реализовал алгоритм sgp4, используя Skyfield в Python.

Мне нужен вектор положения для интервала времени 1 день с периодичностью 1 секунда. Для этого мне нужно повторно вычислить sgp4, добавляя каждый раз по 1 секунде.

Есть ли способ вернуть вектор, который содержит все позиции?

2 ответа

Решение

Вы можете сделать это, создав skyfield.EarthSatellite объект формирует TLE, а затем генерирует astrometric объекты для каждого времени в списке раз. Вы должны указать свой список времени в качестве объектов datetime с учетом часового пояса. Вы можете создать свой список раз с чем-то вроде (вероятно, есть много места, чтобы сделать это более эффективным):

from datetime import timezone, timedelta, datetime
from skyfield.api import load

ts = load.timescale()  # create skyfield timescale object
tz = timezone(timedelta(hours=-4))  # whatever your timezone offset from UTC is
start = datetime(2018, 06, 21, 0, 0, 0, tzinfo=tz)  # timezone-aware start time
end = start + timedelta(hours=24)  # one day's worth of times
delta = timedelta(minutes=1)  # your interval over which you evaluate
times = [start]
now = start
while now <= end:
    now += delta
    times.append(now)

И оцените это с помощью:

astrometrics = my_earthsat.at(ts.utc(times))

Это даст вам список астрометрии в каждый раз, когда вы указали. Вы можете использовать эти объекты, чтобы получить позиции (и я думаю, скорости) вашего объекта практически в любых единицах измерения или системе отсчета, которые вам нравятся. Например, вы можете получить высоту и азимут в радианах для каждого элемента в списке, например:

alt_az = []
for ast in astrometrics:
    alt_az.append(ast.altaz().radians

К счастью, Skyfield разработан для временных объектов, которые являются массивами NumPy, и будет генерировать столько позиций, сколько есть объектов в массиве. Вот раздел документации, описывающий функцию:

http://rhodesmill.org/skyfield/time.html

И вот пример, который выполняет задачу, которую вы описываете:

from numpy import arange
from skyfield.api import load, EarthSatellite

iss_tle0 = """\
1 25544U 98067A   18184.80969102  .00001614  00000-0  31745-4 0  9993
2 25544  51.6414 295.8524 0003435 262.6267 204.2868 15.54005638121106
"""
my_earthsat = EarthSatellite(*iss_tle0.splitlines())

tz_offset = -4

ts = load.timescale()
t = ts.utc(2018, 6, 21, tz_offset, 0, arange(24 * 60 * 60))
astrometrics = my_earthsat.at(t)

Этот код в настоящее время не особенно быстр, потому что вычисления на спутниках Земли еще предстоит оптимизировать, но он должен быть быстрее, чем создание нескольких временных объектов вручную в цикле.

Другие вопросы по тегам