我正在尝试从 TLE 文件中预测计算 LEO 卫星的位置和预测通过。为方便起见,我只乘坐国际空间站。
到目前为止,我所做的是下载用于 C++ 的 spg4 库 sgp4 库并查看了两个示例程序sattrak和passpredict。前者给出了地球卫星在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++ 之间进行交换。
我真的希望有人可以帮助我,因为我现在很无助,甚至连一个最小的例子都没有。我知道,已经有一个类似的帖子,但我不认为我给了它一个混淆坐标系的机会,这是另一篇帖子中的问题。
非常感谢您!