Ciblage par drone

9

Imaginez un "drone" et un point cible sur un avion 2D. Il y a huit paramètres:

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

(nous dirons simplement que la cible est immobile)

Le travail du drone consiste à atteindre la cible le plus rapidement possible, en respectant le couple et la poussée maximum. Il n'y a que deux façons d'appliquer le couple, car ce n'est que dans un plan 2D. La poussée est limitée à une seule direction par rapport à l'orientation de l'engin et ne peut pas être dirigée sans faire tourner le drone. Négligez toute résistance, vous pouvez simplement prétendre qu'elle flotte dans l'espace extra-atmosphérique 2D. Supposons que le drone vérifie une équation à un intervalle de temps t(peut-être quelque chose comme toutes les 0,01 secondes), branche les paramètres et ajuste son couple et sa poussée en conséquence. Quelles devraient être les équations de poussée et de couple?

Gus
la source
3
Si la poussée ne peut aller que dans une seule direction, vous ne changerez jamais de direction.
MichaelHouse
1
J'aurais dû préciser plus clairement - vous ne pouvez pas carder la poussée, c'est-à-dire que la poussée ne peut aller que dans une direction par rapport à l'orientation de l'engin. Vous pouvez toujours faire pivoter l'engin et changer la direction de la poussée.
Gus
2
Cette question est-elle liée à nodewar?
Seth Battin
1
Ensuite, je pense que je peux poster une bonne solution pour vous (un peu plus tard ce soir). :)
Seth Battin
1
Cette question a besoin d'un titre plus descriptif, mais je ne peux pas penser à un bon. Halp?
Anko

Réponses:

5

À la lumière du contexte de votre question, http://nodewar.com/ , il existe quelques considérations spécifiques pour votre solution:

  1. Vous avez une vitesse angulaire maximale (faible) et un couple maximum suffisant pour l'atteindre en très peu de temps.
  2. Votre drone et votre cible ont chacun une vitesse et une accélération externe sans rapport avec la poussée (la gravitation abonde).
  3. Votre objectif souhaité change si souvent que tenter de viser parfaitement serait un gaspillage. Vous devriez essayer de vous rapprocher et de le corriger à chaque image.

Ces méthodes sont ce que j'ai décidé de travailler pour atteindre l'accélération souhaitée.

Accélération, pas vitesse

Parce que vous avez déjà une vitesse donnée et que votre cible se déplace, vous n'avez pas besoin de poussée vers un point. Vous avez besoin de poussée pour changer votre vitesse à ce qu'elle devrait être. Cela signifie que votre vaisseau ne doit pas pointer vers où il va, mais dans la direction dans laquelle il devrait accélérer.

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

Direction vers le bon cap

Vous avez un vecteur d'accélération, vous voulez maintenant l'appliquer. Déterminez jusqu'où vous devez tourner. J'ai probablement utilisé plus d'étapes que nécessaire ici, mais les coordonnées de rotation me confondent, et je pense que la valeur de rotation du navire non plafonnée est de toute façon un bug dans l'API.

// 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;
}

Une formule simple. Il n'y a aucun mal à tourner tout le temps, alors ne vous embêtez pas à appliquer des valeurs de couple partielles. Si vous avez besoin d'une petite correction de la vitesse angulaire, vous pouvez de toute façon effectuer cette détermination plusieurs fois par seconde.

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

Une formule moins simple. Il arrivera un moment où vous ne voudrez plus continuer à tourner, car vous voudrez éventuellement vous arrêter. Heureusement, ce plafond de vitesse angulaire signifie que vous pouvez rapidement ralentir de la vitesse angulaire maximale à zéro. Il vous suffit de calculer quand le faire.

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;
}

Après avoir modifié le code ci-dessus pour l'adapter à vos besoins, votre vaisseau devrait rapidement et précisément pivoter dans l'angle que vous lui avez donné pour cibler.

Vitesse de battage

Alors, quand pousser? Encore une fois, le changement rapide de la cible et d'autres facteurs créent une grande difficulté à résoudre une solution exacte. N'essayez pas.

// 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;
  } 
}

Pour les cas où vous avez besoin d'une poussée partielle, vous pouvez à nouveau compter sur le fait que vous pouvez choisir entre 0 et 1 poussée plusieurs fois par seconde. Cela vous donne une poussée partielle efficace sans faire varier la valeur réelle.

Bonne chance!

Seth Battin
la source
Très bien, merci, cela aide beaucoup. Je vais devoir le modifier un peu je pense. Quel est le nom de votre espèce?
Gus
Je ne les ai pas poussés à l'échelle. Ils n'ont aucune méthode pour attaquer. :)
Seth Battin
3

Une question similaire, avec quelques bonnes réponses, y compris le nom apparent de tout ce sujet, "motion planning":
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics

En tant que programmeur, j'aime l'aspect pratique de la suggestion de user470365. Cependant, je vais essayer une approche plus rigoureuse. Ma suggestion ici calcule un plan complet au début, mais je suppose que vous pourriez réévaluer aussi souvent que vous le souhaitez si les paramètres changent.

Le plan

  1. Tournez-vous dans une certaine direction, d , et maintenez cette direction.
  2. Attendez un certain temps, t , puis effectuez une poussée soutenue jusqu'à ce que la cible soit atteinte.

Détails

Je suggère des méthodes itératives pour trouver d et t :

  1. En supposant qu'il n'y ait pas de poussée, parcourez la future trajectoire du drone à l'aide d'une boucle et d'un petit pas de temps:

    • Pour la position et la vitesse du drone à cette heure future, trouvez la direction, d , telle qu'une poussée soutenue amènera le drone à la cible. Pour ce faire, échantillonnez de nombreuses directions entre 0 et 360 degrés et trouvez celle qui rapprochera le drone de la cible dans les plus brefs délais.
    • Vérifiez pour voir si nous avons assez de temps entre maintenant et ce moment futur pour nous tourner vers d . (Le tournage n'est pas anodin. Voir la discussion à la fin.)
    • Si nous avons assez de temps, alors notre recherche est terminée, alors sortez de cette boucle.
  2. Nous avons maintenant trouvé d et t .

  3. Passez à d le plus rapidement possible (à nouveau, voir la discussion ci-dessous).
  4. Attendez jusqu'à t , puis démarrez la poussée soutenue.
  5. Le drone devrait finalement toucher la cible.

Tournant

Quand je dis "tourner à d ", je veux dire vraiment, "faire une séquence de couples de telle sorte que nous tournons à d le plus rapidement possible tout en ramenant la vitesse angulaire à zéro". Il y a probablement une équation pour cela impliquant la direction actuelle, la vitesse angulaire actuelle et l'accélération angulaire maximale, mais elle est compliquée par le comportement d'angle des angles.

Eric Undersander
la source
Approche intéressante. Alors, qu'est-ce qui régit notre sélection de ce temps futur? Il semble que toute technique pour déterminer qu'il a ses problèmes, donc l'itération pourrait également être nécessaire.
Gus