从TLE计算ECEF卫星位置

时间:2017-02-17 20:25:15

标签: python pyephem

我正在计算使用mi位置(纬度 - 经度)的卫星位置,我想知道从我的位置可以看到哪些卫星(我的接收器)。为此,我使用了这个blog的帮助,我正在使用 Pyphem ,python库,并使用 TLE 文件的信息。有了这个,我可以知道位置,但我可以获得最大的文件范围,文件在this站点。 例如该文件获取信息从12-01-2017 1:00到13-01-2017 23:59,我想知道14-01-2017 13:05的位置 问题是我明天可以获得TLE文件吗?或者只是我可以获取今天的文件?

更新1。

python中的

my code是:

TimeNow = datetime.datetime.now() #"10/01/2017"
Longitude = -73.1198 
Latitude = 7.11392
print TimeNow

sat_alt, sat_az, sat_name = [], [], []

observer = ephem.Observer()
observer.long = '-73.1224429' # '-37.799423'
observer.lat = '7.1388027' # '144.999979'
observer.date = datetime.datetime.now()

GPS_list = 'http://www.celestrak.com/NORAD/elements/gps-ops.txt'
GPS2_list = 'http://www.tle.info/data/gps-ops.txt'
GLONASS_list = 'http://www.celestrak.com/NORAD/elements/glo-ops.txt'
GLONASS2_list = 'http://www.tle.info/data/glo-ops.txt'
#'http://www.amsat.org/amsat/ftp/keps/current/nasabare.txt').readlines()


tles = urllib2.urlopen(GPS_list).readlines() 

tles = [item.strip() for item in tles]
tles = [(tles[i],tles[i+1],tles[i+2]) for i in xrange(0,len(tles)-2,3)]

for tle in tles:

    try:
        sat = ephem.readtle(tle[0], tle[1], tle[2])
        rt, ra, tt, ta, st, sa = observer.next_pass(sat)

        if rt is not None and st is not None:
            #observer.date = rt
            sat.compute(observer)

            #if 'PRN 26' in tle[0]:
                #print "TRUE"
            if TimeNow <= ephem.localtime(st) and TimeNow >= ephem.localtime(rt):
                text = tle[0]
                sat_alt.append(np.rad2deg(sat.alt))
                sat_az.append(np.rad2deg(sat.az))

                text2 = text.rsplit(')', 1)[0]
                text3 = text2.rsplit('(', 1)[1]
                sat_name.append(text3)
                print text3, np.rad2deg(ra),np.rad2deg(sa)
    except ValueError as e:
        print e

结果:

PRN 19 228.755917041 148.703886987
PRN 02 221.648736379 143.285115427
PRN 17 221.556446863 146.188232693
PRN 30 322.13237575 60.4800956664
PRN 06 211.849518618 131.038791151

在这个问题中,我有今天的信息(2017年2月28日)我在链接中有今天的TLE文件,但如果我想要明天的信息?

谢谢

更新2:

您可以将变量TimeNow更改为另一个日期(例如now + 2 hours),但是如果使用今天的TLE文件我尝试计算位置(海拔高度),我不会发现错误是怎么回事/ azimuth)明天或明天过去,错误会太大?多少? (我正在阅读this试图找到答案)我希望有人知道。谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解您的问题,您想在一段时间内从其 TLE 中获取卫星的位置,那么您可以使用 sgp4 库获取卫星 TLE 的笛卡尔坐标:

pip 安装 sgp4

从 sgp4.api 导入 Satrec

从 sgp4.api 导入 jday

然后你把第一行 TLE 放在变量 s 中,第二行放在变量 t 中,如下所示:

s = '1 25544U 98067A 21035.51324206 .00001077 00000-0 27754-4 0 9998'

t = '2 25544 51.6455 278.9410 0002184 336.6191 80.6984 15.48940116268036'

卫星 = Satrec.twoline2rv(s, t)

然后你选择你想要的日期,(年、月、日、小时、分钟、秒)像这样:

jd, fr = jday(2021, 2, 4, 18, 5, 0)

e, r, v = 卫星.sgp4(jd, fr)

并且您在笛卡尔坐标系中得到了错误“e”、位置向量“r”和速度向量“v”。

https://josephinepicot.medium.com/get-the-cartesian-position-velocity-vectors-of-a-satellite-at-a-given-time-from-a-tle-60d29e31c422

现在,如果您的卫星是地球同步的,很容易知道它第二天的位置,但如果不是,您也许可以用之前的位置向量绘制时间序列...

希望有帮助!