Drone targeting


9

Immagina un "drone" e un punto bersaglio su un piano 2d. Esistono otto parametri:

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

(diremo solo che l'obiettivo è fermo)

Il compito del drone è raggiungere l'obiettivo il più velocemente possibile, obbedendo alla coppia massima e alla spinta massima. Esistono solo due modi per applicare la coppia, poiché si tratta solo di un piano 2d. La spinta è limitata per andare solo in una direzione rispetto all'orientamento dell'imbarcazione e non può essere mirata senza ruotare il drone. Trascura qualsiasi resistenza, puoi semplicemente far finta che fluttui nello spazio esterno 2d. Diciamo che il drone controlla un'equazione all'intervallo di tempo t(forse qualcosa come ogni 0,01 secondi), inserisce i parametri e regola la sua coppia e la spinta di conseguenza. Quali dovrebbero essere le equazioni per spinta e coppia?


3
Se la spinta può andare solo in una direzione, non cambierai mai direzione.
MichaelHouse

1
Avrei dovuto specificare più chiaramente: non è possibile gimbalare la spinta, ovvero la spinta può andare solo in una direzione rispetto all'orientamento dell'imbarcazione. Puoi ancora ruotare il mezzo e cambiare la direzione della spinta.
Gus,

2
Questa domanda è correlata a nodewar?
Seth Battin,

1
Quindi penso di poter pubblicare una buona soluzione per te (un po 'più tardi stasera). :)
Seth Battin,

1
Questa domanda ha bisogno di un titolo più descrittivo, ma non riesco a pensare a un buon titolo. Halp?
Anko,

Risposte:


5

Alla luce del contesto della tua domanda, http://nodewar.com/ , ci sono un paio di considerazioni specifiche per la tua soluzione:

  1. Hai una velocità angolare massima (bassa) e una coppia massima sufficiente per raggiungerla in brevissimo tempo.
  2. Il drone e il bersaglio hanno ciascuno velocità e accelerazione esterna non correlate alla spinta (la gravitazione abbonda).
  3. Il tuo obiettivo desiderato cambia così frequentemente che cercare di mirare perfettamente sarebbe uno spreco. Dovresti provare ad avvicinarti e correggerlo ogni fotogramma.

Questi metodi sono ciò che ho deciso di lavorare per raggiungere un'accelerazione desiderata.

Accelerazione, non velocità

Poiché hai già una determinata velocità e il tuo obiettivo si sta muovendo, non hai bisogno di una spinta verso un punto. Hai bisogno di una spinta per cambiare la tua velocità a quello che dovrebbe essere. Ciò significa che la tua nave non deve puntare verso dove sta andando, ma nella direzione in cui dovrebbe accelerare.

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

Sterzare verso la giusta direzione

Hai un vettore di accelerazione, ora vuoi applicarlo. Determina fino a che punto devi ruotare. Probabilmente ho usato più passaggi di quelli richiesti qui, ma le coordinate rotazionali mi confondono e penso che il valore di rotazione della nave non sfruttato sia comunque un bug nell'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;
}

Una formula semplice Non c'è nulla di male nel girare continuamente, quindi non preoccuparti di applicare valori di coppia parziali. Se hai bisogno di una piccola correzione della velocità angolare, puoi comunque prendere questa decisione molte volte al secondo.

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

Una formula meno semplice. Arriverà un punto in cui non vuoi continuare a girare, perché alla fine vuoi fermarti. Fortunatamente, quel limite di velocità angolare significa che puoi rallentare rapidamente dalla velocità angolare massima a zero. Devi solo calcolare quando farlo.

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

Dopo aver modificato il codice in alto per soddisfare le tue esigenze, la tua nave dovrebbe ruotare rapidamente e con precisione in qualunque angolazione hai assegnato al bersaglio.

Velocità di speronamento

Quindi, quando spingere? Ancora una volta, il rapido cambiamento del bersaglio e altri fattori creano una grande difficoltà nel risolvere una soluzione esatta. Non provarci.

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

Per quei casi in cui è necessaria una spinta parziale, è possibile fare nuovamente affidamento sul fatto che è possibile scegliere tra 0 e 1 spinta più volte al secondo. Questo ti dà una spinta parziale efficace senza variare il valore reale.

In bocca al lupo!


Ottimo, grazie, questo aiuta molto. Dovrò modificarlo un po 'penso. Come si chiama la tua specie?
Gus,

Non li ho spinti sulla scala. Non hanno metodo per attaccare. :)
Seth Battin il

3

Una domanda simile, con alcune buone risposte, incluso il nome apparente di tutto questo argomento, "pianificazione del movimento":
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics

Come programmatore, mi piace la praticità del suggerimento di user470365. Tuttavia, mi prenderò cura di un approccio più rigoroso. Il mio suggerimento qui calcola un piano completo all'inizio, ma suppongo che potresti rivalutare tutte le volte che vuoi se i parametri cambiano.

Il piano

  1. Girare in una certa direzione, d , e tenere quella direzione.
  2. Attendere un certo tempo, t , quindi effettuare una, si raggiunge spinta costante fino alla destinazione.

Dettagli

Suggerisco metodi iterativi per trovare d e t :

  1. Supponendo che non ci sia alcuna spinta, attraversa la traiettoria futura del drone usando un loop e un piccolo timestep:

    • Per la posizione e la velocità del drone in questo momento futuro, trova la direzione, d , in modo tale che una spinta sostenuta porti il ​​drone al bersaglio. Fallo campionando molte direzioni tra 0 e 360 ​​gradi e trovando quella che porterà il drone vicino al bersaglio nel minor tempo possibile.
    • Controlla se abbiamo abbastanza tempo tra ora e questa volta per passare a d . (La svolta non è banale. Vedi la discussione alla fine.)
    • Se abbiamo abbastanza tempo, la nostra ricerca è completa, quindi esci da questo ciclo.
  2. Ora abbiamo trovato d e t .

  3. Passare a d il più rapidamente possibile (di nuovo, vedere la discussione di seguito).
  4. Attendere fino a t , quindi avviare la spinta sostenuta.
  5. Il drone dovrebbe infine colpire il bersaglio.

svolta

Quando dico "passa a d ", intendo davvero, "esegui una sequenza di coppie in modo tale che ruotiamo su d il più rapidamente possibile, portando anche a zero la velocità angolare". Probabilmente esiste un'equazione per ciò che riguarda la direzione corrente, la velocità angolare corrente e l'accelerazione angolare massima, ma è complicata dal comportamento avvolgente degli angoli.


Approccio interessante Quindi cosa governa la nostra selezione di quel tempo futuro? Sembra che qualsiasi tecnica per determinare che abbia i suoi problemi, quindi potrebbe essere necessaria anche l'iterazione.
Gus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.