頭上を飛ぶ人工衛星をARで観察しよう!

 前回はARアプリの原理を探ったが、今回はそれを使って人工衛星の位置を画面に表示するアプリを作ってみたい。

人工衛星の位置を表示するメリット

 人工衛星を表示するアプリが作りやすいのは、地球上の目標と違って、ジオイド高を考慮する必要がない点だろう。目標までの高さも数100キロから数万キロの距離があるので、位置による地形的誤差も影響が少ないと考えられる。

人工衛星の位置を表示する手順

 人工衛星の位置を画面上に表示する手段は、地球上の物体と同じ手順を踏む。目標の位置を計算し、現在地からの方向を取得したうえで、カメラの撮影範囲のどこにあるかを表示する。前回の記事に書いた手順と変わらない。
 どの衛星を表示するかが悩ましい。なんせ、数千の衛星が地球を周回しているのだ。今回は生活に直接関連があるGPS衛星と、みちびき初号機から4号機に加えて、国際宇宙ステーションをARで表示することにした。これを、手順に従って表示したものがこれだ。

 思ったより、たくさんの衛星が視界の中に入って来るな。これが正確な方向を指しているかどうかはわからない。確認もできないし。ただ、この方向に辺りにはいるはずなのだ。そういった目安としては、使えるのではないだろうか?
 なんだかすんなりと表示できちゃったぞ。困ったな、書くことがなくなってしまう。

人工衛星の軌道要素を記録する仕組みを作る

 いや、あるぞ、書くこと。
 このアプリがどういった状況下で使われるか考えたらいいのだ。例えば、GPS衛星とか、みちびきとか、ISSを探す時にアプリをつかう人はどこにいるか。ほぼ、屋外にいるときだろう。それも、街中とは限らない。海の上かもしれないし、山の中かもしれない。
 そんな秘境とも言えるところに、ネット接続ができるWi-fiが整備されているわけがないのだ。ということは、そこでも使えるようにするには、あらかじめネット接続したときに読み込んだ軌道要素のデータを記録しておいて、接続ができない時にキャッシュしておいたデータを使うようにすれば、どこでも位置を画面に表示することができるはずだ。
 unityでデータを記録する方法はいくつかある。PlayerPrefs、persistentDataPath、temporaryCachePathなど。今回はtemporaryCachePathで取得した場所に、読み込んだデータを保存することにした。

 private string readData(string filename)
   {
    string filedata;

    using (StreamReader sd = new StreamReader(Path.Combine(Application.temporaryCachePath, filename)))
     {
      filedata = sd.ReadToEnd();
     }
    return filedata;
   }

  private void writeData(string filename, string data)
   {
    using (StreamWriter sw = new StreamWriter(Path.Combine(Application.temporaryCachePath, filename)))
     {
      // ファイルへ書き込み
      sw.Write(data);
     }
   } 

 temporaryCachePathの場合は、ディスク容量が少なくなった場合、OSから削除されるといったケースも考えられるのだが、ネット接続ができない時のための一時的な記録なので、これで良しとした。

 とりあえず削除のリスクを下げるために、パーミッションに外部SDカードに指定した。だが、エクスプローラーでSDカードのAndroid/data以下のフォルダを確認しても、ファイルが記録された痕跡が見つからない。さんざんInternalでテストした後なのがいけないのか、パーミッションが外部SDカードでも必ず外部に記録されるとは限らないのかは謎。ファイルの保存さえできればいいので、深くは追及しないことにする。とはいうものの、むやみにSDカードを抜いてしまう人がいないことを祈る。
 機能を試すためには、一度ネット環境下でアプリを動作させる必要がある。

 画面の上にステータスバーを表示させると、Wi-fiのマークが出ていることに注目。では、Wi-fi接続を無効にして動かしてみよう

 マークはないけど表示している!うまくいったようだ。これなら、どんな秘境に行っても衛星の位置を確認できるぞ。もちろん、データは新しい方がいいから、旅に出る前に一度アプリを起動することをお勧めする。

人工衛星の位置を示す地図を作る

 しかし、みちびきのように日本上空周辺を飛んでいる衛星は画面のどこかにいる可能性が高いが、ISSのように90分ほどで周回しているものは、地平線の下にあるものは表示しないようにしているので、画面にいつ入るのか見当がつかない。そこで、地図モードをつけて、どこを飛行しているか示すようにした。これなら、わかりやすくていい。

 なんだか衛星が多すぎてカオスだな。
 今回は衛星の軌道は描かなかった。そうしてしまうと、画面が線だらけになって見づらくなってしまうからね。ピンチ操作で地図が拡大縮小させることができ、

指一本でスワイプすると、地図の位置をずらせるようにした。

 これなら、衛星が自分の地点にどれだけ近いか一目瞭然だ。でも、GPSやみちびきはあまり早く移動しないので、更新しているかどうかわかりにくい。ISSを探してみてください。これは90分で地球を1周するので、地図上でも数秒ごとに位置が変わるので、わかりやすいです。

衛星の位置がわかると可能性が広がるかも


 みちびきは似たような軌道を飛んでいるので、たまに2機がすごく接近した位置に来ることがあって、こんな表示が見られる時もある。そういったものを見るのもこのアプリの楽しみの一つになるだろう。
 また、GPSの位置を確認することで、位置情報の精度を上げられるのではないかとも思う。ただ、これには一つ説明が必要だろう。
 GPS衛星ってたくさん飛んでいるように見えるが、これはGPS衛星は飛行高度が約3万キロと高いので、アラスカ上空を回っているの衛星でも、日本からは地平線の上に見えているだけなのだ。みちびきにもそれが言える。オーストラリア上空を飛行中であっても、地平線の下へ沈まないような日本との位置関係にあるというだけなのだ。

 この画像のようにね。でも、水平線ぎりぎりのところだし、天頂衛星としては役割を果たしてはいない。だから、このアプリでGPS衛星がたくさんあったとしても、位置的に近い場所を飛行しているのは、頭上あたりに見えるものなので、アンテナやらGPSロガーをお持ちの方は、頭上の衛星方へ注意を払った方が精度が上がるように思われます。
 ISSなんかは高度が400キロ程なので、近くに来ると速いスピードで空を横切っていくのが見られる。

 観測条件のいい日なんかはこのアプリで位置の目安にして探すのもいいかもしれません。

 最後ですが、このアプリのAPKファイルを載せるので、興味がある人は使ってみてください。位置情報、カメラ、ファイルアクセスの許可が必要ですので、ダイアログが出たら許可を押して進んでください。
 APKファイル:satellitefinder.apk
 ちなみに、このアプリは日本国外で使用すると磁気偏角を算出する近似式がわからないので補正しないようになっており、精度が落ちます。
 以上がARを使った実用アプリの概要です。ほかにもたくさんの人工衛星の軌道要素が公開されているので、データを充実させたら、Play Storeで公開できるようなアプリになるかなとも思うので、いずれやってみたいと思います。
 ではまた。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする