Vai al contenuto
PLC Forum


Raccordare Due Traiettorie


Messaggi consigliati

Inserito:

ciao a tutti,

provo a generalizzare il mio problema,sperando di riuscire a spiegarmi..

Ho due traiettorie, una vecchia A e una nuova B. Devo passare dalla traiettoria A alla traiettoria B in un certo tempo T. La traiettoria B non e' costante nel tempo ma evolve in qualche modo. Come potrei fare? Io pensavo a un qualche algoritmo funzione della distanza tra A e B ma non riesco a rispettare la specifica sul tempo T...

Grazie dell'attenzione


emanuele.croci
Inserita:

Forse dovresti chiarire un po' meglio il tuo problema:

- cosa intendi per traiettoria (di default sarebbe il percorso effettuato nello spazio da un punto mobile): è una curva, una retta, una direzione, è F(t) dove a qualsiasi valore t associo un punto (X;Y) su un piano...?

- Cosa vuol dire passare da una traiettoria ad un'altra? Ad es. se le 2 traiettorie sono F(t) e G(t), supponiamo che vuoi fare ciò al tempo t=10, calcolo F(10) e G(10) e trovo 2 punti. Calcolo la retta che unisce i 2 punti, calcolo la distanza D tra i 2 punti e definisco una velocità pari a V=D/T, dove T è il tempo dato.

Diciamo che in base ai tuoi dati, questo algoritmo risolve il tuo problema, se no dacci maggiori ragguagli...

Ciao, Emanuele

Inserita:

Immaginavo di non essermi spiegato bene..

Dunque..per "traiettoria" intendo una grandezza (temperatura, posizione, ecc.) variabile nel tempo.

Provo a dare alcuni nomi forse piu' chiari di A e B..

Io ho due traiettorie, una di partenza P e una di arrivo A. Io devo raccordare le due traiettorie in un tempo T=N*Ts a partire da un certo istante in cui voglio iniziare il passaggio tra P e A. La traiettoria A e' variabile e Ts e' il passo di calcolo: in pratica, in N passi devo passare da P ad A, ovvero devo generare una nuova traiettoria che mi realizzi il raccordo.

Le righe di pseudocodice che vedi sotto realizzano il mio algoritmo nel caso in cui P e A siano costanti nel tempo. Se pero' A o P cambiano nel tempo, non riesco a rispettare la condizione y(T)=A. Dimenticavo..quello che vado a realizzare con l'algoritmo e' in pratica un filtro che riceve in ingresso P e A e mi genera la traiettoria y in cui si vede il raccordo tra P e A. Vorrei poter correggere y in modo che dopo N passi la y abbia comunque raggiunto la traiettoria A che e' variabile.

y(i=0) = P // inizializzazione con il valore di partenza //

y(i+1) = y(i) - (P(i)-A(i))/N

Forse e' piu' semplice (o fattibile) se impongo la condizione che la traiettoria P sia in realta' una costante e non cambi durante il movimento di raccordo..

Spero di non aver aumentato la confusione.. :-P

Ciao

emanuele.croci
Inserita: (modificato)

Secondo me la formula che hai scritto vale solo se P e A sono costanti.

Ti propongo una media pesata tra le grandezza P ed A, che ne dici?

Y(i) = P(i)* (100- i)/100 + A(i)*i/100

Con i che varia tra 0 e 100 (oppure al posto di 100 puoi mettere T per generalizzare su qualsiasi tempo).

Così facendo il setpoint Y "si sposta gradualmente" tra P ed A, ognuna vista come variabile nel tempo, cioè come una f(t).

Ciao, Emanuele

Modificato: da emanuele.croci
Inserita:

Ricapitoliamo:

Start P (fisso)

Arrivo A(variabile , ma la condizione A>P è sempre vera (?), delta di variazione (?)

N = numero di incrementi che subisce la variabile P per raggiungiungere il valore A?

passo variabile in funzione di P,A,N

è questo il problema?

Inserita: (modificato)

Grazie Emanuele per i suggerimenti.

Si, la mia formula vale solo per P e A costanti durante il movimento, come avevo sottolineato nel mio secondo messaggio. Effettivamente non avevo pensato di utilizzare lo stesso indice "i" per realizzare una media. Questo perche' uso Simulink e non ho accesso direttamente al indice "i". Per ovviare al problema ho creato un semplice contatore.

Per Irpick:

- Start P puo' anche essere fisso ma se posso variarlo e' meglio.

- La condizione A>P non e' detta. Posso avere A qualsiasi, tipicamente e' piu' grande di P.

- Come delta di variazione devo avere un "gradino piccolo" rispetto a P-A. La traiettoria raccordata sara' un riferimento fornito a un controllore e non deve avere variazioni troppo brusche.

- N=T/Ts ed e' il numero di incrementi per passare da P ad A (y(0)=P(0) e y(N)=A(N))

- Il passo e' variabile durante il movimento, in funzione di P e A. N viene fissato all'inizio e non cambia durante il movimento.

In allegato trovate una simulazione fatta utilizzando l'algoritmo di Emanuele (grazie ancora per l'idea!).

Nel grafico si vede P(giallo),y(viola),A(azzurro). Ho richiesto di arrivare in A in 5 secondi (N = 100 e Ts=0.05s)

Idee per migliorare il profilo, osservazioni?

Grazie del supporto

Modificato: da birkof
emanuele.croci
Inserita:

Onestamente non ho capito bene la tua esigenza, quindi a parte l'algoritmo matematico non ti so consigliare altro. Forse se dai qualche dettaglio su che applicazione è e cosa intendi per "migliorare"....

