본문 바로가기

작은 공부방

sgp4 Library & TLE(two-line element set)

반응형

Simplified perturbations models

  이는 5개의 수학적인 모델(SGP, SGP4, SDP4, and SDP8) 을 사용해서 위성의 orbital state vectors를 계산한다. 이는 지구시스템에 적용되는 모델이다. 이러한 모델 중 SGP4는 주로 TLE(two-line element sets)를 이용해서 계산하는데, 이러한 TLE는 NORAD 나 NASA에서 데이터를 얻어서 진행할 수 있다.

 

TLE(two-line element set)

  이는 orbital elements를 encoding 하는 방식이다. 어떤 주어진 지점과 시간(epoch)을 포함한다. 인터넷 프로토콜 처럼 문법이 있어서 이에 따라서 해석하면 된다. 실제로 미국에서는 이러한 TLE를 인터넷에 공개적으로 배포하여 연구 등에 자유롭게 활용할 수 있도록 하고있다. 이 인코딩 양식은 다음에서 확인할 수 있다. (나사 공식 홈페이지)

 

   ISS의 TLE와 이를 해석한 단락이다.

ISS (ZARYA)
1 25544U 98067A   08264.51782528 -.00002182  00000-0 -11606-4 0  2927
2 25544  51.6416 247.4627 0006703 130.5360 325.0288 15.72125391563537

 

Line1(속도 정보)

1 01 Line number 1
2 03–07 Satellite catalog number 25544
3 08 Classification (U: unclassified, C: classified, S: secret) U
4 10–11 International Designator (last two digits of launch year) 98
5 12–14 International Designator (launch number of the year) 067
6 15–17 International Designator (piece of the launch) A
7 19–20 Epoch year (last two digits of year) 08
8 21–32 Epoch (day of the year and fractional portion of the day) 264.51782528
9 34–43 First derivative of mean motion; the ballistic coefficient [12] -.00002182
10 45–52 Second derivative of mean motion (decimal point assumed) [12] 00000-0
11 54–61 B*, the drag term, or radiation pressure coefficient (decimal point assumed) [12] -11606-4
12 63–63 Ephemeris type (always zero; only used in undistributed TLE data) [13] 0
13 65–68 Element set number. Incremented when a new TLE is generated for this object. [12] 292
14 69 Checksum (modulo 10) 7

Line Number: 말 그대로 1번 라인인지 2번 라인인지를 설명한다.

Satellite catalog number: 미국 우주사령부(SPACECOM)에서 몇 번째로 발사된 위성인지 알려주는 고유 번호이다.

Classification:

Mean motion: 원 궤도를 돌고 있다고 가정할 때, 일당 회전수이다. n이라고 표현한다.

Ballistic coefficient: 공기 저항 계수와 비슷한 개념이다. 단위가 있다.


Line2(대부분 위치 정보)

1 01 Line number 2
2 03–07 Satellite Catalog number 25544
3 09–16 Inclination (degrees) 51.6416
4 18–25 Right ascension of the ascending node (degrees) 247.4627
5 27–33 Eccentricity (decimal point assumed) 0006703
6 35–42 Argument of perigee (degrees) 130.5360
7 44–51 Mean anomaly (degrees) 325.0288
8 53–63 Mean motion (revolutions per day) 15.72125391
9 64–68 Revolution number at epoch (revolutions) 56353
10 69 Checksum (modulo 10) 7

Inclination: 궤도 기울기(위도와 비슷한 개념으로 이해)

Right ascension of the ascending node: 승교점 적경이라고 하는데, 얼마나 각도가 틀어져 있는지를 의미하는 듯

Eccentricity: 궤도 이심률

Argument of perigee: 궤도 평면 상에서 얼마나 이동했는지 나타내는 각도

Mean anomaly: 타원에서의 운동을 원 운동으로 바꿨을 때 위치를 나타낸다.

 

이해를 돕기 위해서 사진을 첨부한다. 

 

OMM

TLE에서 satellite의 일련번호는 총 99999개이다. 그러다보니 이 일련번호가 모두 찼을 때를 대비해서 이용하는 다른 데이터 양식도 있다. 이 라이브러리에서는 이를 지원한다. 

 

SGP4 Library

Inital Setting

이제 이를 사용하는 방법을 익혀야 하는데 프로그램 예제를 통해서 알아보자

>>> from sgp4.api import Satrec
>>>
>>> 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)
>>>
>>> jd, fr = 2458827, 0.362605
>>> e, r, v = satellite.sgp4(jd, fr)
>>> e
0
>>> print(r)  # True Equator Mean Equinox position (km)
(-6102.44..., -986.33..., -2820.31...)
>>> print(v)  # True Equator Mean Equinox velocity (km/s)
(-1.45..., -5.52..., 5.10...)

먼저 기본적으로 TLE 데이터를 이용해서 Satrec의 정보를 입력하고, 율리시스력과 fraction을 넣어주면 계산해서 결과 속도와 결과 위치를 알려준다. 이때, 이 좌표계는 True Equator Mean Equinox position인데, 결과 값은 이를 이용해서 해석하면 된다. 이는 satellite를 정의하는 intial setting으로 이해하면 된다.

 

여기에서 프로그램의 효율성을 위해서 jd와 fr은 여러가지 값이 들어갈 수 있다. 양식은 다음과 같다.

>>> jd = np.array((2458826, 2458826, 2458826, 2458826))
>>> fr = np.array((0.0001, 0.0002, 0.0003, 0.0004))

 

Epoch

처음에 TLE를 통해서 입력해준 값의 인자를 받을 수 있는 방법이 있는데, 이는 다음과 같다.

>>> satellite.epochyr
19
>>> satellite.epochdays
343.69339541

>>> satellite.jdsatepoch
2458826.5
>>> satellite.jdsatepochF
0.69339541

이때, 뒤에 두 자리로만 식별이 가능한 이유는 스푸트니크가 1957년에 발사되었기 때문이다. 57~99까지는 1900년대를 의미하고, 나머지는 2000년대를 의미하므로 이는 2019년에 발사되었다. 또한 이 days는 days2mdhms 함수를 이용해서 변환이 가능하다. 또한 Julian date를 바로 제공하기도 한다.

>>> from sgp4.api import days2mdhms
>>> month, day, hour, minute, second = days2mdhms(19, 343.69339541)
>>> month
12
>>> day
9
>>> hour
16
>>> minute
38
>>> second
29.363424

 

Export

 이 Satrec 객체를 다른 사람과 나누고자 할때에는 다시 OMM이나 TLE로 변환할 수 있는 방법이 있다.

>>> from sgp4 import exporter
>>> line1, line2 = exporter.export_tle(satellite)
>>> line1
'1 25544U 98067A   19343.69339541  .00001764  00000-0  38792-4 0  9991'
>>> line2
'2 25544  51.6439 211.2001 0007417  17.6667  85.6398 15.50103472202482'

 

>>> from pprint import pprint
>>> fields = exporter.export_omm(satellite, 'ISS (ZARYA)')
>>> pprint(fields)
{'ARG_OF_PERICENTER': 17.6667,
 'BSTAR': 3.8792e-05,
 'CENTER_NAME': 'EARTH',
 'CLASSIFICATION_TYPE': 'U',
 'ECCENTRICITY': 0.0007417,
 'ELEMENT_SET_NO': 999,
 'EPHEMERIS_TYPE': 0,
 'EPOCH': '2019-12-09T16:38:29.363423',
 'INCLINATION': 51.6439,
 'MEAN_ANOMALY': 85.6398,
 'MEAN_ELEMENT_THEORY': 'SGP4',
 'MEAN_MOTION': 15.501034720000002,
 'MEAN_MOTION_DDOT': 0.0,
 'MEAN_MOTION_DOT': 1.764e-05,
 'NORAD_CAT_ID': 25544,
 'OBJECT_ID': '1998-067A',
 'OBJECT_NAME': 'ISS (ZARYA)',
 'RA_OF_ASC_NODE': 211.2001,
 'REF_FRAME': 'TEME',
 'REV_AT_EPOCH': 20248,
 'TIME_SYSTEM': 'UTC'}​

 

Gravity

 기본적으로 라이브러리에서 WGS-72를 사용하고 있는데, 이를 아래와 같이 인위적으로 바꿔줄 수 있다.

>>> from sgp4.api import WGS72OLD, WGS72, WGS84
>>> satellite3 = Satrec.twoline2rv(s, t, WGS84)

Initial setting without TLE 

sgp4init() 함수를 이용해서 실행한다. 여기서 이 함수에서는 단위가 degree가 아닌 radian을 사용한다.

>>> satellite2 = Satrec()
>>> satellite2.sgp4init(
...     WGS72,                # gravity model
...     'i',                  # 'a' = old AFSPC mode, 'i' = improved mode
...     25544,                # satnum: Satellite number
...     25545.69339541,       # epoch: days since 1949 December 31 00:00 UT
...     3.8792e-05,           # bstar: drag coefficient (1/earth radii)
...     0.0,                  # ndot: ballistic coefficient (revs/day)
...     0.0,                  # nddot: mean motion 2nd derivative (revs/day^3)
...     0.0007417,            # ecco: eccentricity
...     0.3083420829620822,   # argpo: argument of perigee (radians)
...     0.9013560935706996,   # inclo: inclination (radians)
...     1.4946964807494398,   # mo: mean anomaly (radians)
...     0.06763602333248933,  # no_kozai: mean motion (radians/minute)
...     3.686137125541276,    # nodeo: R.A. of ascending node (radians)
... )

 

그 외 객체에 접근하고자 할 때, 검색해서 값을 받아올 수 있다. https://pypi.org/project/sgp4/

반응형