Archivi tag: mpu6050

Classe sensor.py pronta

Dopo alcune attivita’ collaterali (costruirmi il nuovo tavolo da lavoro in garage per ospitare le prossime prove) ho completato i test sull’IMU e creato l’oggetto sensor che puo lavorare in un thread paralllelo in  modo da poter avere a disposizione le informazioni aggiornate del sensore(ogni 5-8 ms).
E’ possibile scaricare l’esempio  sensor_test .Lanciandolo si puo’ vedere sul terminale i valori attuali di roll,pitch eyaw.

I dati messi a disposizione dalla classe sono: posizione  angolare [deg],velocita’ angulare[deg/sec], accelerazione lineare[m/sec]

Le principali modifiche rispetto al precedente IMU_test sono:

  • Ho notato che l’inizializzazione di alcuni parametri del mpu6050 puo fallire. L’ordine con cui si inizializza i dati ne influenza la riuscita. Pertanto ho aggiunto una funzione che verifica la corretta inizializzazione del sensore.
  • Il vettore accelerazione e’ stato normalizzato e scalato in modo che la risultante quando fermo sia uguale alla gravitaì .Questo puo’  aiutare se si vuole integrare l’acccelerazione per stimare velocita’ lineare e movimento lineare.
  • l’oggetto sensor.py puo’ lavorare in un thread in parallelo.
  • minori modifiche fatte sui nomi delle variabili.

Prossimi passi:

  • Comprare alcuni connettori e predisporre un collegamento definitivo per il sensore e i motori
  • montare il sensore sulla struttura con i motori in funzione e verificare se occorre utilizzare sul sensore dei filtri piu severi.

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.

Tutorial: come leggere i dati dal IMU

Nel precedente post ho descritto come settare raspberry pi per la connessione col sensore IMU.

Ora e’ tempo di vedere come leggere dati dal sensore.

Prima di tutto e’ necessario il sw che gestisca l’interfaccia i2c.Si possono trovare diversi esempi. Di seguito ne trovi uno : adafruit_i2c.py da github.

Quindi e’ necessario definire un codice specifico per il proprio sensore , nel mio caso un MPU6050.

Ho cercato per diversi giorni di scrivere il mio codice incontrando un problema di inconsistenza sui dati:anche tenendo il sensore fermo ricevevo dei risultati sempre differenti.Sospetto fosse un problema di formattazione dei dati.

Alla fine , grazie al grande lavoro di Hove nel suo blog, ho utilizzato il suo codice code e sono ora in grado di ricevere dati correttamente dal sensore.

Ho fatto alcune minime modifiche e preparato questo IMU_test file.

Cosi ho iniziato alcuni test preliminare per verificare il comportamento del sensore.

Ho montato il sensore su una barra orizzontalmente,quindi ho fatto ruotare la barra di una quantita’ ( 13 gradi, misurata con la bolla dello smartphone); infine l ho riposto orizzontale.

IMU_test1

Ho registrato su di un file i dati: accelerazione lungo gli assi (da ACCelerometro) e la velocita’ angolare(dal GYROscopio). Su di un foglio excel ho calcolato l’angolo sia rispetto ACC che il GYRO:

  • rx ACC=DEGREES(ATAN2(accZ+9.8;accY))
  • rx(i) GYRO=wx(i) *dt+wx(i-1)

Sotto trovi il grafico risultante.

IMU

Ho sottolineato in figura i due tipici problemi sul IMU :

  • lo slittamento del Gyro (puoi vedere un angolo che da 1 grado deriva mentre dovrebbe essere uguale a 0)
  • la sensibilita’ al rumore dell’ Accelerometro.

Quindi il prossimo passo dello sviluppo e’ cercare di ridurre questi due problemi cercando di filtrare e combinare i risultati dai due tipi di sensori.