Implementierung einer einfachen proportionalen Navigation für eine Zielsuchrakete

8

Ich versuche, die einfachste Form der proportionalen Navigation zu implementieren , dh die Rakete dreht sich in die Richtung, in die sich ihre Peilung zum Ziel ändert, und sobald sich ihre Peilung zum Ziel nicht mehr ändert, befindet sie sich auf einem Abfangkurs.

Ich habe also eine 2D-Rakete, die sich mit einer konstanten Geschwindigkeit in die Richtung bewegt, in die sie zeigt, die sich mit einer konstanten Geschwindigkeit drehen kann, und in jedem Intervall aktualisiere ich die Rakete mit etwas wie:

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

Das Problem ist, dass die Rakete immer um ihre Startrichtung schwingt, denn sobald sich die Rakete das erste Mal dreht, kehrt dies das Vorzeichen von TargetBearingDelta um und dreht sich dann in die entgegengesetzte Richtung und so weiter ...

Wie kann ich dieses Problem am einfachsten lösen? Ich bin sicher, ich vermisse etwas Einfaches.

Verwandte StackOverflow-Frage: Wie erstelle ich eine "Intercept Missile" für ein Spiel?

Um es noch einmal zu wiederholen, ich bin speziell an der Implementierung des proportionalen Navigationsalgorithmus interessiert , nicht an Referenzierungsalgorithmen im Allgemeinen.


Update: Ich denke, die offensichtliche Antwort ist, nicht in jeder Umdrehung die Peilung zu überprüfen und den Kurs anzupassen, sondern zwischen den beiden zu wechseln. Ich werde das versuchen.

e100
quelle

Antworten:

1

Schritt 1) ​​Berechnen Sie die Zeit bis zum Ziel, wenn Sie in einer geraden Linie fahren

Schritt 2) Berechnen Sie, wo sich das Ziel mit seiner aktuellen Richtung zu diesem Zeitpunkt befindet.

Schritt 3) Stellen Sie den Kurs der Rakete auf diesen Punkt ein.

Schritt 4) Aktualisieren Sie nach Bedarf

Anfangs wird dies nicht sehr genau sein, aber wenn sich die Entfernung schließt, wird es genauer; Wenn die Reisezeit auf Null geht, nähert sich der Zielpunkt für die Rakete dem Ziel.

Gib dem einen Wirbel. Es ist einfach genug zu implementieren. Lassen Sie mich wissen, wie es funktioniert, weil ich Zielsuchraketen in mein Spiel einbauen möchte, und dies war mein erster Gedanke.

Und für diesen Teil:

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

Ich hätte stattdessen zwei missileDirection-Variablen. Eine für das, was es wirklich ist, und eine für das, was es in Zukunft sein sollte. Dann bewegt sich die Rakete um ihre Umdrehungsrate in Richtung der gewünschten Richtung. Wenn der gewünschte Kurs größer als der aktuelle Kurs ist, addieren Sie die Umdrehungsrate. Wenn es kleiner ist, subtrahieren. Wenn Sie vorbei gehen, setzen Sie es gleich.

Azaral
quelle
Dies scheint nicht die proportionale Navigationsmethode zu verwenden?
e100
Nein, aber es sollte ungefähr den gleichen Effekt haben. Dadurch wird ein Abfangkurs zwischen der Rakete und dem Ziel aufgezeichnet. Der Zweck der Navigation besteht darin, dass die Rakete das Ziel abfängt. Der obige Prozess sollte das tun. Du wolltest einfach.
Azaral
Fairer Punkt, +1 zu Ihnen
e100
Wenn Sie es versuchen, lassen Sie mich wissen, wie es geht. Dies war mein Plan für die Zielsuchrakete in meinem Spiel; Ich habe die Rakete noch nicht programmiert.
Azaral
Ich habe diese Methode jetzt implementiert und sie funktioniert gut. Ich glaube nicht, dass ich diese Antwort akzeptieren kann, da sie nicht nah genug an dem ist, was ich am Ende haben möchte, aber vielen Dank.
e100
4

Wie Nailer sagt, können Sie die Bewegungsänderung auf irgendeine Weise begrenzen.

Schauen Sie sich PID an , eine gute Möglichkeit, die Dinge schnell auf einen bestimmten „Wert“ zu bringen, aber ohne sie zu überschreiten, gibt es Ihnen möglicherweise einige Ideen.

Sie können sich auch diese Frage ansehen . Ein bisschen weiter unten finden Sie eine Erklärung der 'Hundekurve', einem sehr genauen Referenzierungsalgorithmus, der von Hunden verwendet wird.

