Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

人工衛星の回帰日数計算をGoogle Cloud Function化

背景

先日作った「人工衛星の回帰日数を計算するツール*1」を、Google Cloud Function化してみました。参考にしたのは、日本語のブログ記事*2と、Google Cloud Functionのドキュメント*3です。

Cloud Functionというのは、関数呼び出し的にGoogle Cloudを使うサービスで、仮想マシンやWebサーバーを用意しなくても、比較的軽い単発の処理を、HTTPリクエスト等で呼び出すことができます。

当方にとって一番うれしいのは、無料で使えることです。つまり、Google Cloud Platformの無料枠内で月に200万回呼び出し可能なことです*4

結果

下記が、回帰日数計算をCloud Functionとして利用するためのフォームです。


TLE (衛星名含めた3行。省略時はCOSMO-SkyMed-4のTLEを使用):

date[YYYY-MM-DD hh:mm:ss] (省略時は現在時刻を使用):

表示対象の、経度誤差の許容最大値[deg]:

Repeat Cycleの、経度誤差の許容最大値[Km]:


上記で人工衛星のTLEと日時を入力して、「Search Repeat Cycle」ボタンを押すと、例えば下記のような回帰日数計算結果が表示されます。
f:id:Itsukara:20180918020429p:plain

なお、ソースコードGithubにアップ済です*5

つでに、Cloud Functionを呼び出すためのページを、Firebaseに入れてみました。
Cloud FunctionのURLより短く、良いですね:https://repeat-cycle.firebaseapp.com/

苦労した点

データがCloud Functionに渡らない

問題

Cloud Functionは初めてのため、HTMLフォームからCloud Functionにデータ(TLEとdate)が渡せず、非常に苦労しました。Cloud Functionのページに書かれたテスト実行ではデータが渡るのですが、HTMLフォームからは渡らないというもの。

仮解決策

ChromeのDevToolのNetworkで調べたところ、データ自体はちゃんと送られている模様。また、手でURLを修正し、データをURLに直接埋め込むと、上手く行きます(例えば「URL?date=2018-09-17%2011:00:00」等)。

少し調べたところ、formのmethodとして、POSTの代わりにGETを使えば、データがURLに埋め込まれるため、上手く行く模様*6。しかし、GETでは、データが長いとURLが長くなりすぎて、上手く行かない場合があるようです。また、ネットワーク上を生データが流れるので、お勧めできないようです。

本解決策に向けて

そこで、Cloud Functionの関数内に渡される引数「request」からデータを取り出す方法を工夫すれば良いのですが、これも、Cloud Functionのページに書かれたテストでは上手く行くものの、HTMLフォームからPOSTした場合は、値がうまく渡りません。

解決策

Webで、Cloud Function (Python版)の色々な使用例を調べたのですが、結局分からず、Cloud Functionのインターフェースとして使っているFlaskのドキュメントを調べることにより、解決することができました。コードとしては、下記の部分で、特に、request.formを使った部分は、Webでの記載例が見つかりませんでした。POSTで渡されるデータを受け取るには、この部分が必須でした。

request_json = request.get_json()
if request.args:
    if 'TLE' in request.args:
        TLE  = request.args.get('TLE')
    if 'date' in request.args:
        date = request.args.get('date')
elif request_json:
    if 'TLE' in request_json:
        TLE  = request_json['TLE']
    if 'date' in request_json:
        date = request_json['date']
else:
    if 'TLE' in request.form:
        TLE  = request.form['TLE']
    if 'date' in request.form:
        date = request.form['date']

計算結果が改行無しで表示される

問題

上記で、計算結果が表示されるようになったものの、結果が改行無しで表示されるため、非常に読みにくくなりました。
f:id:Itsukara:20180917181903p:plain

解決策

これに関しても、Flaskのドキュメントを調べることにより解決しました。Cloud Functionの戻り値として単に文字列を返す場合、結果のmimetypeが自動的にhtmlになるが原因でした。そこで、下記の様に、mimetypeを指定してResponseオブジェクトを返すことで、上手く表示されるようになりました。

return Response(text, mimetype='text/plain')

SlideShareで再アップロードが無くなり不便...

