выходные данные, не соответствующие sgp4 в C++, pyephem и Heavens Above

Я пытаюсь предсказать, рассчитать позиции и предсказать проходы спутника 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++, как только сделаю это правильно.

Я очень надеюсь, что есть кто-то, кто может мне помочь, так как я сейчас совершенно беспомощен, и даже минимальный пример не работает. Я знаю, что уже есть похожий пост , но я не думаю, что дал ему возможность перепутать системы координат, что было проблемой в другом посте.

Заранее большое спасибо!


person Bloch    schedule 03.02.2016    source источник