Valmond
quelle
Ich kann sehen, dass ich eine Art gedämpften Rückkopplungsregelkreis benötige, sobald die Rakete das Ziel verfolgt, aber ich denke, ich habe ein einfacheres anfängliches Problem, da die Rakete nur in der anfänglichen Startrichtung schwingt. Um es zu betonen, möchte ich definitiv den proportionalen Navigationsalgorithmus verwenden.
e100
Obwohl PID ein gutes Instrument ist, ist es schwer zu stimmen. Sobald die drei Parameter (wenn einer drei benötigt) gefunden wurden, haben Sie eine Lösung für diesen speziellen Mechanismus. +1 von meiner Seite.
Teodron
danke teodron ;-) @ e100: Wenn du die Rakete "geradeaus" fahren lassen willst, wenn die Berechnungen abgeschlossen sind und sich das Ziel in einer stetigen Bewegung befindet, sieh dir das Beispiel "Hundekurve" an, da es genau das tut. Andernfalls entspricht Ihre 'TurnRate' dem 'P' (IIRC) in der PID. Sie können sie im laufenden Betrieb berechnen, z. B. 10% der Differenz und keinen festen Wert. Wenn Sie 2 ° vom Kurs entfernt sind, benötigen Sie nicht die gleiche Änderung wie wenn Sie 20 ° vom Kurs entfernt sind.
Valmond
1

Meiner Meinung nach würde es eine andere Methode geben, die zwei Vektoren umfasst, einen für die Richtung, in die eine Rakete treffen soll, und einen anderen für sich selbst (oder sagen wir, dass sie ihre Richtung ändert, um mit dem ersten Vektor übereinzustimmen).

Auf diese Weise können wir eine Verzögerungszeit erzeugen, die es einem Flugkörper ermöglicht, seine Richtung entsprechend einer Änderung in einem ersten Vektor reibungslos zu ändern. Ich glaube, es wird das Problem im "Zeichen" der mathematischen Operation beseitigen.

PS. Der Hauptpunkt ist, dass wir den eigenen Vektor einer Rakete in Bezug auf eine kleine Zeitverzögerung in einen Richtungsvektor (zu treffen) umwandeln.

haxpor
quelle
Beachten Sie, dass dieser Ansatz zwar zu Ergebnissen führen kann, der Flugkörper jedoch eine konstante Wendezeit (anstelle einer konstanten Wendegeschwindigkeit ) erhalten würde - es sei denn, Sie berechnen die Interpolationsrate für jeden Frame basierend auf der noch zu drehenden Wendeentfernung neu, um eine zu erzeugen konstante Drehgeschwindigkeit.
Doppelgreener
Ich muss nach "lerping" suchen!
e100
1

Die proportionale Navigation ist in Spielen einfach zu implementieren.

Ein Beispiel für die Implementierung im Spiel ist:

Erforderliche Beschleunigung = LOS * LOS_Rate * NC + APN_bias

LOS = Vector3 (TargetPosition) - Vector3 (MissilePosition)

NC = Navigationskonstantenmultiplikator (abhängig vom Bildratenlauf)

APN_bias = LOS_Rate / delta_T * (NC / 2)

LOS_Rate = LOS-Rotationsrate ist die Winkeländerungsrate der Sichtlinie zwischen Rakete und Ziel. Dies wird gemessen, indem sowohl die Raketen- als auch die Zielvektorpositionen in jedem Frame bei delta_T aufgezeichnet und jeweils subtrahiert werden, um die Differenz zu erhalten. Delta_T ist die Zeitreferenz (dh die Bildrate), mit der Ihre Zielsuchrakete im Spiel läuft.

Um LOS_Rate zu erhalten, lassen Sie einfach Ihre Raketenführungsschleife an jedem Frame (delta_T) Folgendes tun:

// 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 )

Weitere Informationen darüber, wie wir PN für World in Conflict implementiert haben, finden Sie unter den folgenden URLs. Ich hoffe, Sie finden diese hilfreich.

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

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

-blahdy

James
quelle
0

Kannst du die Turn Rate nicht einfach so begrenzen, dass sie niemals in einem Frame an TargetBearing vorbeizieht?

Wenn eine Drehung die Rakete an ihrer Zielpeilung vorbeiziehen lassen würde, setzen Sie einfach die neue Peilung gleich der Zielpeilung.

Ist das sinnvoll?

Nagler
quelle
Nein, das glaube ich nicht. Die Idee ist nicht, die Rakete in Richtung TargetBearing zu drehen, sondern in die Richtung, in die sich TargetBearing ändert.
e100
OK. Ich glaube, ich habe es falsch verstanden.
Nagler