ARで地球の周りに衛星を飛ばしてみる。
はじめに
先日衛星の軌道について勉強する機会があり、話を聞きながらARで衛星を回したらおもしろそうと思いつき、作ってみました。
スクリーンショットはこんな感じ。動画は最後に紹介しています。
AR自体はUNITYのARFoundationを使えば簡単に実装できるので、問題なし。
でも衛星の位置ってどうやって計算できるんだろう…
衛星の位置について
調べるとPYTHONのライブラリが紹介されていました。
ちょっと試してみると。
結果
これを使えば手っ取り早く実装できそう。
ではこれをUNITYでできるか。
UNITYでもPYTHONが使えるらしいがANDROIDスマホのARで表示させることを想定しているので、問題がありそう。
C#のライブラリを探したところ、こちらがMITライセンスで使いやすそう
UNITYでnugetを入れて、上記のソフトを取り込んで表示
とりあえずそれらしい値が表示された
ただ、本当かpythonのライブラリと日時と同じにして結果を比較してみる
・・・どうも合わない。
結果としては日付の与え方が間違っていたようだ。
下記のように修正したら同じになった。コメントしてあるほうが間違い
UNITY one_SPG4
計算誤差レベルの差はあるものの、一致でOK。
衛星を回してみる
取り急ぎ簡単な球で地球と衛星を動かしたところ、下記のように回転は確認できたので、動作としては良さそうです。
では、衛星を回してみたい場合、どうやって軌道を調べられるか見ていくと、衛星の軌道データはTLEという形で、基本的に公開されているようです。
https://www.celestrak.com/NORAD/elements/gp.php?GROUP=active&FORMAT=tle
日本のスタートアップ企業の衛星ということで、SYNSPECTIVEのSTRIXを探したところ、こんな感じでちゃんと出てきました。
AxelspaceのGRUSもありました。
ところで、本当に位置があっているのか怪しいので、下記ツールで時刻を設定し同じ場所かを確認しました。
う~ん、全くあっていない・・・・
ということで、そもそも座標系から見直すことにしました。
SGP4で出てきた座標がそもそも何の基準かを確認する必要があります。
X,Y,Z方向がUNITYで配置した状態と同じなのか、基本的なところから確認していません。
下記によると2つの座標系があるようです。
少なくとも今の状態でちゃんと衛星が地球の周りをまわっているので、どちらかということになりそうです。
基本的には衛星の軌道表現は春分を基準としているECI系のようです。
下記のように定義されるようです。
ちなみに地球はフリーのassetを使用しました。
UNITYでは次のようになっているので、この時点でZとY軸が逆です。
次にプラスマイナスの極性はとしたとき
北向きはそのままでよさそうです。
下記P3-2に詳しい説明があった
https://inertial-navigator.net/wp-content/uploads/2019/10/Chapter3_Frames-Transformations_04.pdf
ここで、次の記述があったので地軸のずれはこの座標では関係ないように見える。
以上、見直した結果、X軸の極性が逆であった。
よって、この2点修正で位置は正確になった。
こんな感じ
UNITY上 真ん中あたりの衛星のイラストがその位置です。
ちょっと見にくいですが矢印のところが衛星の位置です。
ちなみに、衛星はNASAのwebで公開しているものを使ってみました。
ちょっとモデルは荒いようですが、表示が小さいので問題ないでしょう。
出来上がり
細かいところはまだ確認できていませんが、とりあえずこんな感じで動作するようになりました。GRUSって同じ軌道で複数回っているんですね。
もうちょっと衛星を増やしたり機能を増やしたいところです。