Pages: 1 [2] 3   Go Down
Author Topic: Aiuto sviluppo codice per roving self balancing  (Read 2104 times)
0 Members and 1 Guest are viewing this topic.
0
Online Online
Shannon Member
****
Karma: 132
Posts: 10495
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Ciao Lesto, non capisco come vorresti usare il moto circolare uniforme! Scusami ma non sono un matematico, ma con la costante di mezzo non vedo, come potrebbe tornarmi utile, dovrei mettere in relazione la velocità e la massa.

Si io sono ancora più capra e ci sta che non lo capisco, al momento mica deve girare, quindi al massimo rettilineo uniforme. Niente lo riletto ma non ci ho capito meno di zero.
lol smiley-grin guarda il robot di lato. Il pavimento inganna, e ti togle metà rotazione per ottenere un cerchio, ma si tratta comunque di moto circolare. Comunque le formule possono essere tranquillamente usate anche per girare, è tutta una questione di sistema di riferimento smiley

Tra l'altro la formula ci dice che più peso (o meglio massa) hai, più sarà grande la tua quantità di moto, quindi più tempo o forza impiegherai per frenare (o meglio cambiare il tuo stato attuale, ovvero fermo/movimento, movimento rettilineo/movimento circolare, etc..)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
lol smiley-grin guarda il robot di lato. Il pavimento inganna, e ti togle metà rotazione per ottenere un cerchio, ma si tratta comunque di moto circolare. Comunque le formule possono essere tranquillamente usate anche per girare, è tutta una questione di sistema di riferimento smiley

ahhhhhhhhhhhhhhhhh  smiley-grin, certo tu intendevi la rotazione -90 0 +90, si ok. Pero quelle formule io non le so capire, o meglio per adesso ho altro su cui sbattere le testa e c'è la sto sbattendo tanto ma tanto, tanto io la testa dura c'è lò smiley-razz.

Quote
Tra l'altro la formula ci dice che più peso (o meglio massa) hai, più sarà grande la tua quantità di moto, quindi più tempo o forza impiegherai per frenare (o meglio cambiare il tuo stato attuale, ovvero fermo/movimento, movimento rettilineo/movimento circolare, etc..)

Allora si tratta di vedere le cose da un'altro punto di vista, il tuo non mi appare (a me) lampante e semplificato come il mio. Tu lo hai visto il video, secondo te se lo sbilancia con un peso sull'anteriore non potendo recuperare mai tenderà sempre ad accellerare fino a cadere sui -90 o no che dici?.

Ciao.
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hehehe ciao Mauro, anche io avevo pensato a muovere un peso fisicamente, ma alla fine sono giunto alla conclusione che gia possiamo farlo con i motori, forse è un aggiungere complessità e peso non strettamente necessaria, ma sicuramente interessante da sperimentare  smiley-mr-green.

In questo video, a 3:22 trovate una rappresentazione grafica delle 4 fasi che vi ho descritto:


Sono d'accordo con Lesto per l'uso dell'offset, l'unica cosa è che questo offset varierà dinamicamente, devo scrivere la formula è li il problema  smiley-mr-green
Logged

Community robotica / programmazione Arduino
www.gioblu.com

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io direi di scomporre il problemone in due problemini per adesso,
1) calcolare l'offset da applicare
2) applicare l'offset calcolato
e focalizzarsi sul primo.
Come calcolare l'offset di partenza/regime/arresto?
Cosa abbiamo a disposizione per calcolare l'offset? (formule, prove empiriche, altri esempi, ecc...)
Quali variabili necessarie al calcolo dell'offset sono note o facilmente calcolabili?
ecc..
Logged

earth
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come calcolare l'offset di partenza/regime/arresto?
Cosa abbiamo a disposizione per calcolare l'offset?

Mi ricordo ancora qualcosa di fisica, voglio provare a dare il mio contributo.

L'unica formula è F=ma, ovvero la forza che viene impressa è proporzionale all'accelerazione, e sarà piccola quando non ci sarà da accelerare o da frenare, come avete detto.
Lungo la direzione del movimento abbiamo che in ogni momento la forza di gravità è pari al seno delll'inclinazione per la massa e deve essere quella a causare l'accelerazione. Ovvero la formula per l'inclinazione dovrebbe essere arcoseno(a/g), con g = 9,8 m/s^2...
Dato che si tratta di piccole inclinazioni e che l'offset è direttamente proporzionale, basta una formula approssimata, offset = k*a con k... da trovare provando  smiley-sad ma almeno credo sia l'unica formula. Dovresti solo decidere come far variare l'accelerazione lungo il percorso, in modo da non avere inclinazioni eccessive e non troppi sbalzi all'inizio e alla fine dell'accelerazione. Insomma, qualcosa di graduale all'inizio e in fondo, quando si raggiunge la velocità voluta misurata con il metodo:

Per fare cio' devo comprendere e scrivere in codice la relazione tra l'offset dell'angolo, la velocità che io determino leggendo il voltaggio ai poli del motore come nel tutorial sul robot cartesiano:
http://www.gioblu.com/tutorials/robotica/217-robot-cartesiano-e-odometria-con-arduino

Non ho ben capito come funziona  smiley-confuse ma questa è un'altra storia, se dici che misura bene la velocità va benissimo. Ho una domanda, la misura della velocità (e quindi della distanza percorsa etc etc) che ottieni con questo metodo è affidabile anche durante l'accelerazione?
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9667
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Piu' che altro ci sono tante considerazioni da fare, per esempio quando il robot va in avanti dovrà essere sempre inclinato indietro rispetto allo 0 di un angolo che varia in rapporto alla sua velocità (deve essere molto inclinato all'indietro al max per evitare di cadere in avanti)...

Questo è il limite di tutti i balancing robot che non usano sensori inerziali, il sensore assoluto di inclinazione realizzato con telemetri, non importa come sono fatti, va benissimo per le condizioni statiche, cioè robot fermo, o di marcia a bassissima velocità, non è sufficiente per farlo muovere sul serio e, sopratutto, per affrontare le pendenze, anche se molto piccole.
L'inclinazione nel senso di marcia serve per compensare la forza derivante dall'accelerazione e varia in funzione di quest'ultima, ovvero maggiore accelerazione comporta un maggiore angolo di inclinazione, una volta raggiunta la velocità di crociera l'inclinazione torna a 0.
Per determinare l'inclinazione ottimale occorre conoscere la posizione del baricentro del robot e la forza che vi agisce sopra, la prima la puoi trovare facilmente in modo sperimentale, per la seconda devi conoscere la massa del robot (basta pesarlo) e l'accelerazione, quest'ultima o la ricavi dai sensori oppure la conosci a priori perché utilizzi motori con encoder, servono quelli veri ad alta risoluzione con motori buoni, controllati da un pid fatto molto bene.
La soluzione ottimale è utilizzare motori con encoder abbinati ad un sensore inerziale ottenuto in sensor fusion dalla combinazione di un accelerometro a due assi montato inclinato sulla verticale di 45° e un giroscopio.

p.s.
Non esiste la massa statica e la massa dinamica, la massa è sempre e solamente la massa, semmai esiste la quantità di moto e la forza/momento d'inerzia, la prima dipende dalla massa e dalla velocità, la seconda dalla massa e dall'accelerazione lineare/angolare.

Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22930
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non mi intrometto per spammare ma per fare una considerazione.
Leggo:
Quote
per esempio quando il robot va in avanti dovrà essere sempre inclinato indietro

A me ciò non torna, nel senso che se quest'affermazione può essere corretta teoricamente, all'atto pratico nel mondo reale succede l'opposto, ossia per bilanciare un oggetto in movimento questo lo si piega in avanti, non indietro. Piegandolo indietro si richiede più energia sia per farlo avanzare sia per tenerlo in equilibrio dato che la gravità tende a farlo cadere, se a ciò aggiungiamo anche l'accelerazione la forza che lo spinge al ribaltamento aumenta l'effetto.

Pensate ad una persona con una pila di piatti. Finché sta ferma non ci sono problemi, ma non appena avanza questa tende a piegare la pila in avanti dato che l'inerzia unita all'accelerazione tende a piegare la pila indietro. E se non si compensa questo spostamento si sa che fine farà la pila  smiley-eek
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9667
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A me ciò non torna, nel senso che se quest'affermazione può essere corretta teoricamente, all'atto pratico nel mondo reale succede l'opposto, ossia per bilanciare un oggetto in movimento questo lo si piega in avanti, non indietro

Si è così, sicuramente Gio ha fatto, involontariamente, un pochino di confusione mentre scriveva.
Comunque attenzione a non confondere il movimento con l'accelerazione, l'inclinazione serve solo durante l'accelerazione/decelerazione, e comunque non è obbligatoria perché imposta dalla fisica, è solo un modo per sfruttare il peso in modo da compensare le forze  senza utilizzare energia aggiuntiva sul motore.
Eventualmente un pochino di inclinazione nel senso di marcia si può usare per compensare la coppia dei motori, dipende molto dalla massa del robot e dalla coppia stessa, per piccoli robot come quello in oggetto è praticamente ininfluente.
Logged

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao ragazzi, grazie a tutti per la risposta.
Astrobeed ha chiarito un punto che io consideravo diversamente. L'offset angolare che io voglio aggiungere al PID ci sarà solo in momenti di accelerazione o decelerazione.
Questo offset varierà in base alla velocità e alla massa del robot. Per frenare è fondamentale portare il robot in una postura con angolo negativo rispetto al moto, per evitare di ribaltarsi in avanti frenando e per avere un po' di margine per frenate piu repentine (per questo stavo ragionando di tenerlo sempre leggermente in negativo, cosi' da poter frenare in tempi utili in caso ci sia un ostacolo). Stessa cosa per l'accelerazione da fermo, sarà necessario un offset positivo per evitare di ribaltarsi indietro partendo.

Sono d'accordo con te Astrobeed sul sensor fusion, ho gia con successo testato il robot con la IMU main vecchia di sparkfun con un lils e un adx, facendo arco tangente di due assi dell'acc e giro tutto filtrato con kalman, e funziona decisamente meglio di quello con i sensori IR ERER. Solo che la IMU mi serve per l'aeromodello che stiamo testando in volo autonomo  smiley-mr-green e poi volevo raggiungere un bel risultato cosi' com'è per poter permettere a tutti gli appassionati di farsi un self balancing senza dover spendere 50 euro per la IMU, chiaramente con tutte le limitazioni del caso, che pero' vanno di pari passo con la complessità hardware e software.

Grazie del contributo Joomoon provo a mettermi a scriverla come hai proposto...
« Last Edit: June 27, 2011, 09:39:33 am by gbm » Logged

Community robotica / programmazione Arduino
www.gioblu.com

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9667
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo offset varierà in base alla velocità e alla massa del robot.

No, è solo in base all'accelerazione, non importa se il robot viaggia a 1 cm/s o a 10 m/s, in fase di avanzamento a velocità costante l'assetto sarà sempre verticale, o quasi se si vuole compensare la coppia sfruttando il peso.
L'inclinazione varia in modo proporzionale, con una legge seno/coseno, in funzione dell'accelerazione e del suo segno.

Quote
enare è fondamentale portare il robot in una postura con angolo negativo rispetto al moto, per evitare di ribaltarsi in avanti frenando e per avere un po' di margine per frenate piu repentine (per questo stavo ragionando di tenerlo sempre leggermente in negativo, cosi' da poter frenare in tempi utili in caso ci sia un ostacolo).

Questo è un punto dolente, dipende tutto dalla potenza disponibile, cioè i motori devono essere in grado di "ribaltare" nel senso opposto il robot in un tempo minore di quello imposto dal movimento di pendolo dovuto all'accelerazione.
Tali valori sono calcolabili e devono essere tabellati come massima accelerazione sopportabile, se vai oltre non c'è preinclinazione che tenga, il robot casca.

Quote
e poi volevo raggiungere un bel risultato cosi' com'è per poter permettere a tutti gli appassionati di farsi un self balancing senza dover spendere 50 euro per la IMU, chiaramente con tutte le limitazioni del caso, che pero' vanno di pari passo con la complessità hardware e software.

Puoi ovviare, parzialmente, alla mancanza della IMU con gli encoder sui motori, almeno sai velocità e accelerazione reali, però non aspettarti grossi risultati, sopratutto se non usi encoder ad alta risoluzione.
Però ultimamente stanno uscendo vari sensori inerziali, accelerometri e giroscopi, che costano pochi Euro, sono per uso sui cellulari, non saranno precisissimi però dovrebbero bastare per un semplice balancing robot a basso costo.
C'è anche l'estensione del Wii Mote, il motion plus, che costa abbastanza poco, mi pare meno di 20 Euro, e dentro c'è un giroscopio a tre assi su bus I2C.

Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10495
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il nunchuck contiene un'accelerometro 3 assi (ADXL330) a 9/15 euro, il motion plus un giroscopio MEMS 2(IDG600)+1(IDG650) assi sempre a 9 euro. Bus i2c, ad alta velocità, puoi modificare le impostazioni di wire.h, e (col nunchuck, il motion plus non ce l'ho) ottieni oltre 2000 letture al secondo.

Quote
Questo è un punto dolente, dipende tutto dalla potenza disponibile, cioè i motori devono essere in grado di "ribaltare" nel senso opposto il robot in un tempo minore di quello imposto dal movimento di pendolo dovuto all'accelerazione.
Tali valori sono calcolabili e devono essere tabellati come massima accelerazione sopportabile, se vai oltre non c'è preinclinazione che tenga, il robot casca.
quoto su tutta la linea. Se non erro usando gbm sta usando i servo a rotazione continua, quindi può giocare con le accelerazioni.. ciò è molto utile.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao raga!! Mi fa strapiacere ricevere cosi' tanti consigli, grandi!

Astrobeed scusami, una domanda, io userei il voltaggio presente nel circuito di alimentazione dei motori per desumere la velocità di rotazione, ho usato questo dato integrato nel tempo per desumere lo spazio percorso ed è preciso nell'ordine di un errrore di un centimetro ogni metro percorso, dici che potrebbe bastare?

Altra domanda, in rapporto alla velocità del robot, diminuirà la capacità dei motori di contrastare una eventuale caduta nella stessa direzione del moto, per questo pensavo di imporre al robot un angolo negativo rispetto alla direzione del moto. Cosi' facendo il robot ridurrà la possibilità di cadere in avanti!! A me sembra che sia un sistema che usano tutti!! Dici che non è sensato?

Appena avro' finito l'algoritmo e fatto un bel po' di video / test ed esperimenti con questo sistema, sostituiro' i due sensori ERER con la IMU, per iniziare a fare test di percorrenza su piani inclinati e percorrenza di salite discese!!  smiley-mr-green
Logged

Community robotica / programmazione Arduino
www.gioblu.com

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 134
Posts: 9667
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Astrobeed scusami, una domanda, io userei il voltaggio presente nel circuito di alimentazione dei motori per desumere la velocità di rotazione,

Si mi ricordo della cosa, però era rimasto tutto in sospeso in attesa di ulteriori prove.

Quote
Altra domanda, in rapporto alla velocità del robot, diminuirà la capacità dei motori di contrastare una eventuale caduta nella stessa direzione del moto

Ovviamente si, la coppia diminuisce in modo quasi lineare in funzione degli rpm, qui toccherebbe aprire un bel capitolo dedicato al dimensionamento del robot inteso come potenza necessaria per soddisfare i vari requisiti di marcia.

Quote
, per questo pensavo di imporre al robot un angolo negativo rispetto alla direzione del moto
. Cosi' facendo il robot ridurrà la possibilità di cadere in avanti!! A me sembra che sia un sistema che usano tutti!! Dici che non è sensato?

Se imponi un certo angolo negativo mentre marcia non è che ne trai particolari vantaggi in caso di frenata brusca, tanto se i motori non sono in grado di contrastare la decelerazione non c'è angolo preventivo che tenga, il robot casca.
Per contro un angolo negativo durante la marcia impone un superlavoro ai motori per mantenere l'equilibrio visto che ti verresti a trovare costantemente in una situazione di instabilità.

Mi stai facendo venire la voglia di rispolverare il progetto, di massima, del mio Balancing Robot fatto qualche anno fa e poi messo nel cassetto in attesa di trovare il tempo da dedicare alla sua realizzazione  smiley
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non sò perchè ma questa cosa mi sembra difficilmente definibile con la meccanica classica ed invece mi inizia a dare più un senso di meccanica lagrangiana... forse perchè in un certo senso è simile al problema del doppio pendolo.
... se solo capissi quello che ho detto.. smiley-razz
ma qualcono che fà ingegneria meccanica o fisica ? smiley-grin
Logged

Milan
Offline Offline
Edison Member
*
Karma: 2
Posts: 1128
gioblu.com
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

hehehehe mi fa piacere, raga ho buttato giu un esempio di come potrebbe essere l'algoritmo, devo dire, devo ringraziarvi perchè mi avete chiarito le idee:

Code:
void loop() {
 getOrientation();
 angle = frontDistance - backDistance;
 float previousTime = time;
 time = millis();
 interval = time - previousTime;
 acceleration = velocity * interval;
 motionQuantity = acceleration * mass;
 offset = (targetMotionQuantity - motionQuantity) - (velocity / kV);
      P = angle / kP;
      I = I + (P * interval) / kI;
      D = (angle - previousAngle) / interval / kD;
      float PID = P + I + D;
if(P > 90) P = 90; //stop increase or decrease of the value
if(P < -90) P = -90; //costrizione del valore tra 90 e -90
left.write(90 + PID + offset);
right.write(90 - PID + offset);
previousAngle = angle;
}

fondamentalmente :
Code:
offset = (targetMotionQuantity - motionQuantity) - (velocity / kV);
sottraendo la quantità di moto attuale a quella che si vuole ottenere, si ottiene un valore sempre positivo, finchè non si ha raggiunto la quantità di moto richiesta.
Piu' si andrà veloce piu' si otterrà un offset opposto alla direzione del moto grazie alla sottrazione della prima parentesi che tende a 0 e velocità che aumenta.

Se si richiederà lo stop a velocità 10 e quantità di moto 10 otterremo:
Code:
offset = (0 - 10) - (10);
, in questo caso un angolo negativo, di conseguenza il robot sarà portaro a rallentare per il continuo sbilanciamento indietro, questo porterà la velocità a diminuire, e la prima parentesi a diminuire fino a giungere a 0. Teoricamente sembra funzionare

Se si richiederà la partenza da fermo:
Code:
offset = (10 - 0) - (0);
otterremo un angolo positivo, quindi lo sbilanciamento del robot in avanti per evitare il ribaltamento indietro, questo angolo tenderà a 0 o <0 in rapporto alla velocità e alla quantità di moto.

Prendiamo il caso di mantemimento del moto:
Code:
offset = (10 - 10) - (10);
otterremo un leggero sbilanciamento in negativo in rapporto alla velocità a cui sta andando il robot.

Logged

Community robotica / programmazione Arduino
www.gioblu.com

Pages: 1 [2] 3   Go Up
Jump to: