Created
September 12, 2015 02:43
-
-
Save HAYASAKA-Ryosuke/95bb398ae51b09fafce4 to your computer and use it in GitHub Desktop.
pycon_mini_sapporo_no_demo_desu
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!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