2年ぐらい前にやったMontezuma's Revengeの強化学習の実験結果を入れていたhttpサーバーの「AWS無料お試し期間」が切れたので、期限がないGoogle Cloud Platform無料枠に引っ越した*1

httpサーバーのURLはSlideShareのスライドにも書いてたので、スライド中のURLを更新しようとしたところ、再アップロードのためのボタンが見当たらない。

調べたところ、再アップロード機能が無くなった模様*2

不便になった...

仕方がないので、スライドのDescriptionで、URLの変更について記載。

しかし、これまで、他人のスライドのDescriptionを見たことが無いので、他の人も見ないと思われる。

どうにかならないものだろうか...

人工衛星の回帰日数計算ツールを作成

背景

人工衛星の軌道にはいくつかの種類がありますが、その中で、1日で元の地点の上空に戻ってくる回帰軌道と、ある程度の日数をかけて元の地点の上空に戻る準回帰軌道があり、戻るまでの日数を回帰日数(Repeat Cycle)と呼びます*1*2

回帰日数は、Web掲載されていることも多いのですが、未掲載の場合もあり、故あって、回帰日数を調べる必要があり、回帰日数計算ツールを作成しました*3

自前で軌道計算 => 失敗

当初、人工衛星の軌道情報である2行軌道要素形式(TLE: Two Line Element*4 )から衛星の軌道を計算しようと、Webで見つかった計算方法*5Excelで試してみたのですが、何故か、何回確認しても計算が合わず、困っていました*6

ライブラリで軌道計算

そこで、無料で利用できる軌道計算ソフトウェアやライブラリがないか調べていたところ、丁度良いライブラリpyehemが見つかりました。

pyehemは、衛星のTLEを与えると、指定日時での衛星の位置を計算でき、衛星直下の緯度(longitude)と経度(latitude)なども分かります。

回帰日数の計算方法

衛星が地球を一周する時間はTLEから分かるので、当初の日時から何回か回った後で緯度・経度を求め、当初の緯度・経度との差がある程度小さければ、元の地点の上空に戻ってきたと分かるはずです。なお、緯度は、何回周回しても当初と同じとの想定です。

上記想定で、回帰日数計算ツールを作ってみたのですが、衛星が何回か回ると、緯度が少しずつズレてくることが分かりました。1周当たりの緯度のズレは約0.2度以下ですが、1日で約3.2度もズレる為、補正が必要と分かりました。そこで、衛星が1周回る度に、当初の緯度と同じになる日時を計算して補正しました*7

テスト結果:COSMO-SkyMed-4(回帰日数16日)

テストとして、回帰日数が既知のCOSMO-SkyMed-4(回帰日数16日)*8で試した結果が下記です。16日後の緯度・経度が、当初の緯度・経度の約250m以内(-0.2431Km)に収まっており、ツールの動作が確認できました。COSMO-SkyMed-4は、非常に高い精度で回帰しているようです。

COSMO-SKYMED 4          
1 37216U 10060A   18258.17806865 -.00000011  00000-0  51372-5 0  9997
2 37216  97.8902  80.4717 0001356  76.0322 284.1025 14.82152713425139

                                         Lat(+N) diff[deg]   diff[Km] |   Long(+E)  diff[deg]   diff[Km]
[2018-09-17 00:39:00 =   0.00(days)]    39.4522    +0.0000    +0.0000 |   -96.8107    +0.0000    +0.0000
[2018-10-03 00:39:00 =  16.00(days)]    39.4522    -0.0000    -0.0008 |   -96.8136    -0.0028    -0.2431
[2018-10-19 00:39:00 =  32.00(days)]    39.4522    -0.0000    -0.0004 |   -96.8119    -0.0012    -0.1051
[2018-11-04 00:38:59 =  48.00(days)]    39.4522    -0.0000    -0.0004 |   -96.8053    +0.0054    +0.4662
[2018-11-20 00:38:57 =  64.00(days)]    39.4521    -0.0000    -0.0011 |   -96.7930    +0.0178    +1.5276
[2018-12-06 00:38:53 =  80.00(days)]    39.4522    -0.0000    -0.0008 |   -96.7747    +0.0360    +3.0975

テスト結果:WorldView-1(回帰日数不明)

