2

我正在尝试从 TLE 文件中预测计算 LEO 卫星的位置和预测通过。为方便起见,我只乘坐国际空间站。

到目前为止,我所做的是下载用于 C++ 的 spg4 库 sgp4 库并查看了两个示例程序sattrakpasspredict。前者给出了地球卫星在ECI坐标系中的位置,后者预测了它何时可以从地球上的某个位置看到。

到目前为止我唯一做的就是输入一个最近的 TLE 文件,更改观察者位置并编译它,一次使用包含的 makefile,一次通过 g++ foo.cpp -o bar /usr/lib/libsgp4

将结果与Heavens Above中的预测通行证进行比较,结果差异很大。对于预测的通过,例如,在几秒到大约 90 秒之间。最大高度接缝并没有那么错误,虽然天堂之上是全度数,这使得它很难比较。为了排除它们只是在确定卫星是否可见的算法上有所不同,我将其与sattrak的数据进行了比较,确认计算出的位置实际上是不同的。

我也尝试使用 python 的 pyephem 库进行相同的操作,这似乎很方便。我尝试了以下方法来计算接下来的五次传球:

#!/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 秒。

老实说,我对 pyephem 中使用的 libastro 例程一无所知,因此不能 100% 相信它们。请纠正我,如果我错了。

有谁知道,为什么我没有得到预期的结果?在我看来,使用未更改的passpredict程序几乎不可能搞砸。

我并不关心我会使用 C++ 还是 python,只要我得到好的结果。此外,python-sgp4 看起来很不错,我很有信心,一旦我做对了,我可以很容易地在 python 和 C++ 之间进行交换。

我真的希望有人可以帮助我,因为我现在很无助,甚至连一个最小的例子都没有。我知道,已经有一个类似的帖子,但我不认为我给了它一个混淆坐标系的机会,这是另一篇帖子中的问题。

非常感谢您!

4

0 回答 0