2016年12月16日金曜日

JSorbitのアップデートとか

【やじうまPC Watch】「旅客機から切り離すロケット」衛星の投入に成功する  - PC Watch

エアロンチのロケットから衛星8機を軌道投入だそうです。衛星名はCYGNSSで、画像検索するとロケットと結合してる写真とか出てきますが、衛星らしくなくて面白いですね。感じとしてはキューブサットに近い搭載方法です。規模としてもそんなもんですが。

TLEデータもすでに出ています。NORAD Two-Line Element Sets
Current Dataの"Last 30 Days' Launches"というテキストファイルです。たぶん16年78回目の打ち上げがこれだと思います。なんかロケットってバンバン打ち上げられてるイメージでしたけど、今年ももう12月半ばでまだ80機未満なんですね。平均すればだいたい4日に1回打たれててると考えるとそれなりに多いのかな?
16-78はA-Jの9セットで、衛星8機+ロケットだと思います。数日中に詳しく更新されると思います。


さて、本題、JS Orbitの件。URLオプションでTLEデータを渡しても表示されない問題を修正しておきました。上記9機のURLはこちら。めっちゃ長いので全文字表示にはしませんでした。また2000飛んで数百文字あるので、Microsoft系のブラウザでは見れないと思います。Chrome等をご利用下さい。


計画性もなくテストもせず一人でチマチマ作ってると思わぬところにバグが有るね。URLでTLE渡すのって前にも別のバグで動かなかったし。

追記:2016/12/17
今朝1時過ぎ(JST)の更新で打ち上げロケット(ペガサス)だけ出てました。
JS Orbit

ロケットと衛星は明らかにRCSが違うだろうから簡単に見分けられるのかな。キューブサットの複数投入だと似た形状がほぼ同じ軌道で放出されるから、見分けるのは大変そう。キューブサットってどうやって判別してるんだろうか。ロケット側から放出したタイミングとか情報もらって、それと軌道を遡って計算して「どうやらこれらしい」とかやってるのかな?

追記:2016/12/18
今日の更新で衛星側の確認もできたようです。
JS Orbit

それとHTVで運ばれたキューブサットの放出もいよいよ1機目が明日に迫っています。それ以降は少し間が開くようですが。
明日放出のキューブサットは2U型で、テザーで2つに分離した後、双方がUHF1chずつ計2chでビーコンを出すようです。10kHz間隔で2chですから、ワンセグチューナー等を使えば双方を同時に受信できますね。

2016年12月12日月曜日

角度の正規化

数ある角度の表現方法の中で、-180度から+180度、もしくは-PIから+PIの範囲への正規化。

public static double DegreesNormalize(double Degrees)
{
    return (RadiansNormalize(Degrees * Math.PI / 180) * 180 / Math.PI);
}

public static double RadiansNormalize(double Radians)
{
    return (Math.Atan2(Math.Sin(Radians), Math.Cos(Radians)));
}

たぶんこれで動くはず。whileやforで回してるわけではないので処理速度は常に一定となる(はず)。おそらく処理系依存ではないと思うけど、ExcelみたいなXとYが逆ってこともあるのでちゃんと確認してから使うように。

2016年12月9日金曜日

Arma3のサプによる弾速への影響

最近Arma3を買ってちょっとハマってます。ウチのArma3めっちゃ落ちやすくて数分ごとに落ちるのでストレスフルですけど。

それはさておき。

Arma3のプレイ動画はyoutubeとかにかなりありますね。特にマルチプレイ。そして「サプを付けてると威力が落ちるから敵にバレたらはずせ」というのが定説なようです。ほんとに?あのArmaが?ということで計測してみました。


レンジ1000mでM18ABRを使用して伏せ撃ち、バイポ使用、通常弾です。ターゲットは1000m先に置いた棚で、射撃は残弾カウンタが変化したフレーム、弾着は棚に当たった破片(煙)が出たフレームです。撃ってる時をGeForce Experienceでキャプチャして後でフレーム数を数えています。
平均速度は銃口初速や弾着の速度ではなく、全体の平均です。本来7.62x51NATOの銃口初速は800m/sほどですから、平均でこの速度ということは弾着時は音速を下回っているはずです。

最初に弾速が変動していますが、たぶん僕の読み取りミスだと思います。それ以外はすべて488m/sで安定していますし。


サプなし1000zはゼロイン1000mでサプレッサーなし、サプなし800zはゼロイン800mでサプレッサーなし、サプあり800zはゼロイン800mでサプレッサーありで射撃しています。すべてレンジは1000mです。

