Wie berechne ich den Kurs einer Rakete?


14

Ich habe eine Rakete, die von einem Schiff in einem Winkel abgefeuert wird. Die Rakete dreht sich dann in einem Bogen mit einem vorgegebenen Wenderadius zum Ziel. Wie bestimme ich den Punkt auf dem Bogen, an dem ich anfangen muss, mich zu drehen, damit die Rakete direkt auf das Ziel zusteuert?

BEARBEITEN

Bevor ich die Raketen abschieße, muss ich die Flugwege berechnen und zeichnen. Im angehängten Beispiel hat die Trägerrakete einen Steuerkurs von 90 Grad und die Ziele sind dahinter. Beide Raketen werden mit einem relativen Kurs von -45 Grad oder + 45 Grad zum Kurs der Trägerrakete abgefeuert. Die Raketen wenden sich zunächst mit einem bekannten Wenderadius dem Ziel zu. Ich muss den Punkt berechnen, an dem die Wende die Rakete zum Kurs bringt, an dem sie sich wenden wird, um das Ziel direkt anzugreifen. Befindet sich das Ziel bei oder in der Nähe von 45 Grad, gibt es keine anfängliche Wende, die Rakete geht gerade auf das Ziel zu.

Nach dem Start der Rakete wird auf der Karte auch die Verfolgung der Raketen auf dieser Linie als Angabe der Flugbahn angezeigt.

Ich arbeite an einem Simulator, der die Betriebssoftware nachahmt. Ich muss also die berechnete Flugbahn zeichnen, bevor ich den Start der Rakete zulasse.

Zwei Raketen auf zwei Ziele gerichtet

In diesem Beispiel befinden sich die Ziele hinter der Trägerrakete, die vorberechneten Pfade werden jedoch gezeichnet.


1
Ist der Steuerkurs vorberechnet oder ändert er sich während der Flugbahn? (Wie eine Zielsuchrakete?)
Jonathan Connell

1
Wäre es nicht einfach so, wenn (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2, wobei (x1, y1) die aktuelle Raketenposition und (x2, y2) das Ziel ist?
Die kommunistische Ente

Vielleicht solltest du zeichnen, was du willst.
aaaaaaaaaaa

3
Ist das ein 2D oder 3D Problem?
Steve H

Wenn Sie nach etwas wie einer Zielsuchrakete suchen, können Sie dies ohne Trigonometrie tun. Siehe diese Frage
BlueRaja - Danny Pflughoeft

Antworten:


9

Meine Mathematik könnte ein bisschen falsch sein, also habe ich die Antwort herausgesucht.

Ich nehme an, Sie möchten das Szenario der ständigen Zielsuche durchführen - bei dem die Rakete P1, die sich mit einer Geschwindigkeit V1 fortbewegt, ständig versucht, sich dem Spieler P2 zuzuwenden. aber mit einer begrenzten Wendegeschwindigkeit.

  1. Bestimmen Sie den Vektor zwischen dem Spieler und der Rakete.

    V2 = P2 - P1
  2. Verwandle sie in Einheitsvektoren.

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. Bestimmen Sie den Winkel zwischen den Vektoren.

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. Begrenzen Sie den Wert des Winkels zwischen ihnen (denken Sie daran, dass Ihre Triggerfunktionen wahrscheinlich mit Bogenmaß arbeiten, versuchen Sie also 0,1 als Drehrate).

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. Erstellen Sie den neuen Bewegungsvektor.

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

BEARBEITEN: Dies hat keinen "Ausgangspunkt", da es für das Szenario der kontinuierlichen Referenzfahrt robuster ist (und eine einfachere Implementierung darstellt). Sie müssen keinen Startpunkt für einen Kreis finden - begrenzen Sie einfach die Geschwindigkeit, mit der die Rakete die Richtung ändern kann, und der Rest geschieht aufgrund des Geistes in der Maschine.


1
Mmm ... wenn Speicher dient, denke ich, dass Sie ein Querprodukt machen müssen, um die Richtung des Winkels zu erhalten. Wenn Sie nur ein Punktprodukt erstellen, kennen Sie die Größe des Winkels, aber nicht die Richtung (da Punktprodukte V3 * V4 = V4 * V3 haben können, scheint es keine Möglichkeit zu geben, einen Unterschied in der Ausrichtung festzustellen). Machen Sie also das Skalarprodukt und dann ein Querprodukt - überprüfen Sie das Vorzeichen der Z-Koordinate - um die Ausrichtung zu finden.
ChrisE

@ChrisE Das Beispiel ist in 2D (siehe 5.), daher sollten die ursprüngliche Ausrichtung und die Winkelgröße ausreichend sein.
Keeblebrox

Die Berechnung des Winkels zwischen ist korrekt, aber ich bin nicht sicher, was Ihre erklärte Absicht in Schritt 5 ist ODER was es produziert. Ist Schritt 5 angenommen, den Winkel a zur v3 hinzuzufügen, weil ich die Mathematik nicht verstehe.
dlots

@dlots Schritt 5 soll dem aktuellen Bewegungsvektor den neuen 'begrenzten Drehratenwinkel' hinzufügen - im Grunde ändert er die Richtung des Flugkörpers.
Jonathan Dickinson

Was ist SIGNin Schritt 4?
Daniel Kaplan

2

Ich gehe davon aus, dass Sie die Richtung ändern möchten, indem Sie den Startkurs in den Zielkurs ändern und dann direkt zum Ziel weiterfahren (ein spaßigeres Problem sollte sein, das Ziel beim Wenden zu treffen!).

Ich muss davon ausgehen, dass Sie mit dem gleichen Wenderadius in alle Richtungen abbiegen können (dies ist eine Vereinfachung, die bei echten Raketen schwer zu erkennen ist).

Die einfachste Lösung ist die 90 ° -Biegung : die Raketenfeilen, bis ihre Flugbahn einen rechten Winkel zum Ziel bildet. Wenn Sie genau am 90 ° -Punkt abbiegen, verfehlen Sie das Ziel genau um den Abbiegeradius, da Sie die Abbiegung selbst berücksichtigen müssen. Die Lösung besteht darin, vor Erreichen des 90 ° -Punkts mit der Drehung genau "Wenderadius" Meter (?) Zu beginnen und dann einen 90 ° -Bogen zu formen, um direkt zum Ziel zu gelangen.

Diese Lösung ist nicht immer möglich, wenn Sie beispielsweise auf dem 90 ° -Weg keine Sicht haben (Gebäude oder andere Hindernisse).

Die gute Nachricht ist, dass die Lösung für jeden Winkel (nicht nur für die mythischen 90 °) funktioniert. Der Trick besteht darin, den Raum zu berücksichtigen, der zum Drehen benötigt wird, um mit dem Drehen zu beginnen.

Wie viel früher? Deshalb ist das 90 ° Zeug die einfachste Lösung ...

Nehmen wir an, Sie erreichen die Sichtbarkeit oder die beste Zielposition, wenn der Schusspfad einen Winkel von θ ° bildet. Dann sollten Sie die Abbiegung antizipieren, indem Sie:

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

... wobei Sekante der Kehrwert des Kosinus ist. Der Beweis ist trivial und wird dem Leser überlassen.

Im Ernst, die Formel stammt aus einer einfachen geometrischen Konstruktion.

Wendepunktdiagramm

Die schwarze Linie ist der Schusspfad, während die dünne schwarze Linie derselbe Pfad ist, der durch Drehen von Radius-Einheiten zum Ziel bewegt wird. das Gleiche gilt für die roten Pfade, die als Ziel dienen.

Die grünen Segmente haben eine Länge von turn_radius, daher sollten Sie Folgendes sehen:

AB ist die Tangente von 90 ° - θ °

BC ist der Sekant.

Die beiden grünen Linien, die vom Wendepunkt kommen, haben eine Länge von turn_radius und verlaufen senkrecht zu den beiden Pfaden. Dies bedeutet, dass der Wenderadius korrekt ist und der Bogen beide Pfade tangiert (wie es auch sein sollte, wenn Sie unter physischen Einschränkungen abbiegen).

Lassen Sie mich wissen, wenn Sie einen Fehler sehen.

BEARBEITEN:

Die Zeichnung, die Sie gepostet haben, zeigt, dass es mehrere Möglichkeiten für den Pfad gibt, auch mit festem Schützen und Ziel, wie Sie hier sehen können:

Bildbeschreibung hier eingeben

Sobald das Ziel ausgewählt ist, können Sie das oben Gesagte mit den richtigen Winkeln anwenden.


Bitte beachten Sie, dass dies kein kontinuierliches Aktualisierungssystem ist. Da das Homing mehr CPU (viel) erfordert, sollte dies der richtige Ansatz für feste Ziele sein oder wenn man natürlich eine "halbdumme" Rakete implementieren möchte. Die Trajektorie kann einfach über die Aufteilung des Pfades in 3 Teilpfade parametrisiert werden, und der Bogen kann durch eine Bezier-Kurve angenähert werden.
FxIII

1

Ich würde ein "Lenkverhalten" für die Rakete implementieren. Die Rakete hat: Eine Geschwindigkeit (eine Zahl), eine Position (einen Vektor) und eine (aktuelle) Rotation. Bei jedem Update in Ihrem Spiel / in jedem Frame ändert sich die Rotation der Rakete nur geringfügig (in Richtung des Ziels). Dann wird der Flugkörper entsprechend seiner gegenwärtigen Rotation und gegenwärtigen Geschwindigkeit vorwärtsbewegt.

Funktioniert natürlich für 2D und 3D, da der einzige Unterschied eine zusätzliche Dimension ist.

Eine andere Möglichkeit wäre, den Weg der Rakete vor dem Abfeuern zu berechnen. Sehen Sie Bezier - Kurven oder Spline .


Das Problem bei der Verwendung eines Splines besteht darin, dass Sie die Kontrollpunkte kontinuierlich aktualisieren müssen, wenn sich das Ziel bewegt. Ein einfacher Lenkungsalgo hier kann rechnerisch günstiger sein.
ChrisE

Eigentlich versuche ich den Weg zum Ziel vorab zu berechnen. Was ich arbeite, ist ein Simulator für eine reale Ausrüstung und ich versuche, das Verhalten der realen Ausrüstung nachzuahmen.
Tony

0

Ich habe das Gefühl, Sie lösen hier das falsche Problem. Eine reale Rakete macht sich keine Gedanken darüber, wohin sie sich wenden soll. Sie dreht sich einfach, bis sie auf das Ziel gerichtet ist. Die einzige Berechnung, die durchgeführt werden muss, ist, wann die Steuerung wieder auf Neutral gestellt werden muss, da eine reale Rakete ihre Abbiegerate nicht sofort ändern kann. Bei dieser Berechnung wird nur die vom Flugkörper angegebene Fluggeschwindigkeit als Eingabewert verwendet, und ich würde annehmen, dass sie vorberechnet ist.


2
Eine reale Weltrakete, insbesondere die späteren Waffen, haben Trägheitslenksysteme oder GPS oder beides, sodass sie so programmiert werden, dass sie in ein Suchgebiet gehen und nach einem Ziel suchen. Wehe, wenn ein Freund in der Nähe ist. Die Programmierung soll es Ihnen ermöglichen, die Rakete auf einen Pfad zu schicken, der Freundschaftsspiele und andere Hindernisse wie Landmassen und unschuldige Umstehende vermeidet.
Tony

0

Ich denke, der einfachste Algorithmus würde nur zwei Regeln folgen:

  1. Befindet sich das aktuelle Ziel näher an der Rakete als der Drehdurchmesser, fahren Sie geradeaus weiter. Dies vermeidet, dass die Rakete nahe Ziele umkreist, anstatt sie tatsächlich zu erreichen.

  2. Andernfalls drehen Sie sich in Richtung des Ziels, bis Sie darauf zeigen.

So berechnen Sie den Punkt, an dem die Kurve in 2D endet:

  1. An dem Punkt, an dem Sie mit dem Abbiegen beginnen möchten, befindet sich der Mittelpunkt des Abbiegekreises in einem Abstand von Ihrem Abbiegeradius senkrecht zur aktuellen Fahrtrichtung. Beachten Sie, dass es zwei dieser Punkte gibt - Sie möchten wahrscheinlich den Punkt, der Ihrem Ziel am nächsten liegt. Berechnen Sie diese Position und nennen Sie sie P.

  2. Sie können jetzt ein rechtwinkliges Dreieck mit dem rechten Winkel zur Tangente und zwei bekannten Punkten konstruieren - P und Ihr Ziel. Auf diese Weise können Sie die Entfernung von der Tangente zu Ihrem Zielpunkt mit Pythagoras berechnen. Nennen Sie es D.

  3. Nun müssen Sie den Schnittpunkt eines Kreises mit dem Radius D an Ihrem Ziel mit Ihrem Wendekreis berechnen . Sie erhalten zwei Lösungen, die die beiden Tangentenpunkte auf diesem Kreis darstellen, an denen sich die Rakete nicht mehr dreht (eine für jede Fahrtrichtung um den Kreis). Wählen Sie den Punkt vor der Rakete - das ist Ihre Antwort.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.