Stellen Sie sich eine "Drohne" und einen Zielpunkt auf einer 2D-Ebene vor. Es gibt acht Parameter:
P = my position
Q = target position
V = my velocity
I = my moment of inertia
w = my angular velocity
s = my angular position
T = max thrust
U = max torque
(Wir werden nur sagen, dass das Ziel stationär ist)
Die Aufgabe der Drohne ist es, so schnell wie möglich zum Ziel zu gelangen und dabei das maximale Drehmoment und den maximalen Schub einzuhalten. Es gibt nur zwei Möglichkeiten, das Drehmoment aufzubringen, da dies nur in einer 2D-Ebene erfolgt. Der Schub darf nur in eine Richtung relativ zur Ausrichtung des Fahrzeugs gehen und kann nicht ohne Drehen der Drohne gerichtet werden. Vernachlässigen Sie jeden Widerstand, Sie können einfach so tun, als würde er im 2. Weltraum herumschweben. Angenommen, die Drohne überprüft eine Gleichung im Zeitintervall t
(möglicherweise etwa alle 0,01 Sekunden), steckt die Parameter ein und passt das Drehmoment und den Schub entsprechend an. Wie sollten die Gleichungen für Schub und Drehmoment sein?
Antworten:
In Anbetracht des Kontextes Ihrer Frage, http://nodewar.com/ , gibt es einige spezifische Überlegungen für Ihre Lösung:
Diese Methoden habe ich beschlossen, um eine gewünschte Beschleunigung zu erreichen.
Beschleunigung, nicht Geschwindigkeit
Da Sie bereits eine bestimmte Geschwindigkeit haben und sich Ihr Ziel bewegt, müssen Sie nicht auf einen Punkt zugehen. Sie benötigen Schub, um Ihre Geschwindigkeit auf das zu ändern, was sie sein sollte. Dies bedeutet, dass Ihr Schiff nicht darauf zeigen muss, wohin es fährt, sondern in die Richtung, in die es beschleunigen soll.
In Richtung der rechten Richtung steuern
Sie haben einen Beschleunigungsvektor, den Sie jetzt anwenden möchten. Bestimmen Sie, wie weit Sie drehen müssen. Ich habe hier wahrscheinlich mehr Schritte als erforderlich verwendet, aber die Rotationskoordinaten verwirren mich, und ich denke, dass der Wert der nicht begrenzten Schiffsrotation ohnehin ein Fehler in der API ist.
Eine einfache Formel. Es schadet nicht, ständig zu drehen. Wenden Sie also keine Teildrehmomentwerte an. Wenn Sie eine kleine Korrektur der Winkelgeschwindigkeit benötigen, können Sie diese Bestimmung ohnehin mehrmals pro Sekunde vornehmen.
Eine weniger einfache Formel. Es wird einen Punkt geben, an dem Sie nicht weiter drehen möchten, weil Sie schließlich aufhören möchten. Glücklicherweise bedeutet diese Winkelgeschwindigkeitsbegrenzung, dass Sie schnell von der maximalen Winkelgeschwindigkeit auf Null verlangsamen können. Sie müssen nur berechnen, wann Sie dies tun müssen.
Nachdem Sie den obigen Code an Ihre Bedürfnisse angepasst haben, sollte sich Ihr Schiff schnell und präzise in den Winkel drehen, den Sie dem Ziel gegeben haben.
Rammgeschwindigkeit
Also, wann stoßen? Wiederum verursachen die schnelle Änderung des Ziels und andere Faktoren große Schwierigkeiten bei der Lösung einer exakten Lösung. Versuche es nicht.
In den Fällen, in denen Sie einen Teilschub benötigen, können Sie sich erneut darauf verlassen, dass Sie mehrmals pro Sekunde zwischen 0 und 1 Schub wählen können. Dies gibt Ihnen einen effektiven Teilschub, ohne den tatsächlichen Wert zu verändern.
Viel Glück!
quelle
Eine ähnliche Frage mit einigen guten Antworten, einschließlich des offensichtlichen Namens dieses gesamten Themas, "Bewegungsplanung":
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics
Als Programmierer mag ich die Praktikabilität des Vorschlags von user470365. Ich werde jedoch einen strengeren Ansatz wählen. Mein Vorschlag hier berechnet zu Beginn einen vollständigen Plan, aber ich nehme an, Sie könnten so oft wie gewünscht neu bewerten, wenn sich die Parameter ändern.
Der Plan
Einzelheiten
Ich schlage iterative Methoden vor, um d und t zu finden :
Wenn Sie keinen Schub annehmen, fahren Sie mit einer Schleife und einem kleinen Zeitschritt entlang der zukünftigen Flugbahn der Drohne:
Wir haben jetzt d und t gefunden .
Drehen
Wenn ich "nach d drehen " sage, meine ich wirklich "mache eine Folge von Drehmomenten, so dass wir uns so schnell wie möglich nach d drehen und gleichzeitig die Winkelgeschwindigkeit auf Null bringen". Es gibt wahrscheinlich eine Gleichung dafür, die die aktuelle Richtung, die aktuelle Winkelgeschwindigkeit und die maximale Winkelbeschleunigung beinhaltet, aber sie wird durch das Wickelverhalten von Winkeln kompliziert.
quelle