弾速が変化すれば少なからず弾道にも影響があり、弾道が変わればゼロインがズレている場所への弾着にはより大きな影響があります。しかしサプあり・なし共に弾道への影響は気が付きませんでした。弾速が安定していることからも、サプの有無によって弾速への影響は確認できません。
弾丸の威力、すなわち運動エネルギーは弾頭重量と速度にのみ影響を受けますから、弾頭が変化していないと仮定すれば威力への影響も発生していないことになります。

そもそも弾薬が同じであればサプレッサーの有無による運動エネルギーの変化というのは殆どありません。残弾を弾倉1本毎に管理しているArmaが、弾倉の交換も無くサプの着脱だけで装薬量が変わるとは思えません。


話は変わりますが、最近米軍で大規模にサプレッサーを配備しようという動きがあるようです。理由としては心身への影響を含めて様々なものがあり、その中に「過剰な効果があると誤解することを防ぐ」というものがあります。実際にArmaでサプの有無を変えて撃ち比べてみるとわかると思いまますが、サプが付いた静かな銃で撃ってもあまり効果がある射撃をしているとは思えないでしょう。逆に、サプのない騒音を撒き散らす銃であればセミで軽く撃つだけでも効果的な射撃を行っているという実感が有るはずです。Armaでサプの有無による影響が有ると言われているのは、このような精神的な影響が大きいように思います。
あるいは、サプをつけると弾丸の安定性に何らかの影響を与えているかもしれません。その場合、ある程度離れれば散布界も大きくなりますから、通常弾では当たっているはずでもサプ付きでは相手に当たっていないかもしれません。そうなれば当然ダメージもありませんから、サプの威力減に説明がつきます。

もちろんArmaがどのようにダメージを計算しているかはわかりませんから、実際はサプがついていると何らかの影響があるとか、ダメージの計算に運動エネルギーは考慮されていなくて弾速の計測なんて何の意味もないという可能性もあるわけですが。

2016年12月5日月曜日

Three.jsの軌道表示

とりあえず暫定的にThree.jsで軌道を表示するやつをJS Orbitの下に置いときました。
http://www13.plala.or.jp/rian/jsOrbit/three/?autosize

軸とかラベルとか前部表示だとかなり見づらいです。とは言え不要な情報というのはあまりないので、せいぜいECEFのラベルを消すくらいでしょうか。

フォントの関係でラベルはすべて英語です。間違ってても文句言わないで下さい。そもそも軌道の表示自体が間違ってるかもしれませんが(そのためのページタイトル「ThreeJSの練習」です?)。

黒いところでマウスを動かすと視点を動かすことができるので、見やすい視点を探してみて下さい。画面をクリックすればその位置で視点を固定し、もう一度クリックすれば固定を解除します。

視線固定を解除していて、カーソルがブラウザの外にあるときは自動的に視線を回転させます。フルスクリーンで勝手に回しておけばちょっとした癒やし効果がありそうです(個人の感想です)。


軽く見方を説明しておきます。

まず赤、緑、青の軸はそれぞれX, Y, Zの向きを示しています。

ECIはX+が春分点を向き、ECEIはX+が経度0度を向いています。ECI, ECEFはZ+が北極方向、Yはそれらに直行する軸です。

OrbSという軸はOrbit Surfaceの略で、軌道面になります。

中くらいの白い円・楕円は衛星軌道を示しています。

外側の大きなオレンジの円弧は軌道面に至る回転を示しています。Ω Right Ascensionは昇交点を、i Inclinationは軌道傾斜角を、ω Argument of Perigeeは近点角を示しています。



Three.jsをダウンロードしてきたのがおよそ3日前ですから、初めて触ってからたった3日くらいでこれくらいのモノが作れるようになります。なれてれば半日もかからないと思います。Webブラウザでマルチプラットフォームで動くものがこんなに簡単に作れるんですからすごい時代ですね(ウチのモバイル端末はWebGLに未対応なのでマルチプラットフォームの動作確認はしてないですけども)。

Three.jsはObject3Dで入れ子にできますが、JavaScriptでこれを書くのはかなり面倒です。僕はあんまりGUIツールは好きじゃないのですが、このあたりは木構造で簡単にThree.jsのコードを生成できるようなソフトウェアがあればすごい便利だと思います。そういうのがあれば今回のようなテクスチャのないモノなら10分や20分で作れるだろうなぁ。


とりあえず、後は緯度経度の矢印を作ったりとか、そのあたりでしょうか。
本当は昇交点だったり傾斜角だったりを少しずつ増やしていくアニメーションとかも作ってみたいんですが、リアルタイムに書き換えるのをどうすれば良いのかわからないのでもうちょっとThree.jsを調べてからになると思います。メモリリーク怖い。

