Drohnen-Targeting

9

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?

Gus
quelle
3
Wenn der Schub nur in eine Richtung gehen kann , werden Sie niemals die Richtung ändern.
MichaelHouse
1
Ich hätte klarer spezifizieren sollen - Sie können den Schub nicht kardanisch ausrichten, dh der Schub kann relativ zur Ausrichtung des Fahrzeugs nur in eine Richtung gehen. Sie können das Fahrzeug weiterhin drehen und die Schubrichtung ändern.
Gus
2
Bezieht sich diese Frage auf Nodewar?
Seth Battin
1
Dann denke ich, ich kann eine gute Lösung für Sie veröffentlichen (etwas später heute Abend). :)
Seth Battin
1
Diese Frage braucht einen aussagekräftigeren Titel, aber ich kann mir keinen guten vorstellen. Halp?
Anko

Antworten:

5

In Anbetracht des Kontextes Ihrer Frage, http://nodewar.com/ , gibt es einige spezifische Überlegungen für Ihre Lösung:

  1. Sie haben eine (niedrige) maximale Winkelgeschwindigkeit und genügend maximales Drehmoment, um diese in sehr kurzer Zeit zu erreichen.
  2. Ihre Drohne und Ihr Ziel haben jeweils Geschwindigkeit und externe Beschleunigung, die nicht mit dem Schub zusammenhängen (Gravitation ist im Überfluss vorhanden).
  3. Ihr gewünschtes Ziel ändert sich so häufig, dass der Versuch, perfekt zu zielen, eine Verschwendung wäre. Sie sollten versuchen, näher zu kommen, und es jedes Bild korrigieren.

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.

// My target velocity is for maintaining a circular orbit.  Yours may differ.
// Earlier, I calculated total gravity and the perpendicular direction.
// You may wish to subtract gravity from your total, rather than match it.
var targetVel = o.lib.vec.times(lateralDir, targetVelMag);

var targetAccel = lv.sum(
  o.lib.vec.diff(targetVel, o.me.vel), 
  o.lib.vec.times(gravity, 1 / o.me.mass)  
);

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.

// convert acceleration to an angle
var polar = o.lib.vec.toPolar(targetAccel);
var traj = polar[1];

// constrain the angle to +/-2PI, because the ship's rotation is not limited 
// by default
var fixed_rot = o.lib.ang.rescale(o.me.rot);

// limit the correction to be +/-1PI
var traj_correction = traj - fixed_rot;
if (traj_correction > (Math.PI)){
  traj_correction = (2 * Math.PI) - traj_correction;
} else if (traj_correction < (-1 * Math.PI)){
  traj_correction = (2 * Math.PI) + traj_correction;
}

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.

if (traj_correction > 0){
  torque = 1;
} else if (traj_correction < 0){
  torque = -1;
}

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.

var max_a_accel = c.MAX_TORQUE / o.me.m_i;
var a_deccel_time = Math.abs(o.me.a_vel) / max_a_accel;
// the same math as linear acceleration, now in angles.
var stopping_angle = 0.5 * max_a_accel * a_deccel_time * a_deccel_time;


if (stopping_angle >= Math.abs(traj_correction)){
  // slowdown required.  Reverse torque
  torque *= -1;
}

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.

// if the heading is close to the final value, thrust.
if (Math.abs(traj_correction ) < 0.02) {  // about 1 degree
  if (true 
      // some logical test, in case you don't want to accelerate past
      // a maximum speed, or some such.  Not required for your stated purpose.
     ){
    thrust = 1;
  } 
}

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!

Seth Battin
quelle
Großartig, danke, das hilft sehr. Ich denke, ich muss es ein wenig ändern. Wie heißt deine Spezies?
Gus
Ich habe sie nicht auf die Leiter geschoben. Sie haben keine Angriffsmethode. :)
Seth Battin
3

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

  1. Drehen Sie sich in eine bestimmte Richtung, d , und halten Sie diese Richtung.
  2. Warten Sie bis zu einer bestimmten Zeit, t , und führen Sie dann einen anhaltenden Schub aus, bis das Ziel erreicht ist.

Einzelheiten

Ich schlage iterative Methoden vor, um d und t zu finden :

  1. Wenn Sie keinen Schub annehmen, fahren Sie mit einer Schleife und einem kleinen Zeitschritt entlang der zukünftigen Flugbahn der Drohne:

    • Finden Sie für die Position und Geschwindigkeit der Drohne zu diesem zukünftigen Zeitpunkt die Richtung d , so dass ein anhaltender Schub die Drohne zum Ziel bringt. Probieren Sie dazu viele Richtungen zwischen 0 und 360 Grad aus und finden Sie die Richtung, die die Drohne in kürzester Zeit dem Ziel nahe bringt.
    • Überprüfen Sie, ob wir zwischen jetzt und dieser zukünftigen Zeit genug Zeit haben, um uns an d zu wenden . (Drehen ist nicht trivial. Siehe Diskussion am Ende.)
    • Wenn wir genug Zeit haben, ist unsere Suche abgeschlossen. Brechen Sie also aus dieser Schleife aus.
  2. Wir haben jetzt d und t gefunden .

  3. Wenden Sie sich so schnell wie möglich an d (siehe Diskussion unten).
  4. Warten Sie bis t und starten Sie dann den anhaltenden Schub.
  5. Die Drohne sollte schließlich das Ziel treffen.

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.

Eric Undersander
quelle
Interessanter Ansatz. Was regelt also unsere Auswahl dieser zukünftigen Zeit? Es scheint, als ob jede Technik, um festzustellen, ob sie ihre Probleme hat, daher könnte auch eine Iteration erforderlich sein.
Gus