次に、回帰日数がWeb未掲載のWorldView-1で試した結果が下記です。回帰日数は119日と非常に長く、また、元の場所から500m程度ズレていることが分かます(-0.5007Km)

WORLDVIEW-1 (WV-1)
1 32060U 07041A   18258.02295190  .00000790  00000-0  35109-4 0  9993
2 32060  97.3879  16.4069 0002228  57.6683  54.8987 15.24397549611548

                                         Lat(+N) diff[deg]   diff[Km] |   Long(+E)  diff[deg]   diff[Km]
[2018-09-18 10:46:01 =   0.00(days)]    -0.1840    +0.0000    +0.0000 |    40.9467    +0.0000    +0.0000
[2018-10-05 10:47:27 =  17.00(days)]    -0.1840    +0.0000    +0.0001 |    40.5894    -0.3573   -39.7724
[2018-10-18 10:42:41 =  30.00(days)]    -0.1840    +0.0000    +0.0000 |    41.7862    +0.8395   +93.4509
[2018-10-22 10:48:26 =  34.00(days)]    -0.1840    +0.0000    +0.0000 |    40.3508    -0.5959   -66.3345
[2018-11-04 10:43:17 =  47.00(days)]    -0.1840    +0.0000    +0.0000 |    41.6392    +0.6925   +77.0936
[2018-11-08 10:48:55 =  51.00(days)]    -0.1840    +0.0000    +0.0000 |    40.2321    -0.7145   -79.5426
[2018-11-21 10:43:25 =  64.00(days)]    -0.1840    +0.0000    +0.0000 |    41.6122    +0.6655   +74.0819
[2018-11-25 10:48:57 =  68.00(days)]    -0.1840    +0.0000    +0.0000 |    40.2332    -0.7135   -79.4297
[2018-12-08 10:43:05 =  81.00(days)]    -0.1840    +0.0000    +0.0000 |    41.7037    +0.7570   +84.2650
[2018-12-12 10:48:30 =  85.00(days)]    -0.1840    +0.0000    +0.0000 |    40.3523    -0.5944   -66.1650
[2018-12-25 10:42:17 =  98.00(days)]    -0.1840    +0.0000    +0.0000 |    41.9123    +0.9656  +107.4907
[2018-12-29 10:47:35 = 102.00(days)]    -0.1840    +0.0000    +0.0000 |    40.5885    -0.3582   -39.8736
[2019-01-15 10:46:12 = 119.00(days)]    -0.1840    +0.0000    +0.0000 |    40.9422    -0.0045    -0.5007
[2019-02-01 10:44:20 = 136.00(days)]    -0.1840    +0.0000    +0.0000 |    41.4151    +0.4684   +52.1456
[2019-02-05 10:49:24 = 140.00(days)]    -0.1840    +0.0000    +0.0000 |    40.1541    -0.7926   -88.2335
[2019-02-22 10:46:57 = 157.00(days)]    -0.1840    +0.0000    +0.0000 |    40.7760    -0.1707   -19.0025
[2019-03-11 10:44:01 = 174.00(days)]    -0.1840    +0.0000    +0.0000 |    41.5179    +0.5712   +63.5844
[2019-03-15 10:48:49 = 178.00(days)]    -0.1840    +0.0000    +0.0000 |    40.3199    -0.6268   -69.7701

テスト結果:WorldView-1(回帰日数不明)、別TLE

更に、上記より少しだけ新しいTLE*9で試した結果が下記です。回帰日数が140日と更に長く、また、元の場所からのズレも9.4Kmと大きいことが分かります(+9.4144Km)。当初の場所と回帰場所のズレとして、どの程度のまで許容できるか気になり、Webで調べましたが、残念ながら基準は見つかりませんでした。もう少しズレが大きくても許容できるならば(+13.8680Km)、回帰日数は102日と考えられるので、何らかの基準が欲しいですね....

WORLDVIEW-1 (WV-1)      
1 32060U 07041A   18258.81766689  .00000958  00000-0  41975-4 0  9990
2 32060  97.3884  17.1911 0002170  64.8045  86.2416 15.24400435611664

                                         Lat(+N) diff[deg]   diff[Km] |   Long(+E)  diff[deg]   diff[Km]
[2018-09-18 10:46:01 =   0.00(days)]    -0.2185    +0.0000    +0.0000 |    40.9431    +0.0000    +0.0000
[2018-10-05 10:47:22 =  17.00(days)]    -0.2185    +0.0000    +0.0001 |    40.6084    -0.3347   -37.2598
[2018-10-18 10:42:28 =  30.00(days)]    -0.2185    +0.0000    +0.0000 |    41.8378    +0.8947   +99.5998
[2018-10-22 10:48:10 =  34.00(days)]    -0.2185    +0.0000    +0.0000 |    40.4152    -0.5279   -58.7642
[2018-11-04 10:42:50 =  47.00(days)]    -0.2185    +0.0000    +0.0000 |    41.7539    +0.8108   +90.2596
[2018-11-08 10:48:24 =  51.00(days)]    -0.2185    +0.0000    +0.0000 |    40.3651    -0.5780   -64.3473
[2018-11-21 10:42:37 =  64.00(days)]    -0.2185    +0.0000    +0.0000 |    41.8132    +0.8701   +96.8600
[2018-11-25 10:48:03 =  68.00(days)]    -0.2185    +0.0000    +0.0000 |    40.4580    -0.4851   -54.0061
[2018-12-12 10:47:09 =  85.00(days)]    -0.2185    +0.0000    +0.0000 |    40.6926    -0.2505   -27.8884
[2018-12-29 10:45:41 = 102.00(days)]    -0.2185    +0.0000    +0.0000 |    41.0677    +0.1246   +13.8680
[2019-01-15 10:43:40 = 119.00(days)]    -0.2185    +0.0000    +0.0000 |    41.5835    +0.6404   +71.2906
[2019-01-19 10:48:40 = 123.00(days)]    -0.2185    +0.0000    +0.0000 |    40.3357    -0.6074   -67.6159
[2019-02-05 10:45:57 = 140.00(days)]    -0.2185    +0.0000    +0.0000 |    41.0277    +0.0846    +9.4144
[2019-02-22 10:42:39 = 157.00(days)]    -0.2185    +0.0000    +0.0000 |    41.8637    +0.9206  +102.4796
[2019-02-26 10:47:21 = 161.00(days)]    -0.2185    +0.0000    +0.0000 |    40.6916    -0.2515   -27.9979
[2019-03-15 10:43:21 = 178.00(days)]    -0.2185    +0.0000    +0.0000 |    41.7050    +0.7618   +84.8073

テスト結果:COSMO-SkyMed-4(日々の軌道のズレ確認)

本ツールでは、経度方向の軌道のズレの許容値を指定できるようになっており、「1°」程度が適切だが、「10°」程度まで許容して計算すると、最初の軌道を基準とした東西方向への軌道のズレを、日々確認することもできる。下記がその結果(プラス符号が東方向)。

COSMO-SKYMED 4
1 37216U 10060A   18258.17806865 -.00000011  00000-0  51372-5 0  9997
2 37216  97.8902  80.4717 0001356  76.0322 284.1025 14.82152713425139

                                         Lat(+N) diff[deg]   diff[Km] |   Long(+E)  diff[deg]   diff[Km]
[2018-09-17 00:39:00 =   0.00(days)]    39.4522    +0.0000    +0.0000 |   -96.8107    +0.0000    +0.0000
[2018-09-18 00:57:13 =   1.01(days)]    39.4521    -0.0000    -0.0011 |  -101.3680    -4.5573  -391.7246
[2018-09-19 01:15:27 =   2.03(days)]    39.4522    -0.0000    -0.0008 |  -105.9252    -9.1145  -783.4468
[2018-09-21 00:14:42 =   3.98(days)]    39.4522    -0.0000    -0.0008 |   -90.7359    +6.0748  +522.1689
[2018-09-22 00:32:55 =   5.00(days)]    39.4522    -0.0000    -0.0008 |   -95.2931    +1.5176  +130.4502
[2018-09-23 00:51:09 =   6.01(days)]    39.4522    +0.0000    +0.0000 |   -99.8503    -3.0395  -261.2661
[2018-09-24 01:09:23 =   7.02(days)]    39.4522    -0.0000    -0.0008 |  -104.4074    -7.5967  -652.9820
[2018-09-26 00:08:37 =   8.98(days)]    39.4522    -0.0000    -0.0008 |   -89.2179    +7.5928  +652.6479
[2018-09-27 00:26:51 =   9.99(days)]    39.4521    -0.0000    -0.0011 |   -93.7750    +3.0357  +260.9368
[2018-09-28 00:45:05 =  11.00(days)]    39.4522    -0.0000    -0.0008 |   -98.3321    -1.5214  -130.7731
[2018-09-29 01:03:19 =  12.02(days)]    39.4521    -0.0000    -0.0011 |  -102.8892    -6.0785  -522.4813