Noto anche che P(N)=A(N) nel tuo grafico di esempio, è un caso o è sempre così??

Ciao, Emanuele

Inserita:

ciao Emanuele,

Noto anche che P(N)=A(N)

No, y(N )=A(N) ovvero a 5s la curva azzurra e quella viola si incontrano, proprio come volevo.

Ho un controllore che riceve in ingresso un riferimento da inseguire. La mia esigenza e' poter cambiare profilo di riferimento con un comando es. un segnale 0/1. Ovviamente non voglio vedere salti a scalino e voglio agganciarmi al nuovo riferimento dopo un tempo ben preciso.

Grazie dell'attenzione

emanuele.croci
Inserita: (modificato)

OK, adesso ho capito sia il grafico che il problema....

Secondo me, se i 2 riferimenti ti arrivano istante per istante (non sai prima come si muoveranno) l'unica possibilità logica è fare la media pesata, che tra l'altro ti garantisce

- di non avere punti di discontinuità nel passaggio

- di compierlo sempre nel tempo specificato

- che per tutto il tempo dell'avvicinamento sei sempre compreso tra P ed A, cioè Y è sempre PIU' VICINO ad A di quanto non sia P

Se potessi avere delle informazioni in anticipo sarebbe diverso.... il top sarebbe conoscere già all'inizio P(0) e A(5), allora tiri una bella retta e sei a posto, o magari anche qualche altra info "sul futuro" delle funzioni P ed A potrebbe essere utile.

Ciao, Emanuele

Modificato: da emanuele.croci
Inserita:

ciao,

il top sarebbe conoscere già all'inizio P(0) e A(5), allora tiri una bella retta e sei a posto,

Gia', gia' e' quello che voleva il mio capo ma purtroppo non sappiamo quanto valgono P(0) e A(5)...

Mah.. forse potrei filtrare il segnale viola in modo da migliorare l'arrivo su A(5) che puo' essere un po' "spigoloso" ma non credo sia necessario.

Grazie dell'aiuto :lol:

Inserita:

Ciao Birkof

Prova a dire la mia.

Io farei cosi:

Nel istante ben preciso nel quale vuoi commutare la traiettoria fai una fotografia del valore della grandezza [A], e della grandezza [P]

in pratica campioni il valore della grandezza [A]e della Grandezza [P], rilevi perciò la Differenza Albebrica.

Specifichi il Tempo con cui vuoi raccordarti.

Interpoli Linearmente i 2 Punti (Retta) o in altra maniera (Polinomio o Spline).

Bene sin qui non ci sono problemi, se la grandezza [P] varia nel Tempo fisso che tu hai specificato, allora

devi fissarti degli Step di Tempo (Precisi) Step_t supponiamo 10 o più.

Ad ogni incremento dello Step Temporale, procedi come prima

Fotografi la Posizione di [A] e di [P], Interpoli i due punti come prima, però ora

il Tempo di raccordo sarà t_Restante := T_Raccordo - (Step_t * N°Passo).

In Questa Maniera arrivi al punto di Raccordo con la Grandezza [P] nel Tempo che tu hai Specificato.

E' chiaro che il tuo algoritmo devrà essere elaborato in N Passi, e non una volta sono nell' istante

che tu hai specificato.

Infatti non possiamo sapere l'andamento a priori della Grandezza [P], perciò devi eseguire

una elaborazione temporale.

Alla fin fine non ti sembra che l' algoritmo assomiglia tanto ad una Rampa a Tempo costante, con qualche leggera differenza.

Se tu Generalizzi il processo troverai la funzione Y := f[T_raccordo,t]+Ao che io ti ho descritto.

Inserita:

Grazie Henon,

mi hai fatto capire una cosa!

Provo a estendere quanto detto da Emanuele con quello che dici tu.

La media di Emanuele non e' altro che un'interpolazione lineare, infatti y(i)=P*(N-i)/N + A*i/N e' uguale a quella lineare che hai consigliato tu ovvero y(i) = P - i*(P-A)/N (basta farsi i conti..). Effettivamente, cambiando la formula di interpolazione, posso cambiare la curva di raccordo e ottenerne una piu' dolce. Es. potrei usare un'interpolazione con un esponenziale o un polinomio di vario genere (interpolazione spline).

Mi faccio un po' di conti e poi vi metto la formula per chi fosse interessato al discorso.

Grazie davvero per i suggerimenti!

emanuele.croci
Inserita:

Concordo con quanto dici.

Facci sapere!

Ciao, Emanuele

Inserita:

ciao,

alla fine ho scelto un'interpolazione con una funzione esponenziale. Per chi e' interessato, ecco la formula che ho usato.

y(i) = P + (A-P)*(1-e^(-i*Ts/tau))

dove:

P = valore di partenza. Volendo puo' anche essere variabile nel tempo

A = valore di arrivo. Volendo puo' anche essere variabile nel tempo

i = passo n-esimo di calcolo. Puo' essere ottenuto con un contatore o un qualche indice che viene incrementato ad ogni ciclo.

Ts = tempo di calcolo in (s)

tau = costante di tempo dell'esponenziale. Se il raccordo deve avvenire in T secondi, tau puo' essere calcolata come tau=T/10.

e = numero di Nepero

Volendo si puo' anche ricavare un raccordo con una curva ad "S"..Qualche tempo fa avevo trovato un tutorial in internet con tutti i conti svolti.

Grazie a tutti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...