Go Down

Topic: [Robotica] GyroNav, sensore assetto e orientamento (Read 8492 times) previous topic - next topic

astrobeed

Feb 27, 2017, 05:20 pm Last Edit: Feb 28, 2017, 10:09 am by astrobeed
GyroNav è un sensore assoluto che permette di ottenere in modo preciso i valori di Pitch e Roll, rispetto ad un piano in bolla, e l'orientamento rispetto al Nord magnetico, se si inserisce il valore locale della declinazione magnetica si ottiene l'orientamento rispetto al Nord geografico.
Il progetto è composto da un Arduino Pro Mini, va bene qualunque altro modello di Arduino 8 bit, una coppia di sensori MPU6050 e HMC5883L oppure un singolo MPU9150( MPU6050 + magnetometro dentro lo stesso chip).
La scelta degli MPUxxxx è obbligatoria in quanto viene sfruttato il loro DMP (Digital Motion Processor) per tutta la parte di calcoli inerenti la IMU, implementa un Kalman, e non solo quello, in grado di fare oltre 100 cicli di calcolo al secondo, senza impegnare tempo CPU di Arduino, che comunque non è assolutamente in grado di gestire la mole di calcoli, tutti in virgola mobile a 64 bit (double), per gestire in modo ottimale una IMU 6 d.o.f. (accelerometro 3 assi e giroscopio 3 assi).
In pratica Arduino provvede al calcolo dell'orientamento, rispetto al Nord magnetico, partendo dalle letture raw del magnetometro a triplo asse ed esegue una compensazione del valore calcolato in base all'inclinazione sul Pitch e Roll, questo perché se il magnetometro non si trova perfettamente in bolla la lettura dell'orientamento varia notevolmente, molti gradi, in funzione dell'inclinazione.
Come dati forniti, tramite porta seriale, volendo anche tramite SPI, non ancora implementato, abbiamo i valori del Pitch e Roll, in gradi con risoluzione al decimo di grado, e dell'orientamento, in gradi con risoluzione al singolo grado.
Tramite il file config.h è possibile modificare il formato dati in uscita tra quattro diverse modalità, attivare/disattivare i messaggi per il debug sul monitor seriale, inserire il valore locale della declinazione magnetica, quest'ultimo prossimamente sarà inserito in EEPROM e modificabile tramite comando sulla seriale, invertire il verso di rotazione dell'orientamento, quest'ultimo dipende da come si montano fisicamente i sensori.
Trovate lo sketch per Arduino, una GUI di test per Processing, alcune foto e una illustrazione dei collegamenti tra Arduino e i sensori su github, link sotto, lo sketch è molto commentato e l'intestazione contiene molte informazioni importanti sul codice.

Repository github

Screenshot GUI per Processing



Il tutto montato su mille fori e inserito in un box su misura 3D printed.







Scientia potentia est

gpb01

Grazie Astro, non è il mio settore e quindi ... c'è sicuramente da imparare :D

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita

my name is IGOR, not AIGOR

menniti

Complimenti, anche se non ho capito niente  :o
Comunque, MOD, i progetti completi li abbiamo sempre messi in MEGATOPIC, temo che qui, considerata la fortissima specificità del lavoro, sarà in breve tempo sommerso da qualche centinaio di nuovi Topic.
Vallo a trovare quando decideremo di costruire il nostro drone per andare a controllare se gli utenti mettono mano all'impianto elettrico di casa e bannarli sulla base dell'art. 15 del Regolamento.  :smiley-mr-green:
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

gpb01

Comunque, MOD, i progetti completi li abbiamo sempre messi in MEGATOPIC ....
Si, mi sembra un bel progetto degno del "megatopic "... sposto :D

Guglielmo

P.S.: In "Generale" lascio comunque un link permanente al thread in Megatopic ... così anche dall'area "Generale" ci si arriva.
Search is Your friend ... or I am Your enemy !

brunello22

#5
Feb 27, 2017, 08:41 pm Last Edit: Feb 27, 2017, 08:47 pm by Brunello
+1

Mannaggia, mi manca il magnetometro

EDIT:

Quote
MPU9050( MPU6050 + magnetometro dentro lo stesso chip).
intendevi dire MPU9250 ?
"C' è chi legge Guerra & Pace e non ci capisce un tubo vuoto; c'è chi legge l'etichetta delle patatine fritte e ci trova la spiegazione del mondo"

doppiozero

Io aspetto la nuova versione con la sensorFusion visto che ho sempre voluto provarci ma non ho mai trovato tempo e voglia di studiarla  :D

La sensorFusion non viene gestita dal DMP giusto Astro?
"Doc, ma che diavolo è un Gigowatt? "

astrobeed

EDIT:
intendevi dire MPU9250 ?
In realtà MPU9150, il 9250 è la stessa cosa però monta un magnetometro migliore, però per il 9250 non ho tutte informazioni per utilizzare il suo magnetometro, dovrebbero arrivarmi a breve e sicuramente prevederò nel codice sia il 9150 che il 9250.
Attualmente è facile trovare schede IMU per droni che montano il 6050 più l'HMC5883L, spesso abbinati ad un barometro, per meno di 20 Euro, vanno benissimo al posto delle breakout singole con sopra il magnetometro e
l'MPU6050 che ho usato io per il prototipo.

Ho corretto il post inziale con la giusta sigla del MPU.
Scientia potentia est

astrobeed

Io aspetto la nuova versione con la sensorFusion visto che ho sempre voluto provarci ma non ho mai trovato tempo e voglia di studiarla  :D
La sensor fusion è già implementata, per la IMU, accelerometro e gyro, ci pensa il DMP e la fa molto, ma molto, bene, tra IMU e magnetometro la fa il codice, in particolare viene usata questa formulazione per ottenere l'orientamento e la compensazione con pan e tilt, la formula è riportata anche all'interno del codice nei commenti.

Code: [Select]
Yh = XM * sin(Roll) * sin(Pitch) + YM * cos(Roll) - ZM * sin(Roll) * cos(Pitch)
Xh = XM * cos(Pitch) + ZM * sin(Pitch)
Heading = arctan(Yh/Xh)

XM, YM, ZM sono le letture raw dei tre assi del magnetometro.
Roll e Pitch sono i valori, in radianti, delle inclinazioni sugli assi X e Y misurate dalla IMU


Quello che voglio aggiungere in una prossima versione è una ulteriore fusione tra la misura del Yaw (rotazione) fornita dalla IMU con l'orientamento compensato, questo per aumentare la stabilità e la risoluzione, non la precisione perché dipende dal magnetometro e con l'HMC5883L siamo attorno ai 2°.
Domani, se trovo il tempo, faccio un breve video del tutto in funzione.
Scientia potentia est

astrobeed

#9
Feb 27, 2017, 09:11 pm Last Edit: Feb 27, 2017, 09:11 pm by astrobeed
Vallo a trovare quando decideremo di costruire il nostro drone
Questo progetto non è pensato per l'uso su i droni, serve come sensore di orientamento su un robot mobile, in pratica permette di dirigersi in modo abbastanza preciso verso una direzione, abbinato ad un sistema di misura della distanza percorsa, può bastare un encoder a media risoluzione, permette di spostarsi attraverso dei waypoint tramite coordinate polari, vettore (distanza) e angolo.

Esempio pratico di installazione del sensore su un robot, si trova nel case giallo posto sul supporto, è importante tenere il magnetometro lontano dai motori per evitare interferenze magnetiche.


Scientia potentia est

doppiozero

Si scusa, intendevo la sensorFusion per compensare la deriva dello yaw  :)

Anche la compensazione usando il pitch e il roll non la conoscevo

+1
"Doc, ma che diavolo è un Gigowatt? "

astrobeed

#11
Feb 27, 2017, 09:20 pm Last Edit: Feb 27, 2017, 09:20 pm by astrobeed
Mi sono scordato di allegarlo al primo post, questo è lo schema di cablaggio, fatto con Fritzing che per queste cose si presta molto bene, tra la Pro mini e i sensori, attenzione che sia l'MPU che l'HMC lavorano a 3.3V, idem il bus I2C, pertanto se sulla breakout del MPU non è presente un regolatore a 3.3V e le resistenze di pull up collegate al 3.3 V è necessario prevederli esterni.
Lo schema di cablaggio è presente anche nel download da github, si trova nella cartella hardware.



Scientia potentia est

alessanddrob

Mi piace ,ho una domanda , ma come si fa a calcolare l'offset dell'MPU senza un piano realmente tarato , nel senso, io anche nel mio progetto ho inserito una funzione di calibrazione che richiamo con un pulsante , lei calcola tutto , la inserisce in memoria e a successivo riavvio ho gli offset calcolati.
Adesso la mia domanda . Ma che piano usate per essere precisi :(
Il prossimo test lo faccio con un secchio di acqua, un pezzo di polistirolo che galleggia , e sopra il mio sensore che ho inserito in un pezzo di nylon 10x10x2 , aspetto che si calmino le acque e provo a vedere se riesco ad avere un piano

dally

Ho visto che hai inserito la media mobile.
Molto golosa questa cosa =)

astrobeed

Mi piace ,ho una domanda , ma come si fa a calcolare l'offset dell'MPU senza un piano realmente tarato
Gli MPU6050 e MPU9x50 arrivano già calibrati, non è necessaria una ulteriore calibrazione, è una delle loro caratteristiche principali, inoltre sono in grado di autoricalibrarsi da soli a run time, però è necessario caricare un apposito codice sul DMP per questa funzionalità dato i che registri che contengono i valori di calibrazione non sono accessibili da bus I2C.
Unica accortezza è non muovere il sensore durante l'avvio, circa 1 secondo tenuto conto del tempo per caricare il codice del DMP, in questa fase viene rilevato lo zero per i tre giroscopi, non ha importanza se il sensore non è perfettamente in bolla.
Quello che richiede una calibrazione, se si vuole ottenere la massima precisione possibile, è il magnetometro, però ho verificato che anche lavorando con i valori di default la precisione è accettabile per la destinazione d'uso di questo progetto, a breve rilascerò una GUI, sempre scritta con Processing, che permette la calibrazione del magnetometro e ne memorizza i relativi valori in EEPROM.
Da notare che il sorgente del codice da caricare sul DMP non è open source, invensense ha reso pubblico solo il binario, sotto forma di listato numeri esadecimali, del codice da caricare, va fatto ogni volta che si alimenta l'MPU in quanto non possiede una flash interna, solo ram.
Scientia potentia est

Go Up