Skip to content

Instantly share code, notes, and snippets.

@HAYASAKA-Ryosuke
Created September 12, 2015 02:43
Show Gist options
  • Save HAYASAKA-Ryosuke/95bb398ae51b09fafce4 to your computer and use it in GitHub Desktop.
Save HAYASAKA-Ryosuke/95bb398ae51b09fafce4 to your computer and use it in GitHub Desktop.
pycon_mini_sapporo_no_demo_desu
#!coding:utf-8
import ephem
import math
class Orbitcalc(object):
C = 299792458 # 光の速さ
_gslat = '' # 観測者の緯度
_gslon = '' # 観測者の経度
_gselev = '' # 観測者の海抜高度
_satname = '' # 対象衛星の名前
_tle1 = '' # TLEの1行目
_tle2 = '' # TLEの2行目
_frequency = '' # 周波数
def __init__(self, gslat, gslon, gselev):
"""
観測者の緯度・経度・高度を設定
"""
self._gslat = str(gslat)
self._gslon = str(gslon)
self._gselev = str(gselev)
def sat_info(self, satname, tle1, tle2, freq):
"""
衛星の軌道要素と中心周波数を設定
"""
self._satname = str(satname)
self._tle1 = str(tle1)
self._tle2 = str(tle2)
self._frequency = str(freq)
def dopplershift(self, rangerate):
"""
ドップラシフトの計算(低軌道衛星速すぎワロスなので一応考慮したほうがいい)
"""
return (self.C / (self.C + rangerate))
def get_gs_pos(self):
"""
観測者の位置を返す(プロパティつかおうぜ感あるけど書き直すのめんどう)
"""
return self._gslat, self._gslon, int(self._gselev)
def get_sat_az_elev(self, sat):
"""衛星の方位角と仰角を返す(どの方向を見れば衛星が飛んでるかわかる!)"""
return math.degrees(sat.az), math.degrees(sat.alt)
def get_sat_pos(self, sat):
"""衛星の位置を返す(3Dマップに描画したら面白いかも)"""
return math.degrees(sat.sublat), math.degrees(sat.sublong), sat.elevation / 1000
def get_sat_aos_maxalt_los(self, sat):
"""衛星がいつくるかわかる(衛星時刻表つくれる)"""
return ephem.localtime(sat.rise_time), math.degrees(sat.transit_alt), ephem.localtime(sat.set_time)
def calc(self):
home = ephem.Observer()
home.lat, home.lon, home.elev = self.get_gs_pos()
# home.date = datetime.datetime(2015, 8, 26, 23, 0)
sat = ephem.readtle(self._satname, self._tle1, self._tle2)
sat.compute(home)
sataz, satalt = self.get_sat_az_elev(sat)
satlat, satlon, satelev = self.get_sat_pos(sat)
satfreq = float(self._frequency) * self.dopplershift(sat.range_velocity)
risetime = ephem.localtime(sat.rise_time)
transit_alt = math.degrees(sat.transit_alt)
settime = ephem.localtime(sat.set_time)
risetime, transit_alt, settime = self.get_sat_aos_maxalt_los(sat)
return sataz, satalt, satelev, risetime, settime, transit_alt, satfreq, satlat, satlon
if __name__ == '__main__':
"""
東京港区付近の位置情報を入力
"""
lat = '35.646266'
lon = '139.753218'
elev = 20
orbit_calc = Orbitcalc(lat, lon, elev)
"""
ISS(国際宇宙ステーション)の軌道要素と周波数を入力
"""
name = "ISS"
tle1 = "1 25544U 98067A 15254.58297567 .00009956 00000-0 15193-3 0 9997"
tle2 = "2 25544 51.6456 12.6443 0000484 340.9417 134.4284 15.55115231961486"
freq = 145.80
orbit_calc.sat_info('ISS', tle1, tle2, freq)
"""
計算
観測者位置からの衛星の方位角,仰角,高度,次のAOS,次のLOS,次の運用時の最大仰角,ドプラ考慮の周波数,衛星の緯度経度
"""
az, alt, elev, risetime, settime, transit_alt, satfreq, lat, lon = orbit_calc.calc()
print(
"方位角:%0.4f度, 仰角:%0.4f度, 高度:%0.2fkm, AOS(JST):%s, LOS(JST):%s, 最大仰角:%0.2f度, 周波数: %0.6f, 緯度・経度:%0.6f, %0.6f" %
(az, alt, elev, risetime, settime, transit_alt, satfreq, lat, lon)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment