Go Down

Topic: Progetto quadricottero - Problema Sensori/Controllo motori. (Read 10577 times) previous topic - next topic

lestofante

Quote
cosa centra java con l'arduino? O.o

java legge i dati che arduino invia via seriale, che sono i datio dei sensori.

poi mette i dati nell'algoritmo DCM e ne estrae il quaternione di rotazione

a questo punto c'è un interfaccia grafica che usa il motore grafico per giochi Ardord3D che in pratica mostra 4 terne degli assi, una rappresenta il valore normalizzato dall'accelerometro, una dal magnetometro (che se non hai vedrai ferma), una del giroscopio (che spostando un commento può mostrare sia una semplice integrazione dei valori, che il dato senza integrazione), ed infine quella del quaternione.

Questo è moooolto utile per assicurarsi che tutti i dati dei sensori siano immessi in modo concorde nella DCM, non solo tra loro ma anche secondo la DCM.

Una volta che hai trovato quali assi scambiare o invertire di segno per ogni sensore in modo che siano concordi, puoi prendere il codice C della DCM e "spararla" su arduino, e volendo modificare il codice java per printare la DCM calcolata facendo tutto a bordo dell'arduino. Anzi forse il codice c'è già, perchè ricordo che ero riscito a fare che arduino calcolava la correzzione e la inviava ai motori, e ogni tot (50Hz se non ricordo male) inviava il quaternione al PC che lo visualizzava a video.

Quindi avevo il quad libero di oscillare su di un asse che si auto-equilibrava, e i dati dell'inclinazione inviatai al PC. Volendo a quel punto sarebbe bastato leggere la reale inclinazione usando dei sensori di distanza e controllare i valori del Quaternione rispetto alla Realtà...
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

darksns




Code: [Select]

void pid(){
 
  agg_acc();
  tempo_prima = tempo;   
  tempo = millis();
  float intervallo = tempo - tempo_prima;     
 
  P = ax * kP;                                         
  I = I + intervallo * kI * P;                               
  D = kD * ( ax - ax_precedente ) / intervallo;   
 
  PID = P + I + D;                                             
 
  if( PID >= 255/2 ) PID = 255/2;                           
  if( PID <= -255/2 ) PID = -255/2;                         

  ax_precedente=ax;
 
  if(PID <= 2 && PID > 0) PID = 0;                           
  if(PID >= -2 && PID < 0) PID = 0;                               
   
}



Questo non è un pid.


come non è un pid?   :smiley-eek:

Per lesto: grazie mille per le mille spiegazioni che mi stai dando! ho trovato un tuo post dove parli del dcm.. sto leggendo quello che hai scritto. Ti tengo aggiornato. :)

astrobeed


come non è un pid?   :smiley-eek:


Assomiglia ad un pid, ma non lo è, in rete trovi molta documentazione in merito all'argomento, ti consiglio caldamente di studiarla.
Questa è solo la punta dell'iceberg per quanto riguarda la gestione di un quadri, se non sai nemmeno implementare un pid mi dici come farai con il kalman e/o dcm ?



Scientia potentia est

darksns

#18
Apr 24, 2013, 08:56 pm Last Edit: Apr 24, 2013, 09:06 pm by darksns Reason: 1
io sono dell'idea che si può imparare.

ah comunque per precisare questo è stato preso basandomi sulle spiegazioni trovate in internet! [fonte wikipedia.org]

astrobeed


io sono dell'idea che si può imparare.


Sicuramente si, però questa è una cosa che è più grossa di te, non hai le basi matematiche per poterla affrontare, un conto è prendere un qualcosa di pronto e adattarlo per le proprie esigenze, un conto è dire voglio fare tutto io da zero, per giunta con poco tempo a disposizione.

Quote

ah comunque per precisare questo è stato preso basandomi sulle spiegazioni trovate in internet! [fonte wikipedia.org]


E da quando wikipedia è una fonte attendibile che può sostituire un vero libro di testo ?
L'argomento pid è molto complesso, non a caso esistono centinaia di testi dedicati all'argomento, hai solo sfiorato la problematica del pid, la formula "kp*P+kd*D+ki*I" è solo la forma generica per descrivere l'algoritmo, quella applicativa è decisamente più complessa e va determinata caso per caso considerando anche le implicazioni dovute alle leggi fisiche in gioco.
P.e. una cosa che non hai capito del pid è che non fornisce direttamente il valore di controllo per l'attuatore, fornisce solo la sua compensazione.

Scientia potentia est

lestofante


Sicuramente si, però questa è una cosa che è più grossa di te, non hai le basi matematiche per poterla affrontare, un conto è prendere un qualcosa di pronto e adattarlo per le proprie esigenze, un conto è dire voglio fare tutto io da zero, per giunta con poco tempo a disposizione.


sacrosanta verità
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

darksns

#21
Apr 26, 2013, 10:30 am Last Edit: Apr 26, 2013, 10:33 am by darksns Reason: 1
si hai ragione. non ho le basi e certamente neanche il tempo.
Conta che io vengo da un professionale.. se gli porto un arduino che accende un led sono già contenti. ( in confronto a quello che mi hanno insegnato è già tanto accendere e spegnere un led. )

Quello che intendevo "da zero" era che non volevo portargli un quadricottero con un scheda kk o altri simili che basta attaccargli i fili e vola. Intendevo  che mi sono preso la briga di crearmi una configurazione con tutti i vari pezzi ( motori ,esc, radiocomando ecc ), aver imparato a programmare un minimo di arduino, e aver fatto un minimo di programma.
Non riuscirò mai a fare da 0 un filtro kalman, per esempio, non ne sarei capace e non saprei neanche da dove iniziare.
Ma il fatto di prendere il filtro già fatto ma leggerlo, cercare di capire cosa fa e imparare ad adattarlo nel mio progetto per me è già qualcosa.

Spero di essermi spiegato abbastanza bene. Io vi ringrazio già tanto per il tempo che avete perso con me.

Comunque avrei una domanda.. ho trovato un vecchio topic di un'altro utente che vi ha scritto per i miei stessi problemi quindi , per non farvi ripetere sempre le stesse cose, sto seguendo quel topic. :) (mi riferisco a questo : http://arduino.cc/forum/index.php/topic,73541.1290.html )

Seguendo quel topic c'è una guida che spiega bene il pid ( suggerita anche da astrobeed ).
da quello che ho capito il pid calcola il valore che conpensa l'errore quindi se io ho il quadricottero che va a velocità 50 ma ad un certo punto pende verso destra, il pid calcola la compensazione all'errore e questo valore dovrò sommarlo a 50, che è la velocità, e inviare la nuova velocità maggiore hai motori di destra. è giusto questo ragionamento?  :smiley-slim:

la formula per calcolare il pid sarebbe :

P=Kp*Errore
I=I+Ki*Errore
D=Kd* ( Errore di prima - Errore )/Delta Tempo

PID=P+I+D

lestofante

in realtà con un mese di tempo fai fatica anche a collaudare e settare bene un sistema già pronto come la KK o simili.. ma male che vada puoi portare qualcosa
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

darksns


in realtà con un mese di tempo fai fatica anche a collaudare e settare bene un sistema già pronto come la KK o simili.. ma male che vada puoi portare qualcosa


bhe io cercherò di mettercela tutta. ;)
comunque il codice per il pid può andare così?

lestofante

per andare va, quasi tutti usano quell'implementazione, per quanto imperfetta possa essere
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

darksns


per andare va, quasi tutti usano quell'implementazione, per quanto imperfetta possa essere


Imperfetta? Come mai?

lestofante


L'argomento pid è molto complesso, non a caso esistono centinaia di testi dedicati all'argomento, hai solo sfiorato la problematica del pid, la formula "kp*P+kd*D+ki*I" è solo la forma generica per descrivere l'algoritmo, quella applicativa è decisamente più complessa e va determinata caso per caso considerando anche le implicazioni dovute alle leggi fisiche in gioco.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

darksns



L'argomento pid è molto complesso, non a caso esistono centinaia di testi dedicati all'argomento, hai solo sfiorato la problematica del pid, la formula "kp*P+kd*D+ki*I" è solo la forma generica per descrivere l'algoritmo, quella applicativa è decisamente più complessa e va determinata caso per caso considerando anche le implicazioni dovute alle leggi fisiche in gioco.



Scusa ma non ho ancora capito il punto.. cosa sarebbe "sbagliato"?

ratto93

Non è sbagliata, è che è troppo approssimativa e grossolana, come ti spiegheranno meglio Astro e Lesto che sono decisamente più esperti di me...
Se corri veloce come un fulmine, ti schianterai come un tuono.


Go Up