*1:回帰軌道 - Wikipedia

*2:Repeat Cycle以外に、Revisit Timeという指標もあります。Revisit Timeは、同じ場所を再度撮影できるまでの期間であり、通常1日程度です。なお、撮影場所から見える衛星の方向は真上とは限らず、毎回変わるので、衛星方向を傾けて撮影します。そのため、撮影場所の見え方は異なります。参考:What is the difference between a repeat cycle and revisit time for a satellite?

*3:github.com

*4:CelesTrak: Current NORAD Two-Line Element Setsから最新のTELを入手可能

*5:http://www.infra.kochi-tech.ac.jp/takagi/Geomatics/5Estimation2.pdf

*6:離心近点角 E をExcelのソルバーで求めた値E=200.9819218が、記載数値E=200.9785378と一致しない。つまり、記載のE、e、Mの値で計算すると方程式 「E − e sin E = M」が成立しない。具体的には、「E − e sin E - M = 200.9785378 - 0.0001679 * sin( RADIANS(200.9785378) ) - 200.9819819 = -0.0033840」となる。なお、E=200.9819218の場合は「E − e sin E - M = 0」となる。

*7:ニュートン・ラフソン法を繰り返し無しで1回だけ適用

*8:COSMO-SkyMed - Wikipedia

*9:軌道情報の元期(起点)が、上記よりも約0.8日新しい。

第一級陸上無線技術士の免許証が届きました

7月10日~11日に受験した第一級陸上無線技術士の免許証が届きました。
f:id:Itsukara:20180823203316j:plain

下記に書きましたように、合格基準ギリギリでの合格です。
陸上無線の最上位資格なので、さすがに難しかったです。
itsukara.hateblo.jp

第一級陸上無線技術士試験に合格

7月10日~11日に受験した第一級陸上無線技術士試験に合格しました。

f:id:Itsukara:20180804213454j:plain

本日、無線従事者免許を申請したので、約1カ月後に免許取得予定です。

試験直前の約1か月間の土日、試験勉強だけに集中した甲斐がありました。

この期間の土日は、何時も参加しているシンギュラリティサロンやMachine Learning 15 Minutesに欠席し、本当に試験の勉強だけやっていた気がします*1

本試験は、陸上無線技術士の最上位試験であり、昨年合格した第一級陸上特殊無線技士試験と比べて格段に難しかったです(昨年の試験はほぼ満点で合格)。

参考書・問題集は下記4冊を以前から購入してましたが、あまり読めておらず、本格的に勉強を始めたのは試験の約1か月前でした。非常に焦って勉強しました。

  • ①一陸技・無線工学の基礎 完全マスター (461ページ)
  • ②一陸技・無線工学A 完全マスター (445ページ)
  • ③一陸技・無線工学B 完全マスター (433ページ)
  • ④一陸技・無線従事者国家試験問題解答集 (760ページ)

上記①、②は読み終えたのですが、③は半分しか読めませんでした。④に至っては、1/10も読めませんでした。また、これらとは別に、無線法規も勉強する必要があったのですが、間に合わず、昨年使った第一級陸上特殊無線技士試験の参考書に目を通す時間しかありませんでした。

そのため、試験に際しては、各問題の解き方が分からず、非常に時間を掛けて粘りました。他の受験生は、次の科目の準備のために、試験時間の半分ぐらいで退出していましたが、当方は全ての科目で最後まで粘り、退出時には部屋に2~3名しか受験生が残っていませんでした(1つの部屋で100名程度が受験)。試験後に公開された正解を基に自己採点したところでは、感を働かせながら粘って回答した問題が結構正解していたので、粘った甲斐がありました。

ちなみに、下記が自己採点結果で、結構ギリギリでした。

無線工学の基礎 無線工学A 無線工学B 法規
満点 125点 125点 125点 100点
合格点 75点 75点 75点 60点
自己採点結果 113点 91点 95点 72点

なお、参考書は、非常に詳しく書かれており、試験の受験という目的以外、手元に置いておく技術書としても読む価値があります。今回の試験では、十分に読み込めない部分が残ったので、これからも、続けて読んでいきたいと思います。

参考:①一陸技・無線工学の基礎 完全マスター

1陸技・無線工学の基礎完全マスター―第一級陸上無線技術士

1陸技・無線工学の基礎完全マスター―第一級陸上無線技術士

参考:②一陸技・無線工学A 完全マスター

1陸技・無線工学A〈無線機器〉完全マスター 2015~―第一級陸上無線技術士

1陸技・無線工学A〈無線機器〉完全マスター 2015~―第一級陸上無線技術士

参考:③一陸技・無線工学B 完全マスター

一陸技・無線工学B アンテナと電波伝搬完全マスター〈2014‐〉

一陸技・無線工学B アンテナと電波伝搬完全マスター〈2014‐〉

参考:④一陸技・無線従事者国家試験問題解答集

一陸技<第一級陸上無線技術士> (無線従事者国家試験問題解答集)

一陸技<第一級陸上無線技術士> (無線従事者国家試験問題解答集)

参考:昨年合格した第一級陸上特殊無線技士試験

itsukara.hateblo.jp

*1:ただ、土日1回は、妻が楽しみに見ているスカパーのアンテナが受信不能となり、この対応に追われました。原因は、隣の家が建て替え中で、足場が当家まで迫っており、パラボラを邪魔していたためでした。ただ、アンテナの位置を変えていくら調整しても受信できず、結局、スカパーの無料アンテナ調整のお世話になりました。

【DRL,Montezuma】スライドPageViewが1万超+1万4千超

1年半以上前に作成、約1年前に最終更新した2つのスライドのPageViewが、1万超/1万4千超となりました。それなりに見て頂いているようで、嬉しいです。

f:id:Itsukara:20180530193351p:plain

ちなみに、英語版と日本語版の中身は、基本的に同じです。

英語版スライドの効果と思いますが、最近、外人からのLinkedin繋がりリクエストが増えます。とはいっても、1週間に1人ぐらい、合計121人に過ぎませんが...

でんき家計簿:Selenium関連コード修正

1年半ぐらい前に、東京電力の「でんき家計簿」からデータをスクレイピングするツール(でんき家計簿データ抽出ツール)を書いたのですが、最近、Promiseの記事を読んだら、ネストの深い既存コードを、ネストの浅いPromiseチェーン形式でスッキリ書けることが分かったので、改修しました。

Promiseに加え、下記も変更しました。

  • 待ち時間指定を指定した「前日分表示完了待ち」を排除。
  • 「前日ボタン」未表示時の異常終了を回避。(正常終了)
  • ファイルへ書出終了後に、メッセージを出力。

以上により、以前と比べて表示遅れの影響を受けにくくなると共に、正常終了を判定し易くなりました。

なお、今回、気付いたのですが、「でんき家計簿」は電力自由化以前の料金プラン契約者専用で、自由化後の新しい料金プランのWEB検針票および使用量と料金のグラフは「くらしTEPCO」を見る必要があるとのこと。また、最新2年間のデータしか見れなくなったようです。

当方は東京電力未契約のため、「くらしTEPCO」は試すことが出来ず、未対応です。また、当方の電力使用量データは2016/8/18までしかないため、2018/8/18以降は「でんき家計簿」で見れるデータが無くなるため、「でんき家計簿データ抽出ツール」を試すこともできなくなります。

どなたか、「くらしTEPCO」のデータを見れて、時間毎の電力使用量を抽出したい方がいらっしゃいましたら、本ツールを「くらしTEPCO」対応に書き換えて頂けると、ありがたいです。

Promiseの記事

developer.mozilla.org

でんき家計簿データ抽出ツール

github.com