ホーミングミサイルの単純な比例航法の実装


8

私はプロポーショナルナビゲーションの可能な限り単純な形式を実装しようとしています。つまり、ミサイルはターゲットからターゲットへの方向が変化する方向に向きを変え、ターゲットからターゲットへの方向が変化しなくなったら、迎撃コースにいます。

それで、私は2Dミサイルが直面している方向に一定の速度で移動していて、一定の速度で回転することができ、間隔ごとに次のようなものでミサイルを更新します:

Position += VectorProduct (Direction * Speed * TimePassed)

PreviousTargetBearing = TargetBearing
TargetBearing = AngleBetween(TargetPosition, Position)
TargetBearingDelta = TargetBearing - PreviousTargetBearing

If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed

問題は、ミサイルが常に発射方向を中心に振動することです。これは、ミサイルが最初に回転するとすぐに、TargetBearingDeltaの符号が反転し、反対方向に回転するためです。

この問題を解決する最も簡単な方法は何ですか?私は簡単なものを見逃していると確信しています。

関連するStackOverflowの質問:ゲームの「インターセプトミサイル」を作成する方法は?

繰り返しになりますが、私は特に、一般的なホーミングアルゴリズムではなく、比例ナビゲーションアルゴリズムの実装に関心があります。


更新:明確な答えは、方位チェックして毎ターン方向調整するのではなく、2つを交互に行うことだと思います。やってみます。

回答:


1

ステップ1)直線で行く場合の目標までの時間を計算する

ステップ2)ターゲットがその時点での現在の方位と一緒になる場所を計算します。

ステップ3)ミサイルのヘディングをそのスポットに設定します。

ステップ4)必要に応じて更新する

最初はそれほど正確ではありませんが、距離が近づくにつれて、より正確になります。移動時間がゼロになると、ミサイルのターゲットスポットがターゲットに近づきます。

それを試してみてください。実装するのに十分簡単です。ゲームにホーミングミサイルを入れたいので、それがどのように機能するかを教えてください。これが私の最初の考えでした。

そしてこの部分について:

If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed

代わりに、2つのmissileDirection変数を使用します。1つはそれが実際に何であるか、もう1つはそれが将来どうあるべきかである。次に、ミサイルの動きは、そのターンレートによって目的の方位に向かって進みます。目的の見出しが現在の見出しよりも大きい場合は、回転率を追加します。小さい場合は差し引きます。過去に行った場合は、等しく設定してください。


これは比例ナビゲーション方式を使用していないようですか?
e100

いいえ。ただし、ほぼ同じ効果があります。これにより、ミサイルとターゲット間の迎撃経路がプロットされます。ナビゲーションの目的は、ミサイルがターゲットを迎撃することです。上記のプロセスはそれを行うべきです。あなたはシンプルにしたかった。
Azaral、

フェアポイント、+ 1
e100

試してみる場合はどうなるか教えてください。これは私のゲームでミサイルをホーミングするための私の計画でした。まだミサイルのプログラミングを習得していません。
Azaral

私は今のところこのメソッドを実装しており、うまく動作します。この答えは、私が最終的に求めるものに十分に近いものではないため、受け入れることができないと思いますが、感謝します。
e100

4

ネイラーが言うように、あなたは何らかの方法で動きの変化を抑えることができます。

PIDを確認してください。物事を特定の「値」にすばやく移動させる優れた方法ですが、行き過ぎることなく、いくつかのアイデアが得られる場合があります。

また、この質問を確認することもできます。少し下がっていると、犬が使用する非常に正確なホーミングアルゴリズムである「犬の曲線」の説明です。


ミサイルがターゲットを追跡したら、何らかの形の減衰フィードバック制御ループが必要になることがわかりますが、ミサイルが最初の発射方向で振動するだけなので、より簡単な初期問題があると思います。強調するために、私は間違いなく比例ナビゲーションアルゴリズムを使用したいと思います。
e100 2012

PIDは優れた計測器ですが、調整するのは難しいですが、3つのパラメーター(3つが必要な場合)が見つかれば、その特定のメカニズムに対する解決策があります。私の側から+1。
teodron 2012

teodronに感謝;-) @ e100:計算が完了し、ターゲットが着実に移動しているときにミサイルを「直進」させたい場合は、「ドッグカーブ」の例を確認してください。そうでない場合、「TurnRate」はPIDの「P」(IIRC)と等しくなります。たとえば、固定値ではなく、差の10%と計算すると、コースが2度ずれている場合は、20度ずれている場合と同じ変更は必要ありません。
Valmond 2012

1

私の意見では、2つのベクトルを含む別の方法があります。1つはミサイルが命中する方向で、もう1つはそれ自体が揺れ動く(または最初のベクトルと一致するように方向を変える)方法です。

このようにして、最初のベクトルの変化に応じてミサイルが方向をスムーズに変更できるラグタイムを生成できます。数学演算の「しるし」の問題は解消されると思います。

PS。重要な点は、時間のわずかな遅れに関して、ミサイル自身のベクトルを(ヒットする)方向ベクトルに変換することです。


このアプローチでは結果が得られますが、ミサイルは一定の回転時間(一定の回転速度ではなく)になりますが、回転距離に基づいて各フレームの補間率を再計算しない限り、一定の回転速度。
doppelgreener 2012

「頑張る」で検索したい!
e100

1

ポーショナルナビゲーションは、ゲームに実装するのが簡単です。

ゲームでの実装例は次のとおりです。

必要な加速度= LOS * LOS_Rate * NC + APN_bias

LOS = Vector3(TargetPosition)-Vector3(MissilePosition)

NC =ナビゲーション定数乗数(フレームレートの実行に依存)

APN_bias = LOS_Rate / delta_T *(NC / 2)

LOS_Rate = LOS回転速度は、ミサイルとターゲットの間の見通し線の変化の角速度です。これは、delta_Tでフレームごとにミサイルとターゲットベクトルの位置を記録し、それぞれを差し引いて差を求めることで測定されます。Delta_Tは、ゲームでホーミングミサイルが実行されているタイミング基準(フレームレート)です。

LOS_Rateを取得するには、ミサイルガイダンスループに各フレーム(delta_T)で次のことを実行させるだけです。

// New LOS rate

LOS_Delta = Vector3( LOS ) - Vector3( LOS_previous_frame ) 

LOS_Rate = LOS_Delta.Vector3Length()

// Update LOS before we finish

LOS_previous_frame = Vector3( LOS )

PN for World in Conflictゲームの実装方法の詳細については、以下のURLをご覧ください。これらがお役に立てば幸いです。

http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles

http://download.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf

-ブラディ


0

1フレームでTargetBearingを超えて回転しないように、回転率をキャップすることはできませんか?

ターンでミサイルがターゲットの方位を過ぎる場合は、新しい方位をターゲットの方位と等しく設定します。

それは理にかなっていますか?


いいえ、そうは思いません。このアイデアは、ミサイルをTargetBearingに向けるのではなく、TargetBearingが変化する方向に向けることです。
e100 2012

OK。誤解したようです。
Nailer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.