Implementazione di una navigazione proporzionale semplice per un missile homing


8

Sto cercando di implementare la forma più semplice possibile di navigazione proporzionale , cioè il missile gira nella direzione in cui sta cambiando il suo rilevamento da bersaglio a bersaglio, e una volta che il suo rilevamento da bersaglio a bersaglio è immutabile, è su una rotta di intercettazione.

Quindi, ho un missile 2D che si muove a una velocità costante nella direzione in cui è rivolto, che può girare a una velocità costante, e ad ogni intervallo aggiorno il missile con qualcosa del tipo:

Position += VectorProduct (Direction * Speed * TimePassed)

PreviousTargetBearing = TargetBearing
TargetBearing = AngleBetween(TargetPosition, Position)
TargetBearingDelta = TargetBearing - PreviousTargetBearing

If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed

Il problema è che il missile oscilla sempre attorno alla sua direzione di lancio, perché non appena il missile gira la prima volta, questo inverte il segno di TargetBearingDelta, facendolo poi girare nella direzione opposta e così via ...

Qual è il modo più semplice per risolvere questo problema? Sono sicuro che mi manca qualcosa di semplice.

Domanda StackOverflow correlata: come creare un "missile intercetta" per un gioco?

Per ribadire, sono interessato in modo specifico all'implementazione dell'algoritmo di navigazione proporzionale , non agli algoritmi di homing in generale.


Aggiornamento: immagino che la risposta ovvia sia non controllare il rilevamento e regolare la rotta ad ogni giro, ma alternare tra i due. Ci proverò.

Risposte:


1

Passaggio 1) Calcola il tempo di destinazione se vai in linea retta

Passaggio 2) Calcola dove si troverà l'obiettivo con la sua direzione corrente in quel momento.

Step 3) Imposta l'intestazione del missile in quel punto.

Passaggio 4) Aggiornare se necessario

All'inizio, questo non sarà molto preciso, ma man mano che la distanza si chiuderà diventerà più accurata; man mano che il tempo di viaggio si azzera, il punto bersaglio per il missile si avvicina al bersaglio.

Fai un giro. È abbastanza semplice da implementare. Fammi sapere come funziona perché voglio mettere i missili nel mio gioco e questo è stato il mio primo pensiero.

E per questa parte:

If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed

Avrei invece due variabili missileDirection. Uno per quello che è veramente, e uno per quello che dovrebbe essere in futuro. Quindi, la mossa del missile sta andando verso la direzione desiderata in base alla sua velocità di virata. Se l'intestazione desiderata è maggiore dell'intestazione corrente, aggiungere la velocità di virata. Se è più piccolo, sottrai. Se passi oltre, impostalo uguale.


Questo non sembra utilizzare il metodo di navigazione proporzionale?
e100,

No, ma dovrebbe avere circa lo stesso effetto. Questo traccia un percorso di intercettazione tra il missile e il bersaglio. Lo scopo della navigazione è che il missile intercetti il ​​bersaglio. Il processo sopra dovrebbe farlo. Volevi semplice.
Azaral

Punto giusto, +1 a te
e100,

Se lo provi fammi sapere come va. Questo era il mio piano per la ricerca di missili nel mio gioco; Non sono ancora riuscito a programmare il missile.
Azaral

Ho implementato questo metodo per ora e funziona bene. Non credo di poter accettare questa risposta in quanto non è abbastanza vicina a ciò con cui voglio finire, ma molte grazie.
e100,

4

Come dice Nailer, puoi in qualche modo limitare il cambiamento di movimento.

Dai un'occhiata al PID , un bel modo per far muovere rapidamente le cose verso un certo 'valore' ma senza superarlo, potrebbe darti qualche idea.

Puoi anche dare un'occhiata a questa domanda , un po 'in basso è una spiegazione della "curva del cane", un algoritmo di homing molto accurato usato dai cani.


