卫星星历,又称为两行轨道数据(TLE,Two-Line Orbital Element),由美国celestrak发明创立,是用于描述太空飞行体位置和速度的表达式———两行式轨道数据系统。卫星星历格式,又称为两行式轨道数据格式(TLE,Two-Line Orbital Element Set Format)。
格式含义
卫星星历的结构为上下两行,每行69个字符,包括0~9、A~Z(大写)、空格、点和正负号,其他字符是无意义的。
第0行,将第1行视为0行,是卫星通用名称,最长为24个字符。
第1行和第2行是标准的卫星星历格式(TLE格式),每行69个字符,包括0~9,A~Z(大写)、空格、点和正/负号,除此之外的其他字符都是无意义也无效的。
卫星星历编号含义
(1)第1行,字符号1是轨道数据。
(2)第1行的1~3和第2行2~3是卫星编号;
(3)1~4是秘密分级,U、C 或S。
U表示此数据是不保密的,可供公众使用的;C 表示此数据是保密的,仅限NORAD使用;S表示此数据是保密的,仅限NORAD使用。
(4)1~6是卫星的发射年份;
(5)1~10是轨道数据的建立时间,按世界标准时间;
(6)1~21是两个轨道比较参数;
(7)每行的最后一位都是以10为模的校验位,可以检查出90%的数据存储或传送错误。
轨道计算
目前比较好的python计算卫星轨道的模型由sgp4 · PyPI(sgp4 · PyPI)提供:
具体使用方法为:
from sgp4.api import jday
from sgp4.api import Satrec
jd, fr = jday(2019, 12, 9, 20, 42, 0)
s = '1 25544U 98067A 19343.69339541 .00001764 00000-0 38792-4 0 9991'
t = '2 25544 51.6439 211.2001 0007417 17.6667 85.6398 15.50103472202482'
satellite = Satrec.twoline2rv(s, t)
e, r, v = satellite.sgp4(jd, fr)
不足的地方为,计算结果给出的卫星坐标r是在ECI坐标系下的,并不是我们常用的经纬高信息,因此需要将ECI坐标转换为地理经纬高信息,以starlink卫星的TLE星历为例进行测试,具体星历为:
STARLINK-1007
1 44713U 19074A 24148.66392376 .00001824 00000+0 14133-3 0 9990
2 44713 53.0531 229.1823 0001294 101.8174 258.2960 15.06399252250790
实现代码为:
if __name__ == '__main__':
year = 2024
mon = 5
day = 16
hr = 15
minute = 30
sec = 30.125
jd, fr = jday(year, mon, day, hr, minute, sec)
# jd1, fr1 = julianday(year, mon, day, hr, minute, sec)
s = '1 44713U 19074A 24148.66392376 .00001824 00000+0 14133-3 0 9990'
t = '2 44713 53.0531 229.1823 0001294 101.8174 258.2960 15.06399252250790'
satellite = Satrec.twoline2rv(s, t)
e, r, v = satellite.sgp4(jd, fr)
sat_ECI = [x * 1.0e3 for x in r]
xsat_ecf = ECI2ECEF(year, mon, day, hr, minute, sec, sat_ECI)
alat, alng, alt = xyz2llh(xsat_ecf[0], xsat_ecf[1], xsat_ecf[2])
print("xsat_ecf:", xsat_ecf)
print("alat:", alat)
print("alng:", alng)
print("alt:", alt)
计算结果如下:
xsat_ecf: [-6119718.528428664, 2514294.8929885253, -2056444.6988101376]
alat: -17.367165265415018
alng: 157.66462206459067
alt: 552073.3401240921
后面可以一期详细的教程,介绍ECI转换为地理经纬高的方法。