Archivi tag: filtro complementare

Alfa1test .Primi risultati

Dopo diversi rinvii sono finalmente riuscito a tesate il codice  alfa1    test.

Come da programma ho inizialmente verificato di riuscire a pilotare il motore.

Dopo la fase startup (premere enter quando richiesto), una semplice interfaccia grafica mi permette di visualizzare i valori corenti di roll , pitch e yaw  e di poter aumentare (tasto a) e dimimuire (tasto z)  la velocita’ del motore.

Posso inoltre salvare una velocita’ di hover (tasto n) e di poterla richiare (tasto h).

Per il particolare settaggio riportato in figura, la velocita’ di hover per il singolo motore che alza la struttura e’ di 15/17 %.

alfa1

Di seguito alcune note pratiche:

  • Per un motore che ruota in senso orario (gaurdando da sopra)  occorre montare una elica destra.
  • Rispetto alle prime prove effettuate ho verificato che e’ possibile utilizzare una sequenza semplificata per l’avviamento dell’ESC (e del motore) , per cui e’ possibile lasciare esc in potenza e poi avviare l’invio degli impulsi. Ricordo che le prove descritte sono valide solo per il mio specifico set di hardware. Prudenza sempre!
  • Mettere sempre dado e controdado.Le vibrazioni del motore sono tali da far svitare un dado solo, qualunche sia la forza che riesci a appore.

Il sensore attualmente registra ad ogni ciclo su file i seguenti dati: tempo totale, tempo ciclo dt, r,p,y calcolati con il filtro complementare, r_rate,p_rate,y_rate, del giroscopio e x_acc,y_acc,z_acc dell’accelerometro.

Se ora analizziamoi  dati registrati, la prima cosa che salta all’occhio e’ che il periodo di campionamento aumenta linearmente con il tempo:

alfa1_dt

In questo esempio, passa dai circa  8ms dei primi istanti ai  12ms  dopo 2 minuti.

Le possibili cause sono:

  • un baco nel sw sulla misurazion del dt. Ad una prima analisi mi sento di escluderlo.
  • un ritardo che diviene proporzionale al log che sto creando.Un semplice test mi potra’ dare conferma di questo: sara’ sufficiente scrivere, per eesempio, 3 volte i dati di log ad ogni ciclo e dovrei vedere che la variazione di dt sara’ 3 volte piu veloce.
  • un problema sul sensore. Potrebbe essere che richiedo i dati con una frequenza eccessiva? Questa possibilita’ la analizzaro’ solo se la seconda ipotesi da esito negativo.

Analizzando invece l’andamento del roll , di seguito due casi in cui il motore girava alla stessa velocita’, ma  con il filtro passa basso interno del sensore a diversi valori.

In questo caso si vede il roll calcolato con un filtro DLPF = 40Hz : ( in cui il valore oscilla fra 8 e 13 gradi)

alfa1_roll_DLPF_40Hz

In questo secondo caso con il filtro DLPF: 10 Hz: (in cui il valore oscilla di qualche decimo di grado)

alfa1_roll_DLPF_10Hz

L’ultimo confronto e’ l’analisi dei dati di roll ottenuti dal giroscopio, dal accelerometro e dal filtro complementare:

alfa1_roll_tau0_005

Come si puo’ notare il roll ottenuto con il filtro complementare (in grigio) oscilla ancora notevolmente. Questo grafico e’ stato ottenuto utilizzando una costante di tempo tau  pari a 0,005s.

Lo stesso log invece con una costante di tempo di 0,2 s  si presenta in questo modo:

alfa1_roll_tau0_2

Si puo’ vedere come il roll del filtro complementare e’  in queto caso meno affetto da disturbi.

Per periodi inferiori a 0,2 secondi, il valore del giroscopio e’ predominante (eliminando quindi le vibrazioni classiche dell’accelerometro) , mentre per periodi superiori a 0,2 s il valore dell’accelerometro e ‘ predominante, eliminando cosi’ l’effetto di drift (deriva) tipico del giroscopio.

In conclusione per i prossimi test utilizzaro’  DLPF=10 HZ con un  tau=0,2 (sono i valori gia settati nel codice).

Come combinare i dati del giroscopio e dell’accelerometro

Ok,quindi dopo alcuni esperimenti sui differenti approcci sul filtraggio dei dati, ora sono interessato su come mischiare i dati del GYRO e del ACC in modo da ottenere dati ottimizzati.

Come sempre,anche questa volta ho trovato un articolo molto interessante che descrive esattamente questo approccio: kalman filter vs complementary filter.

Qui e’ possibile trovare come impelemtare 2 tipi di filtri complementari e il filtro di  kalman.Se siete interessati al filtro di kalman in particolare ,allora e’ fortemente consigliata la lettura dato che spiega come impelmentarlo in maniera molto semplice. Devo avvisarvi che e’ scritto per arduino , non in python, ma non credo che ci possa allarmare.

Personalmente ho solo implementato il filtro complementare di primo ordine e gia cosi mi ritengo soddisfatto.

IMU_Fusion1

In figura potete vedere il confronto fra l’angolo calcolato dal giroscopio, dal acc,  col filtro complementare e anche col filtro complementare a cui ho passato i dati dell acc in precedenza filtrati con kalman.

Si puo notare a destra come la deriva del gyro sia molto evidente (linea blu) sia compeltamente assente nel dato del angolo con filtro complementare.

IMU_Fusion2

Questa invece e’ l’ingrandimento dell’area di sinistra dove era moloto evidente il rumore del acc. Di nuovo il filtro complementare arrotonda sufficientemente bene il valore..

Quindi in conclusione ho deciso di affidarmi nel mio quadricottero ai dati derivanti dal sensore filtrati con il filtro complementare.

Questo e’ lesempio in cui ancora ci sono inclusi tutti i filtri da me testati: IMU_Test3.

Nota che il filtro compelmentare e’ incluso direttamente nel file imu_test.py code in getAngleCompl() .

Posso quindi considerare questa fase di sviluppo quasi conclusa.Voglio solo creare una classe sensor che possa girare in un thread  in parallelo in modo da potere mostrare sempre i dati sul monitor.

Dopo di che si parte con i test sul PID.