marker by rocamisakitohko

【Stormworks】弾道計算機ができました!【VOICEVOX】

動画おさらい編完。 今年5月、YouTubeとニコニコ動画にこ~んなのをアップロードしました。

Stormworksで弾道コンピュータを実現したよ、という動画です。

といっても作ったのはむしろ弾道計算の下ごしらえをする仕組みの方だったりします。つまりは論理スタビライザ、Birminghamの次回予告にあったものがついに完成したわけです。1月に。 何を隠そうこの動画、弾道コンピュータが8割完成してから4ヶ月以上経って出されたことになります。しかも完成度は8割のまま。

論理スタビライザ

機体や船体の姿勢を正確に測定し、ワールド座標系に対する角度に変換する装置です。そうして得られた姿勢の情報を、位置のローカル-ワールド変換(レーダーの機影をワールド座標系にしたり)、角度の足し算引き算(船体に対して砲塔があるべき角度を逆算したり)などに使っています。

※10/01付の訂正版です

実装としては以下のように、まず2個のティルトセンサーと1個のコンパスセンサーからの入力を、ZXY系のオイラー角として入力し、クォータニオンに変換しています。これがワールド座標系に対する機体や船体の姿勢ということになります。

sensor_to_euler.lua
function QuaternionfromSensor(ft,rt,fc)
  -- ft: frontward tilt sensor
  -- rt: rightward tilt sensor
  -- fc: frontward compass sensor
  local phi_Y=fc*pi2
  local theta_X=ft*pi2
  local psi_Z=asin(sin(-rt*pi2)/sin((0.25-ft)*pi2))
  return QuaternionfromEulerZXY(Vnew(theta_X,phi_Y,psi_Z))
end

次にたとえばレーダーの生入力をローカル座標系での位置に変換、その後ワールド座標系の(より正確に言えば、Axis Alignedなローカル系の)位置に読み替えます。これで狙うべき座標がわかりますね。

radar_to_world.lua
function LocalFromRadar(distance,azimuth,elevation)
  local y=distance*S(elevation)
  local w=distance*C(elevation)
  local x=w*S(azimuth)
  local z=w*C(azimuth)
  return Vnew(x,y,z)
end

function WorldtoLocal(quaternion,vector)
  localvec=QMulVec(QConjugate(Quaternion),vector)
  pivotvec=Vnew(GPSX,Altitude,GPSY)
	return localvec+pivotvec
end

また、クォータニオン同士の乗算をすると、角度の足し算引き算ができます。最終的に砲塔を指向するときに用います。 ローカル座標系からワールド座標系への変換はなにも位置ベクトルのみに使えるものではなく、もちろん速度ベクトルに対しても使えます。これで機体・船体の三軸速度を正確に測定できますね。

弾道計算機

読んで字の如く、弾丸が飛翔する経路を計算・逆算し、どのような向きに弾丸を発射すれば標的に当てられるかを調べる装置です。 実装の簡便さからイテレーション式、つまり誤差修正を繰り返すタイプを採用しました。 二分探索などを行っている他のアプローチと比べ、計算量が低く済んでいますが、発散したり特異点にひっかかる可能性は残っており、あまり厳密とは言えない手法です。

論理スタビライザから標的の正確な座標を受け取った弾道コンピュータは、まず標的に向けて一直線に弾丸を撃ったときを想定します。 Stormworksの弾丸は重力の影響を受けて弓なりの軌道を描きますし、空気抵抗を受けて減速もするので、弾丸は多かれ少なかれ、下に逸れることとなりますね。 そうして標的の真下を通ったときの誤差の分だけ、今度は発射角を持ち上げて計算してみます。そうして誤差を縮めたら、もう一度、またその次も誤差修正…というような流れで、どういった向きに弾丸を撃てばよいのか計算するわけです。

偏差射撃についても同様に、まず標的に向けて一直線に弾丸を撃ったときを考え、弾着するまでの時間を算出、今度は標的の速度と所要時間から未来位置を予測し計算、更に誤差を修正…としています。 弾丸の初速には砲自体が持つ速度ベクトルも加算されるので、こちらも偏差射撃と同じように所要時間の算出を繰り返して対処します。

実際には一つの処理のなかで偏差射撃と初速修正の両方を、さらには弾道計算そのものまでもを行っています。 ただし、弾道計算、とくに空気抵抗の計算において、砲口初速のズレがパラメータに含まれるべきところを省いてしまっているので、計算がいくらうまくいったとしても、超高速で移動する機体からの射撃はうまく当たらないでしょう。

また、工学的な制約により、高速で移動する目標を撃墜するのは(弾道コンピュータの計算がたとえ正確でも)困難を極めます。 カルマンフィルタなどのノイズ抑制技術の搭載、速度・加速度・躍度の監視、ベジェ補間、砲塔誤差の低減や追従性能の向上などが必要でしょう。そしてどれだけ計算誤差や工学的誤差を排除できたとしても、砲口誤差は残ってしまいます。

Stormworksの世界においては、超音速で飛翔する対艦ミサイルや編隊飛行・乱数機動するミサイル、250ノットで推進する魚雷など、極めて迎撃の困難な兵器がたくさん存在しています。 やたらとミサイルに頼るのではなく、砲によってこれらを撃退できるのであれば、埼玉海軍は優位を確実なものとすることができるでしょう。

stormworksvoicevoxgameplaycalculatorlua