Vedo che ho bisogno di una qualche forma di circuito di controllo di feedback smorzato quando il missile sta seguendo il bersaglio, ma penso di avere un problema iniziale più semplice poiché il missile oscilla solo sulla direzione di lancio iniziale. Solo per sottolineare, voglio assolutamente usare l'algoritmo di navigazione proporzionale.
e100

Sebbene il PID sia uno strumento piacevole, è difficile da sintonizzare .. ma una volta trovati i tre parametri (se ne richiedono tre), hai una soluzione per quel meccanismo specifico. +1 dalla mia parte.
teodron,

grazie teodron ;-) @ e100: se vuoi che il missile vada "dritto" quando i calcoli sono fatti e il bersaglio è in costante movimento, controlla l'esempio della "curva del cane" mentre fa proprio questo. Altrimenti, il tuo 'TurnRate' equivale alla 'P' (IIRC) in PID, potresti calcolarlo al volo, dire il 10% della differenza e non un valore fisso. Se hai 2 ° di rotta ovviamente non hai bisogno della stessa modifica di una 20 ° di sconto.
Valmond,

1

Secondo la mia opinione, ci sarebbe un altro metodo che coinvolge due vettori, uno per la direzione da colpire di un missile, e un altro è per sé lerping (o diciamo che sta spostando la sua direzione per abbinare il primo vettore).

In questo modo, possiamo produrre un tempo di ritardo che consente a un missile di cambiare senza problemi la sua direzione in base a un cambiamento in un primo vettore. Credo che eliminerà il problema nel "segno" dell'operazione matematica.

PS. Il punto principale è che noi trasferiamo il vettore di un missile in un vettore direzionale (da colpire) per quanto riguarda un piccolo ritardo nel tempo.


Si noti che sebbene questo approccio possa produrre risultati, ciò darebbe al missile un tempo di virata costante (piuttosto che una velocità di virata costante ) - a meno che non si ricalcoli la velocità di interpolazione di ciascun fotogramma in base alla distanza di virata ancora da percorrere per produrre un velocità di virata costante.
doppelgreener,

Devo cercare "lerping"!
e100,

1

La navigazione proporzionale è semplice da implementare nei giochi.

Un esempio di implementazione nel gioco è:

Accelerazione richiesta = LOS * LOS_Rate * NC + APN_bias

LOS = Vector3 (TargetPosition) - Vector3 (MissilePosition)

NC = moltiplicatore costante di navigazione (a seconda della frequenza dei fotogrammi)

APN_bias = LOS_Rate / delta_T * (NC / 2)

LOS_Rate = LOS Rotation Rate è il tasso angolare di variazione della linea di mira tra il missile e il bersaglio. Questo viene misurato registrando sia il missile che il vettore di destinazione posiziona ogni fotogramma su delta_T e sottraendo ciascuno per ottenere la differenza. Delta_T è il riferimento di temporizzazione (ovvero la frequenza dei fotogrammi) a cui il missile homing è in esecuzione nel gioco.

Per ottenere LOS_Rate, fai semplicemente in modo che il tuo loop di guida missilistico esegua le seguenti operazioni su ciascun frame (delta_T):

// New LOS rate

LOS_Delta = Vector3( LOS ) - Vector3( LOS_previous_frame ) 

LOS_Rate = LOS_Delta.Vector3Length()

// Update LOS before we finish

LOS_previous_frame = Vector3( LOS )

Puoi trovare ulteriori informazioni su come abbiamo implementato PN for World in Conflict nei seguenti URL. Spero che li trovi utili.

http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles

http://download.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf

-blahdy


0

Non puoi semplicemente limitare la velocità di virata in modo che non possa mai oltrepassare TargetBearing in un frame?

Se un turno fa girare il missile oltre il suo bersaglio, devi solo impostare il nuovo cuscinetto uguale a quello del bersaglio.

Ha senso?


No, non la penso così. L'idea non sta girando il missile verso TargetBearing, ma girando nella direzione in cui TargetBearing sta cambiando.
e100

Ok. Immagino di aver frainteso.
Nailer,
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.