2017年12月10日日曜日

F-16風(続きのつづき)


 とりあえずジンバルのコントローラを作っています。
 いちおうTLE(人工衛星)とHIP(恒星)のボタンがありますが、HIPは未実装です。

 MENUを押せばメニューページになり、天球表示以外にコンフィグ画面があります。コンフィグは今のところシリアルポートの接続/切断だけです。ポートの選択とかは別のタブに作っています。

 TLEをONにすると、直下にあるテキストファイルに入っているすべての衛星が表示されます。今のところ1800個ほどでしょうか。1800個のTLEの 位置計算、方位仰角計算、Graphicsへの書き込み、をやっても、10-25msecくらいしかかかりません。衛星1個あたり10マイクロ秒で計算してる、ということでしょうか。確かに衛星の計算って複雑なだけで計算量は多くないんだけど、いくらなんでも早すぎでしょ。ARMだと、計算だけでも1msecかかるのに。

 天球全体で見てみると、静止軌道がかなり濃い感じです。しかし、東側は太平洋上なので、静止衛星は少ないですね。

 ディスプレイにマウスカーソルを重ねると、一番近い衛星の名前が表示されるようになっています(左側のディスプレイにカーソルを重ねています)。
 今のところ、ディスプレイをクリックすれば、無条件にジンバルがその方向を向きます。本来であれば、マニュアル操作ならジンバル指向、TLEモードなら衛星を選択して継続追尾、HIPモードなら恒星を選択して継続追尾、みたいな感じにするべきでしょう。


 衛星1800個ならテキストファイルでも500KiB未満ですから、SDカードに楽勝で入ります。HIPカタログもテキストデータですが、恒星約12万個分でも容量は50MB程度です。SDカードに余裕ですね。
 TLEの計算自体はマイコンでできることも確認済みなので、スタンドアロン動作は問題ないはずです。恒星位置の計算はマイコンではしたことないですが、あまり計算量は多くないですし、衛星ほど素早く動くわけでもないので、なんとかなるでしょう。


 TLEは、一応、データ長は固定ですが、衛星番号は間欠なので、衛星番号から直接ファイル位置を計算することができません。一番簡単なのは、TLEフォルダに、TLE1個毎に衛星番号をファイル名にしたファイルを1個ずつを作る、という感じになると思います。FAT16なら6万個くらいファイルを作れるらしいので、デブリとかを除けば、十分収納できます。

 HIPは空白埋めの固定長なので、特定のデータを取り出すのはそれほど大変ではないはずです。HIPもやはり間欠データですが、12万セットに対して100セット程度の不足なので、HIP番号を受け取って、目的のデータが来るまでファイルの前方にシーク、という程度でも問題ないはずです。もしそれが許容できないなら、ヌル行を追加したテキストファイルを作ればいいだけですし。


 ということで、なんとなくコントロールソフトも見た目はちゃんとしてきました。でも、かなり面倒です。
 最初は「参照渡しだから1個作れば複数の表示ができるね!」と思ってたんですが、その方法では、片方でズームするともう一方もズームする、という感じで、かなり使いづらいです。一応、表示内容は別々に選べるので、それだけが救いです。
 しょうがないので、ディスプレイごとにインスタンスを作って、別々にズーム・移動ができるようにしましたが、個別に登録しなければいけないし、UIハンドラも個別に作る必要があるので、面倒です。

 あと、MFDからペイントイベントを受け取ったら、現在表示中の画面のレンダーを呼び出して、そのレンダーは表示内容に応じて下位レイヤーのレンダーを呼び出して、という感じになっています。
 下位レイヤーでは、例えば天球レンダーからTLEレンダーを呼び出した場合、衛星位置は天球レンダーの表示位置に応じて衛星位置も表示することになります。しかし、天球を拡大しても、フォントは拡大されずに常に同じ大きさで表示する必要があります。さもなくば、天球を拡大すると、衛星名が画面の外に飛び出してしまいます。これは衛星のアイコンも同じで、ズームしても衛星のシンボルは一定の大きさで表示されたほうが便利です。
 ということで、衛星の位置を表示する際は上位レイヤーの座標変換行列を使い、衛星の名前を表示するときはスケールが違う行列を作り、という動作が必要で、しかも衛星の情報(軌道高度とか)は画面の左上とかに固定されたほうが読みやすいでしょうから、そういう表示は新しく行列を作って、という感じの処理を、都度書く必要があります。
 これがかなり手間なので、もっとスマートな方法を使いたいのですが、なかなかいい方法が思いつきません。

 こういう処理は、例えばUnityの3Dゲームが近いかな、という気がしています。ゲームフィールドは3Dで表示し、キャラの名前等は相対位置で2D表示し、ステータス等は絶対値で表示し、という感じで。
 ということで、ゲーム制作関係の参考書とかを読めばいいのかな、とも思ったりしますが、多分Unityは抽象化しすぎて参考にならないでしょうから、ゲームエンジンを作るような本が必要なのかな。


 そういえば、F-15ってASAT兵器を使えるけど、MFDに衛星を一覧表示したりするんだろうか?イージス艦もやはり対衛星ミッションを行っているから、衛星の表示もできるはずです。
 F-15の場合は、飛行前に地上で目的の軌道を入力して、飛行時はそれ以外の物は表示されないようなインターフェースになってるはずです。ASATの試験はF-15Aで行われましたが、一人乗りで操縦しながら衛星を選択するとかは大変ですし、そもそもF-15Aに気が利いた表示ができるシステムを載せれるとも思えないし。

 イージス艦の場合は、NTDSのアイコンで目標の速度や移動方向がわかるようになっていますが、低速なヘリコプター等も表示することを考えると、同じスケールでマッハ25とかを表示すると、速度スケールが画面外に出てしまい、かえって速度がわからなくなってしまいます。低速な目標から超音速ミサイルまでを表示したりすることを考えると、速度スケールは対数スケールかな、という気もしますが、常識的に考えれば、こういう表示は「何分後の未来位置まで引いた直線」とかでしょうから、やはり対数スケールってことは無いでしょう。
 例えば5分後の未来位置なら、ISSの場合は5分で日本列島縦断するかしないかくらいなので、1画面で日本を端から端まで表示できるイージス艦のディスプレイなら、衛星も十分に表示できそうな気がします。
 特に弾道ミサイルを追尾できるイージス艦では、ミサイルの現在位置、落着予想地点、迎撃までの猶予、といった情報を表示する必要があるので、少なくともBMDの際の意思決定が問題なく行えるくらいの表示はできるはずです(って、何日か前にもこんな話書いたな)。

 イージスのCICで衛星がどのように表示されるかなんて、わざわざ隠すことでもないでしょうが、かと言って、わざわざ表に出すことでもないでしょうから、当分は見れないだろうなぁ。最近だとICBMとか色々で、イージスで宇宙空間見ることも多いだろうし、センシティブな話題だろうからなぁ。

0 件のコメント:

コメントを投稿