Aiuto per interpretare uscite giroscopio

Non riesco a capire come interpretare le uscite che ottengo dal giroscopio che ho acquistato: è un giroscopio tinkerkit che sto utilizzando con lo shield tinkerkit.
Il link è questo: Arduino Official Store | Boards Shields Kits Accessories
Allo stesso link, c'è anche il codice che sto utilizzando.

Io vorrei utilizzare il giroscopio per correggere la traiettoria del mio robot e quindi cercare di capire se sta divergendo rispetto al percorso che dovrebbe fare.

Il codice di esempio mi da gli angoli pitch e roll, ma non capisco quali siano perchè muovendo il giroscopio con le mani non riesco a valutare quali valori cambiano e perchè.

Questo è un output di esempio che ottengo:

Calibration...
TinkerKit! Gyroscope [T000062-64] Test Example

Roll_Rate: -7 Roll_Angle: 357 Pitch_Rate: 21 Pitch_Angle: 10 Servo: 87
Roll_Rate: 3 Roll_Angle: 355 Pitch_Rate: 21 Pitch_Angle: 31 Servo: 85
Roll_Rate: 3 Roll_Angle: 358 Pitch_Rate: 25 Pitch_Angle: 54 Servo: 88
Roll_Rate: 3 Roll_Angle: 1 Pitch_Rate: 32 Pitch_Angle: 82 Servo: 91
Roll_Rate: 3 Roll_Angle: 4 Pitch_Rate: 32 Pitch_Angle: 114 Servo: 94
Roll_Rate: 7 Roll_Angle: 9 Pitch_Rate: 40 Pitch_Angle: 150 Servo: 99
Roll_Rate: 3 Roll_Angle: 14 Pitch_Rate: 36 Pitch_Angle: 188 Servo: 104
Roll_Rate: 3 Roll_Angle: 17 Pitch_Rate: 32 Pitch_Angle: 222 Servo: 107
Roll_Rate: 10 Roll_Angle: 23 Pitch_Rate: 18 Pitch_Angle: 247 Servo: 113
Roll_Rate: 10 Roll_Angle: 33 Pitch_Rate: 7 Pitch_Angle: 259 Servo: 123
Roll_Rate: 3 Roll_Angle: 39 Pitch_Rate: 18 Pitch_Angle: 271 Servo: 129
Roll_Rate: 3 Roll_Angle: 42 Pitch_Rate: 18 Pitch_Angle: 289 Servo: 132
Roll_Rate: 3 Roll_Angle: 45 Pitch_Rate: 14 Pitch_Angle: 305 Servo: 135
Roll_Rate: 3 Roll_Angle: 48 Pitch_Rate: 14 Pitch_Angle: 319 Servo: 138
Roll_Rate: 3 Roll_Angle: 51 Pitch_Rate: 10 Pitch_Angle: 331 Servo: 141
Roll_Rate: 3 Roll_Angle: 54 Pitch_Rate: 14 Pitch_Angle: 343 Servo: 144
Roll_Rate: 3 Roll_Angle: 57 Pitch_Rate: 10 Pitch_Angle: 355 Servo: 147
Roll_Rate: -14 Roll_Angle: 52 Pitch_Rate: 3 Pitch_Angle: 1 Servo: 142
Roll_Rate: 0 Roll_Angle: 52 Pitch_Rate: 3 Pitch_Angle: 4 Servo: 142
Roll_Rate: -3 Roll_Angle: 51 Pitch_Rate: 0 Pitch_Angle: 4 Servo: 141
Roll_Rate: 7 Roll_Angle: 53 Pitch_Rate: -3 Pitch_Angle: 3 Servo: 143
Roll_Rate: -3 Roll_Angle: 55 Pitch_Rate: 7 Pitch_Angle: 5 Servo: 145
Roll_Rate: 7 Roll_Angle: 57 Pitch_Rate: 3 Pitch_Angle: 10 Servo: 147
Roll_Rate: 10 Roll_Angle: 65 Pitch_Rate: 7 Pitch_Angle: 15 Servo: 155
Roll_Rate: 3 Roll_Angle: 71 Pitch_Rate: 10 Pitch_Angle: 23 Servo: 161
Roll_Rate: 0 Roll_Angle: 71 Pitch_Rate: 10 Pitch_Angle: 33 Servo: 161
Roll_Rate: 18 Roll_Angle: 80 Pitch_Rate: 10 Pitch_Angle: 43 Servo: 170
Roll_Rate: 7 Roll_Angle: 92 Pitch_Rate: 10 Pitch_Angle: 53 Servo: 170
Roll_Rate: 43 Roll_Angle: 117 Pitch_Rate: 95 Pitch_Angle: 105 Servo: 170
Roll_Rate: 29 Roll_Angle: 153 Pitch_Rate: 84 Pitch_Angle: 194 Servo: 170
Roll_Rate: -29 Roll_Angle: 153 Pitch_Rate: -146 Pitch_Angle: 163 Servo: 170
Roll_Rate: 3 Roll_Angle: 140 Pitch_Rate: 14 Pitch_Angle: 97 Servo: 170
Roll_Rate: 3 Roll_Angle: 143 Pitch_Rate: 10 Pitch_Angle: 109 Servo: 170
Roll_Rate: 3 Roll_Angle: 146 Pitch_Rate: 10 Pitch_Angle: 119 Servo: 170
Roll_Rate: 109 Roll_Angle: 202 Pitch_Rate: 14 Pitch_Angle: 131 Servo: 170
Roll_Rate: 3 Roll_Angle: 258 Pitch_Rate: 14 Pitch_Angle: 145 Servo: 170
Roll_Rate: 3 Roll_Angle: 261 Pitch_Rate: 14 Pitch_Angle: 159 Servo: 170
Roll_Rate: 3 Roll_Angle: 264 Pitch_Rate: 14 Pitch_Angle: 173 Servo: 170
Roll_Rate: 7 Roll_Angle: 269 Pitch_Rate: 10 Pitch_Angle: 185 Servo: 170
Roll_Rate: 3 Roll_Angle: 274 Pitch_Rate: 10 Pitch_Angle: 195 Servo: 4
Roll_Rate: 7 Roll_Angle: 279 Pitch_Rate: 10 Pitch_Angle: 205 Servo: 9

Mi sapreste aiutare?

il "rate" è la velocità angolare, probabilmente in gradi al secondo.
l'angolo (a quanto pare anche quì in gradi visto che si azzera a 360) è l'angolo ricavato da questi valori, e dato che è ricavato piano piano tende ad auemntare l'errore.

Nel tuo caso non conviene usare un angolo da 0 a 360°, ma da -180 a +180°, in questo modo sai subito se sai sbandando a destra o a sinistra (il rate funziona già così, l'angolo no)

secondo me la cosa ideale è basarsi sul rate, è meno preciso perchè non ricorda l'errore dalla traiettoria accumulato, ma non ricoda nemmeno l'errore del sensore :slight_smile:

un metodo "ideale" sarebbe ottenere il vettore spostamento tra una lettura e l'altra (dato da angolo rispetto alla partenza e l'arrivo e spazio percorso tra una lettura e l'altra), sommare i vettori spostamento, e calcolare il prossimo vettore spostamento da seguire, purtoppo per via dell'accumulo dell'errore del sensore questo metodo è molto facile che sbagli, sopratutto nel lungo periodo. nel tuo caso sarebbe stato meglio un sensore magnetometro (bussola) per ricavare gli angoli, e un sesore encorder ottico (lo stesso del mouse, per intenderci, anzi alcuni usano proprio quelli) per capire lo spazio percorso. forse addirittura il sensore del mouse da solo puù funzionare.

come ben sai però non funziona bene su tutte le superfici...

Ti ringrazio per la delucidazione!

Uso già degli encoder per rilevare la velocità e lo spazio percorso dal robot ed intendevo utilizzare il giroscopio per compensare i dati sulla traiettoria, ma visto la presenza dell'errore, mi sa che opto direttamente per un bussola.

Questa mi sembra carina: http://www.robot-italy.com/product_info.php?products_id=91

Mi chiedevo, però, se potesse risentire della vicinanza ai motori e quindi avere errori nella lettura.
(Uso dei motori da 1kW, quindi sono grossi).

Che ne pensi?

sì, i motori molto probabilmente romperanno le balle, ma puoi creare una gabbia di faraday per "intrappolare" il campo elettrico e magnetico che generano.

per il magnetometro questo costa molto meno e viene usato sui quadricotteri, quindi vai tranqiullo che funziona bene, e tra l'altro cìè pure l'esempio di codice arduino già fatto :slight_smile: http://www.robot-italy.com/product_info.php?cPath=15_139&products_id=2033

spero che tu te la cava in geometria e matematica, altrimenti può essere complicato scrivere le formule per quello che ti serve fare.

Se la tua macchina fa delle curve molto veloci potresti tenere anche il giroscopio, dato che i magnetometri sono lenti (160 letture al secondo contro le migliaia di un buon giroscopio economico come gli ITG3200)

ah, dimenticavo, a meno che la tua macchina non sia sempre in piano, devi usare anche un accelerometro e quindi conviene passare direttamente all'uso di una IMU (a 9 assi: 3 di giroscopio, 3 di accelerometro e 3 di magnetometro), si trovano buone sui 60/70€

Purtroppo, la mia macchina non è quasi mai in piano perchè dovrebbe muoversi su terreni sconnessi.

Pensavo di utilizzare solo la bussola prendendo in considerazione la direzione che mi darebbe in uscita e andando a variare di conseguenza la direzione agendo direttamente sui motori.

Fortunatamente, non ho problemi con geometria e matematica :slight_smile:

Speravo comunque di cavarmela solo con la bussola (schermandola a dovere), non mi serve avere una frequenza di campionamento particolare dato che la macchina è abbastanza lenta e quindi le 160 letture al secondo sono anche molte.

Dici di andare direttamente su una IMU quindi?

NON devi schermare la bussola, se no non vede più il nord magnetico, devi schermare motori, esc, e forse anche i cavi dove passa la potenza per i motori.

dipende quanto sconnesso. se parliamo di 3 o 4° di pendenza, non c'è problema... ma a questo punto un ottimo consiglio:

prima di tutto fatti la matematica dei vettori considerando l'uso di una bussola (e dei bit di precisione che intendi usare, più precisione = letture più lente)

poi posta le formule, io PROVO a controllarle, e sarebbero molto utili a chi deve fare un lavoro del genere. Usare una IMU è molto più complicato, certo potresti "rubare" del codice dai multicotteri, ma a questo punto devi saperne di C :slight_smile:

Mmh, guarda, io al momento uso Arduino come udp client per inviare esclusivamente i dati letti dai sensori ad una scheda su cui gira Ubuntu e c'è un applicativo in C che si occupa di ricevere ed elaborare i dati.

Quindi, comunque, effettuo tutta la matematica di controllo direttamente in C anche perchè in Arduino mi sto trovando un pò impacciato perchè anche se è molto simile al C, alcune cose non riesco a farle.
(ad esempio, ora sto avendo dei problemi ad appendere un valore float ad una stringa prima di inviare sulla rete)

Comunque, provo a definire bene la geometria del veicolo in base anche alle sollecitazioni che potrebbe avere e capire cosa mi serve esattamente.
Ovviamente, posto tutto sul forum di volta in volta :slight_smile:

P.S. Si scusami, se schermo la bussola, non funziona più! XD