국제우주정거장(ISS) 위치 파이썬으로 간단히 알아보기

페이지 정보

121 조회
1 댓글
4 추천

본문

천문우주당에 맞는 주제인지 애매하지만, 그래도 여기 당원들이 가장 재미있게(뭐???) 보실 수 있을 거 같아 적어봅니다.

원문은 제 블로그 글입니다.


국제우주정거장(ISS)이란

다들 잘 아시겠지만, 그래도 도입부에 설명이 없으면 허전하니까...

국제우주정거장(International Space Station, ISS)은 지구 궤도를 도는 거대한 구조물입니다.
여러 국가들이 협력하여 만든 것으로, 1998년 11월 20일에 처음으로 인공위성으로 발사되었죠.

비행 고도는 약 400 km이며, 지구를 90분에 한 바퀴 돌고 있습니다.
7.5 km/s의 어마어마한 속도로 움직이고 있어, 하루에 16번의 일출과 일몰을 경험합니다.


우주 물체의 위치를 기술하는 법

우리가 지표면 위에서 위치를 기술할 때는 경위도 좌표계를 사용합니다.

이 좌표계를 사용할 수 있는 것은 지구가 자전할 때 지상의 거의 모든 것이 함께 움직이기 때문이죠.
이렇게 지구의 자전을 고려한 좌표계를 ECEF(Earth-Centered, Earth-Fixed)라고 합니다.

하지만, ISS는 자전의 영향을 받지 않기 때문에 ECEF로 위치를 기술하기 어렵습니다.
(물론 다른 좌표계로 계산한 좌표를 ECEF로 변환할 수 있습니다)

이렇게 지구 중심을 기준으로 하되, 지표면을 기준으로 하지 않는 좌표계를 ECI(Earth-Centered Inertial)라고 합니다.

ECI에서는 그리니치 천문대가 아니라 춘분점을 기준으로 좌표를 기술합니다.
그리고, 경위도가 아니라 XYZ 축의 직교좌표계를 사용합니다.


ISS의 위치 파악

ISS를 비롯한 우주 물체의 위치를 파악하는 방법은 여러 가지가 있습니다.

가장 간단하게는 Heavens-Above 와 같은 웹사이트를 이용하는 것이죠.
괜찮은 방법이지만, 파악된 위치를 바탕으로 다른 계산을 하기 어려워요.
그냥 보는 용도일 뿐이죠.

또 다른 단순한 방법은 Open Notify 와 같은 API를 이용하는 겁니다.

이 곳의 API를 이용하면, ISS의 현재 위치를 알 수 있어요.
하지만, 고도 정보가 나오지 않고, 위치 정보 역시 정확도가 떨어져요.

{
"message":"success",
"timestamp":1711887329,
"iss_position":{
"latitude":"-6.2352",
"longitude":"152.2210"
}
}


좀 더 정석적인 방법은 TLE(Two-Line Element Set)를 이용하여 계산 하는 겁니다.

TLE는 위성의 궤도를 정의하는 데 사용되는 데이터 포맷이에요.


ISS (ZARYA)
1 25544U 98067A 24124.37025281 .00022572 00000-0 39038-3 0 9995
2 25544 51.6372 177.6144 0003919 133.4619 331.6621 15.50851710451594


이 파일은 CelesTrak과 같은 사이트에서 다운로드할 수 있어요.
(하루만 지나도 계산에 오차가 생기기 때문에 항상 최신 버전을 받는 게 좋습니다)
TLE 파일을 이용하면, ISS의 위치를 시간별 아니, 초 단위로도 추적할 수도 있어요.
단, TLE에서 1차 변환한 위치는 ECI 좌표계로 나오기 때문에, 이를 ECEF 좌표계로 변환해야 합니다.
이 변환을 한번에 해주는 라이브러리로는 PyEphemSkyfield 등이 있어요.

소스를 뜯어보니 PyEphem은 지금 사용하긴 조금 애매해요.
내부적으로 WGS66 좌표계(그것도 엄밀하겐 좀 다른...)를 사용하는 문제도 있고 그렇습니다.

역사적으로 보면 이게 더 오래된 라이브러리인데, 좀 아쉽기도 하고 그래요...


SkyField를 이용한 ISS 위치 계산

SkyField로 계산하려면 일단 TLE를 읽어와야 됩니다.

from skyfield.api import load

def get_iss_object_skyfield():
satellites=load.tle_file(url='https://live.ariss.org/iss.txt',reload=True)
iss=satellites[0]
return iss


인자로 시간만 넣어주면 좌표는 원하는 방식으로 다 얻을 수 있어요.

from datetime import datetime, timezone
from skyfield.api import wgs84
from astropy import units as u

def
get_iss_position_skyfield():
iss=get_iss_object_skyfield()

ts
=load.timescale()
time_now=datetime.now(timezone.utc)

geocentric
=iss.at(ts.from_datetime(time_now))
subpoint=wgs84.subpoint(geocentric)

xyz
=subpoint.itrs_xyz.to(u.m)
xyz=xyz.transpose()

return xyz,subpoint,time_now


결과

아래와 같이 지정된 시간의 정확한 위치를 알 수 있습니다.

물론, 소수점 아래 자리는 더 길게 볼 수 있고요.

ISS position at specific timestamp with Skyfield
[#################################] 100% iss.txt
[-5979754.8106158 3153898.55929926 -734236.95911065] m
WGS84 latitude -6.2373 N longitude 152.1915 E elevation 422381.6 m
2024-03-31 12:15:29+00:00


덧1. 제 블로그 글에는 PyEphem에서 읽는 코드도 나와있습니다.

덧2. ISS 고도가 400 km 정도라는 게 상식인데, 제가 뽑았을 땐 언제나 420 km 안팎이었습니다.

덧3. 우리 편집기의 기능은 아직 가야할 길이 멀군요... 코드 적는 게 좀 힘들었어요... ㅠㅠ

댓글 1
전체 215 / 1 페이지
전체 검색