주제: SGP4 라이브러리 활용
작성: 2024-07-14 (수정 : 이전글 삽입)
1. SGP4 인공위성의 궤도예측 알고리즘
SGP4(Simplified General Perturbations model 4)는 인공위성의 궤도를 예측하는 알고리즘으로, TLE(Two-Line Element) 데이터를 입력받아 위성의 초기 상태(위치와 속도)를 설정합니다. 이후, 특정 시간을 입력받아 그 시간 동안의 궤도 변화를 계산합니다. 이 과정에서 지구의 중력장, 대기 저항, 태양과 달의 중력 영향 등을 섭동(외부요인)을 고려하여 위성의 새로운 위치와 속도를 예측하게 됩니다.
Propagation(전파)와 섭동모델(Perturbations Model)에 대한 내용은 따로 정리하여 포스팅하도록 하겠습니다.
2. TLE 활용하여 위성 위치파악
2.1. SGP4 라이브러리 예제
위성 TLE 다룰 수 있는 python 라이브러리는 Skyfield 또는 SGP4가 있습니다. 이번에는 SGP4 라이브러리를 사용해보도록 하겠습니다.
해당 라이브러리 예제코드는 https://pypi.org/project/sgp4/ 참조하였습니다.
# 라이브러리
from sgp4.api import Satrec, jday
from datetime import datetime, timedelta
# 위성 TLE 데이터
line1 = "1 25544U 98067A 24190.17875425 .00013283 00000-0 24276-3 0 9996"
line2 = "2 25544 51.6395 211.3296 0010403 43.4163 74.3482 15.49669027461800"
# 위성위치 찾기
def get_satellite_position(norad_id, dt):
satellite = Satrec.twoline2rv(line1, line2)
jd, fr = jday(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second)
# print("Jd :", jd) ; print("fr :", fr)
e, r, v = satellite.sgp4(jd, fr)
if e != 0:
raise RuntimeError(f"Error in SGP4 propagation: {e}")
# print("e :", e) ; print("r :", r); print("v :", v)
return r
# 일자기입
norad_id = 25544
dt = datetime(2024, 8, 12, 7, 0, 0) # 시간예시
position = get_satellite_position(norad_id, dt)
print("Satellite Position (km):", position)
[결과값]
Jd : 2460534.5
fr : 0.2916666666666667
2460534.7916666665
e : 0
r : (2277.3112386879848, -3547.323542432612, 5315.225275535673)
v : (6.581137176212806, 3.932715266435968, -0.18712352088187673)
Satellite Position (km): (5537.357826387536, 3938.8573370978133, -274.34167095682693)
2.2. 샘플코드 설명
Julian Day(JD)와 TLE 데이터의 관계
- Julian Day(JD)는 특정한 시작 시점(서기 기원전 4713년 1월 1일, 그레고리력 기준 정오)부터 경과한 일수를 나타내며, 그레고리력이나 율리우스력과 달리 연속된 숫자로 날짜와 시간을 표현합니다.
- TLE 데이터는 UTC 기준의 특정 날짜와 시간을 포함하고 있는데, 이를 계산하기 위해 JD가 필요합니다.
- 이 방식은 날짜와 시간을 연속적으로 표현할 수 있기 때문에 높은 정밀도와 일관성을 제공하며 천문학적인 계산에서 많이 사용됩니다.
왜 JD는 항상 0.5로 소수점으로 표현할까?
해당 질문의 답을 알기 위해서는 Julian Date와 UTC 자정의 관계부터 살펴봐야 합니다.
Julian Date는 하루를 정수 부분과 소수 부분으로 나눕니다. 정수 부분은 전체 날짜를 나타내고, 소수 부분은 하루 중 시간의 비율을 나타냅니다. 예를 들어, 2024년 7월 12일 12:00:00의 Julian Date는 2460503.5입니다.
- 2460503은 2024년 7월 11일 12:00:00 UTC를 나타내는 정수 부분입니다.
- 0.5는 하루의 절반을 나타내는 소수 부분으로, 12:00:00 UTC를 의미합니다.
즉, UTC 자정을 기준으로 Julian Date를 설정하려면 정수 부분에 0.5를 추가해야 합니다.
- 만약 jd가 2460503.0이라면, 이는 2024년 7월 11일 12:00:00 UTC를 의미합니다.
- 이때, jd에 0.5를 더하면 2460503.5가 되며, 이는 2024년 7월 12일 00:00:00 UTC를 나타냅니다.
이 방식으로 Julian Date를 정수 부분과 소수 부분으로 나누어 사용하면, UTC 자정을 기준으로 정확하게 날짜와 시간을 계산할 수 있습니다. 계산의 편의성을 위해 기준을 잡는 거를 확인할 수 있습니다!
satellite.sgpt4(jd, fr) 함수 결과값 : e, r, v
satellite.sgp4(jd, fr) 함수값은 3가지 결과값을 반환합니다.
- e:
- e는 SGP4 알고리즘의 에러 코드를 나타냅니다.
- e = 0이면 성공적으로 계산되었음을 의미하고, 다른 값은 에러가 발생했음을 의미합니다.
- 에러가 발생하면 RuntimeError 예외가 발생합니다.
- r:
- r은 위성의 위치 벡터를 나타냅니다.
- 이는 위성이 주어진 시간에 지구 중심을 기준으로 하는 지구 중심적 관성 좌표계(Earth-Centered Inertial, ECI)에서의 위치를 3차원 좌표계로 나타낸 것입니다.
- 단위는 킬로미터(km)입니다.
- 예를 들어, r = [x, y, z] 형태로 반환되며, 각각의 값은 위성의 x, y, z 좌표를 나타냅니다.
- v:
- v는 위성의 속도 벡터를 나타냅니다.
- 이는 위성이 주어진 시간에 지구 중심적 관성 좌표계(ECI)에서의 속도를 3차원 좌표계로 나타낸 것입니다.
- 단위는 킬로미터/초(km/s)입니다.
- 예를 들어, v = [vx, vy, vz] 형태로 반환되며, 각각의 값은 위성의 x, y, z 축을 따라 움직이는 속도를 나타냅니다.
🧑🏻💻 다음 포스팅에서는 🧑🏻💻
다음 포스팅에서는 기존에 샘플코드를 일부를 변경해서 시각화작업까지 해보도록 하겠습니다.
Reference
- sgp4 소개 : https://pypi.org/project/sgp4/
- sgp4 라이브러리글: https://9574m.tistory.com/28
'Python > 3️⃣ 프로그래밍' 카테고리의 다른 글
[위성궤도] TLE 활용하여 위성위치 파악하기(코드 포함) (6) | 2024.07.14 |
---|---|
[위성궤도] Propagation(전파)와 섭동모델(Perturbations Model) (0) | 2024.07.14 |
[위성궤도] 넌 또 뭐냐...위성 TLE 데이터 (0) | 2024.07.14 |
[위성궤도] 위성고유번호 NORAD ID란? (3) | 2024.07.10 |
[위성궤도] NOAA에서 소유 및 운영 중인 위성들 (1) | 2024.07.09 |