Вывод не совпадает с sgp4 в C++, pyephem и Heavens Above
Я пытаюсь предсказать, рассчитать позиции и предсказать проходы спутника LEO из файла TLE. Для удобства я просто беру международную космическую станцию.
До сих пор я загружал библиотеки spg4 и библиотеки sgp4 для C++ и рассматривал два примера программ sattrak и passpredict. Первый дает положение земного спутника в системе координат ECI, а последний предсказывает, когда он будет виден из определенного места на земле.
Единственное, что я до сих пор делал - это входил в недавний файл TLE, изменял позицию наблюдателя и компилировал его, один раз с включенным make-файлом и один раз через g++ foo.cpp -o bar /usr/lib/libsgp4
Сравнивая результаты с предсказанными проходами на Небесах Выше, результаты значительно отличаются. Для прогнозируемых проходов, например, от нескольких секунд до примерно 90 секунд. Максимальная высота швов не так уж и неправильна, хотя Heavens Above округляется на полных градусах, что затрудняет сравнение. Чтобы исключить, что они просто отличаются по своему алгоритму определения того, виден ли спутник, я сравнил его с данными из саттрака, подтвердив, что вычисленные позиции на самом деле разные.
Я также попробовал то же самое, используя библиотеку 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++, как только у меня получится.
Я действительно надеюсь, что есть кто-то, кто может помочь мне, потому что я сейчас совершенно беспомощен, даже с минимальным примером работы. Я знаю, что подобный пост уже существует, но я не думаю, что я дал ему возможность спутать системы координат, что было проблемой в другом посте.
Заранее большое спасибо!