Я пытаюсь предсказать, рассчитать позиции и предсказать проходы спутника LEO из файла TLE. Для удобства я просто беру международную космическую станцию.
Что я сделал до сих пор, так это загрузил библиотеки spg4 библиотеки sgp4 для C++ и посмотрел на два примеры программ sattrak и passpredict. Первый дает положение спутника Земли в системе координат ECI, а второй предсказывает, когда он будет виден из определенного места на Земле.
Единственное, что я сделал до сих пор, это ввел последний файл TLE, изменил позицию наблюдателя и скомпилировал его, один раз с включенным make-файлом и один раз через g++ foo.cpp -o bar /usr/lib/libsgp4
Сравнивая результаты с предсказанными проходами в Heavens Above, результаты значительно различаются. Для прогнозируемых проходов, например, от нескольких секунд до примерно 90 секунд. Максимальная высота кажется не такой уж и неправильной, хотя в Heavens Above округляется на полные градусы, что затрудняет сравнение. Чтобы исключить, что они просто отличаются алгоритмом определения того, виден ли спутник, я сравнил его с данными sattrak, подтвердив, что расчетные позиции действительно разные.
Я также пробовал то же самое, используя библиотеку pyephem для python, которая кажется очень удобной. Я попробовал следующее, чтобы рассчитать следующие пять проходов:
#!/usr/bin/python
import sys
import math
import ephem
iss = ephem.readtle("ISS Zarya",
"1 25544U 98067A 16034.21638441 .00007171 00000-0 11436-3 0 9997",
"2 25544 51.6442 11.1183 0006796 73.3436 50.5136 15.54391313983985")
observer = ephem.Observer()
observer.lat = '48'
observer.lon = '16'
observer.elevation = 179
observer.horizon = '10'
print("observer:\nLattitude: ", observer.lat,"\n Longitude: ", observer.lon,"\n", "horizon: ", observer.horizon,"\n")
for p in range(5):
tr, azr, tt, altt, ts, azs = observer.next_pass(iss)
rise = tr
print("===============================")
while tr < ts:
observer.date = tr
iss.compute(observer)
tr = ephem.Date(tr + 10 * ephem.minute)
print("Rise: ", rise)
print("Set time: ", ts)
print("Duration: ",math.floor((ts-rise)*60*24), "min", math.floor(((ts-rise)*60*24)%1*60), "s")
print("Max. Alt: %4.2f \n" % (math.degrees(altt)))
observer.date = tr + ephem.minute
Однако результаты также не совпадают с Heavens Above (или кодом C++), хотя разница всегда меньше 10 секунд.
Честно говоря, я ничего не знаю о подпрограммах libastro, используемых в pyephem, и поэтому не доверяю им на 100%. Пожалуйста, поправьте меня, если я ошибаюсь.
У кого-нибудь есть идеи, почему я не получаю ожидаемых результатов? На мой взгляд, использование неизменной программы passpredict дает очень мало шансов ее испортить.
Мне все равно, буду ли я использовать C++ или python, пока получаю хорошие результаты. Кроме того, python-sgp4 выглядит так хорошо, что я вполне уверен, что смогу легко переключаться между python и C++, как только сделаю это правильно.
Я очень надеюсь, что есть кто-то, кто может мне помочь, так как я сейчас совершенно беспомощен, и даже минимальный пример не работает. Я знаю, что уже есть похожий пост , но я не думаю, что дал ему возможность перепутать системы координат, что было проблемой в другом посте.
Заранее большое спасибо!