2016年12月4日日曜日

軌道面



Three.jsで作ってる衛星軌道の概要を表示するやつ、とりあえずECI, ECEF, Orbit Surfaceの情報を表示できるようになってきました。ということで経過報告。といってもECIとECEFはジャマなので消してますが。

青の矢印が地球の中心(ECI, ECEF, 軌道面すべての原点)です。その周りの円と、長半径が同じ楕円は地球の大きさを示しています。
その外側に有る円と楕円は軌道の大きさです。楕円が実際の衛星軌道、外側の円は衛星軌道に外接する真円です。

赤が衛星軌道に外接する真円の原点で、緑の矢印は衛星の位置によって移動しますが、緑の矢印の部分にあるオレンジと赤の線は常に直角です。
水色の矢印で示した、オレンジの線と楕円の交点に衛星がいます(ラベルの位置が不適切なので真円のところに衛星がいるように見えてしまいますが)。


他の言語で直接3Dを作るよりはThree.jsを使ったほうが簡単なんでしょうけども、それでも結構面倒です。特にpositionやquaternionが思い通りに設定できないのが面倒。いちいちObject3Dで入れ子にしたりとかしてて、なんかもうちょっとうまくできないものかなぁと。

メモ:離心率から短半径と超半径の比率を計算

楕円のパラメータには超半径a, 短半径b, 焦点c, 離心率e, 扁平率f等がある(らしい)。abからcやeやfを計算する式はちょっと探せばいくらでも出て来るが、eから計算する方法はあんまり見つからなかった。そういう計算を必要とする人がいないからどこにも書いてないのかもしれないけど、せっかく苦労して調べたのでメモしておく。


たったこれだけの計算式を調べるのにだいぶ時間を使ってしまった。こういうところで色々不足してるのが思い知らされる。

2行軌道要素だと離心率が与えられるし、長半径を計算するのも簡単だけど、短半径がないと楕円を作れない、というところでこういう計算が必要になる。

/*
ぜんぜん関係ないけど、いまディスカバリーの怪しい伝説でテレビゲームを扱ってる。フルーツニンジャとかDOOMとか。このDOOMみたいなのやったら楽しいだろうなぁ。夏休みとか人集まるような時期にお化け屋敷みたいなふうにやってみたい。「超人的な狙撃手」でやってた、紙で作った部屋でやるサバゲも楽しそうだよね。ちゃんとした壁は邪魔者でしかないから、どっかのだだっ広いところに垂木とかでフレームを作って、模造紙で壁を作る、そんな感じでやるならエアガンを撃てる部屋を探す必要もないし、広いことについては定評のある北海道だから、壁の有る部屋を作るのは簡単だろう。ただ天井もないから、雨とか降ったら最悪なことになる。そうでなくても前日に雨が降るだけでも問題。ほんとは単管とかで2階フロアとか作って、ラペリングとかもやってみたいけど、安全確保が大変だからお化け屋敷みたいな人を集めるイベントでは無理だろうなぁ。まぁこのあたりは準備中にスタッフだけで遊ぶとかもできるだろうし。やるにしたって7月か8月になるだろうから、もうちょっとじっくり考えてみよう。
*/

2016年12月3日土曜日

衛星の軌道面とか軸の話

文字だけで軌道の座標とか説明するのはかなりつらいので、試しにCADで書いてみた。


まだ無理があるかな、という感じ。そもそも3次元を2次元画像に押し込むのが無理がある。
マウスで視点をグリグリ動かすとなんとなく3次元形状を把握できるようになるので、試しにThree.jsで表示してみた。


「5分でできるThree.js入門」とか言っておきながらThree.js本体をダウンロードするのに30分かかるじゃねぇか!!とか毒づきながらも、丸1日でここまでできるんだから楽なもんだなぁとも思ったり。


今回は離心率が約0.49、平均運動が7.4くらい、軌道傾斜角が63くらいの衛星を表示してみた。
勝手な思い込みでQZSは結構離心率が大きい印象だったけど、実際には0.075くらいしかない。これくらい小さい離心率でもあんな動きになるんだねぇ。


最終的にはTLEを渡したら表示できるような感じになると面白いかなーとか考えながらも。もうちょっと色々表示を追加したい。いくらライブラリにまとまって簡単とはいえ、やはりそのままだと文字の表示とかが大変なのでこのあたりはうまくラッパー関数を作ってやる必要があるのかな。