Go Down

Topic: [Progetto comune] - Robotica (Read 29241 times) previous topic - next topic

gbm

#120
Jul 05, 2010, 07:34 am Last Edit: Jul 05, 2010, 07:40 am by gioscarab Reason: 1
Ciao Brain, ciao ragazzi. Ce l'ho fattaaaa!!! ;D ;D ;D ;D ;D ;D ;D ;D
Il PID funziona correttamente!! L'ho capito (credo) o quantomeno quello che ho capito funziona!!

Ecco il video di PICO in azione!!
http://www.youtube.com/watch?v=wMXOHRbkQsk

Avete visto come contrasta l'inerzia acquisita?? Cavolo quando ho trovato il setting giusto ero estasiato!!!  ;D
E' possibile che sia cosi' agile con meno di 100 righe?    ;D

Visto il risultato mi sono messo e ho scritto un articolo per spiegare il PID, potete trovarlo qui:
http://www.gioblu.com/index.php?option=com_content&view=article&id=102:che-cose-lalgoritmo-pid&catid=38:programmazione&Itemid=7

Questo è il codice:
Code: [Select]
//Giovanni Blu Mitolo - Gioblu Robotics - released under Creative Commons Attribution license.
//use and enjoy free :-) - gioscarab[att]gmail.com
//Giovanni Blu Mitolo - Gioblu Robotics - materiale rilasciato sotto licenza Creative Commons Attribution
//usa pure e divertiti  :-) - gioscarab[att]gmail.com

#include  //Library used to interface servos - ibreria utilizzata per pilotare servi
                   
Servo left;
Servo right;

float time = 0;

#define servoLeftPin     9
#define servoRightPin   10
#define servoZero       81 //calibration 4 servos - calibrazione per servi
#define IRFront          2
#define IRBack           3
#define ledPin          13
#define leftIr           2 //proximity ir emitters - emettitori ir x sensori prossimità
#define rightIr          4


int frontSense = 0; //forward ir sensor - sensore ir anteriore
int backSense = 0;  //backward ir sensor - sensore ir posteriore
int orientation = 0;
int previousOrientation = 0;

float P = 0;
float I = 0;  //Il mesurement (empirism) - misurazione inerziale
float D = 0;
int fall = 0;       //value used to determine if the robot is fall
                   //variabile utilizzata per determinare se il robot è caduto
float kP = 12;      //used to tune
float kI = 430;
float kD = 20;

void setup() {
pinMode(ledPin, OUTPUT);
left.attach(servoLeftPin);
right.attach(servoRightPin);
left.write(servoZero);
right.write(servoZero);
Serial.begin(9600);
}


void getOrientation() {
 frontSense = 0;
 backSense = 0;
 orientation = 0;
for (int i = 0; i < 10; i++) {
 frontSense = analogRead(IRFront) + frontSense;
 backSense = analogRead(IRBack) + backSense;
 if (i == 9) {
  frontSense = frontSense / 10;
  backSense = backSense / 10;
  orientation = frontSense - backSense;
 }
}
}

/*Simplest thing ever
Stop wheels for 1/4 of a second
to get momentum to get up*/

/*La cosa piu' semplice del mondo
Stop alle ruote per 1/4 di secondo
per ottenere abbastanza momento per
rialzarsi*/

void autoGetUp() {
if (fall == 25 || fall == - 25) {
left.write(servoZero);
right.write(servoZero);
delay(250);
fall = 0;
I = 0;
}
}


void loop() {
autoGetUp();
getOrientation();
float previousTime = time;
time = millis();
float interval = time - previousTime;
     P = orientation / kP;
     I = I + (P * interval) / kI;
     D = (orientation - previousOrientation) / 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
if(orientation > 250) fall = fall + 1;
if(orientation < -250) fall = fall - 1;
if(PID <= 1 && PID > 0) PID = 0; //cut off micro-corrections
if(PID >= -1 && PID < 0) PID = 0;
left.write(81 - PID);
right.write(81 + PID);
previousOrientation = orientation;
Serial.print(P);
Serial.print("  ");
Serial.print(I);
Serial.print("  ");
Serial.print(D);
Serial.print("  ");
Serial.print(interval);
Serial.print("  ");
Serial.println(orientation);
}


Cosa ne pensate?
Community robotica / programmazione Arduino
www.gioblu.com

Federico

Ciao, ho visto i tuoi video e sono rimasto piacevolmente impressionato dai progressi compiuti. Devo ammettere anche un po' egoisticamente che ora che ho visto queste ultime funzionalita' di movimento inizio a volerne uno anche io di robottino... Devo leggere la documentazione sul tuo sito (e sperare che sia ordinata :p) Fede
Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

Saki_Kawa

Cavolo, mi assento per qualche altro giorno e qua le cose si fanno sempre più spettacolari!!
Gbm lavoro strepitoso!! Codice normalizzato e veramente corto, uso di hardware economico, veramente veramente complimenti!!

Poi ora che sò che sei un motarder ti farò ancora più complimenti!  ;)

Io invece mi sto dando allo studio di fattibilità di un drone "puliscipavienti", dato che vi siete dati ai fuochi d'artificio voi.
Se, una volta finito di coccolare e allevare la vostra nuova creatura, aveste intenzione di tornare al progetto originale io sono presente!
Ho recuperato un vecchio mini aspirapolvere da tastiera che funziona con 4 pile stilo e una motorino aspiratore di una fresatrice portatile per capire la potenza necessaria per pulire un pavimento, facendo degli studi sui flussi e le pressioni un po' decenti (cosa che forse non tutte le ditte di elettrodomestici fanno.. ci mettono su un tubo uniforme, senza vasi di compressione, un motore da 1.8kW e sono tutti contenti.. sopratutto l'enel.. un po' meno chi si deve camallare 8kg di aspirapolvere per la casa e 5 metri di cavo [fine sfogo  :D]).

Ancora complimenti!!!

gbm

#123
Jul 07, 2010, 03:19 pm Last Edit: Jul 07, 2010, 03:21 pm by gioscarab Reason: 1
Grazie mille dei complimenti  ;)
Figata. Guarda a me interesserebbe parecchio lavorare il PID a tempo variabile su un oggetto self-stable e vedere come reagisce. Visto che a te interessano altri aspetti potremmo lavorarci assieme.
A che punto sei con il robot??
Vuoi utilizzare degli encoder?Quali?
Come pensavi di fare il mapping della stanza?
Community robotica / programmazione Arduino
www.gioblu.com

BrainBooster

gbm ti rifaccio i miei complimenti per l'obbiettivo centrato! ma adesso inizia la parte più difficile? (elementi di disturbo)
cosa succede se devi comandare i motori manualmente per spostare il robot?
cosa succede alle ruote se girano su superfici con aderenze differenti?
cosa succede se si corre in salita o in discesa e si frena?
hai provato queste condizioni?
sono curiosissimo! [smiley=cheesy.gif]

Saki_Kawa

Quote
Visto che a te interessano altri aspetti potremmo lavorarci assieme.

Presente!
Quote
A che punto sei con il robot??

In realtà stavo studiando i flussi per ora.. la conformazione del drone dipenderà da cosa otterrò studiando un modo efficace per ottenere delle depressioni apprezzabili usando motori piccoli ed elettricamente economici.
Il sistema di guida invece è già abbozzato (deriva da un altro progetto: riconoscimento di blocchi colorati).
Quote
Vuoi utilizzare degli encoder?Quali?

A questo non ho ancora pensato, anche perchè di motori elettrici, encoder, movimento in genere, mi sono occupato pochissimo, quindi aspettavo qualche esperto.. ;)
Quote
Come pensavi di fare il mapping della stanza?

Qua viene il bello! 2 sistemi in parallelo. Uno touch (per chi vuole essere efficiente).. o meglio, nella fase iniziale, grafico. Tracciando una serie di segmenti su un'immagine di una stanza (presa via webcam) trasforma ogni segmento in movimento del drone. E uno gestito dalla CV in collaborazione con sensori vari (per chi non ha tempo da perdere). Senza dilungarmi: il brain fotografa la stanza, riconosce il pavimento, lo esalta e lo esclude dal resto, esegue un movimento concentrico seguendo i bordi individuati dall'esterno all'interno, intanto due sensori di prossimità studiano i lati del drone, appena individuata una distanza superiore a quella teorica sulla mappa, vuole dire che è un mobile cavo, quindi alla fine del percorso prova a mandarci il drone, che sotto si muove di sua iniziativa usando i sensori di prossimità.
Sulla carta la parte di pre-programmazione è già mezza fatta e l'idea è piuttosto fattibile.. serve qualcuno che mi dia una mano con il drone, sia per questioni di tempo, sia d'esperienza, sia perchè sperimentare senza avere un drone sottomano diventa arduo.. ;)
Se ti interessa apro un topic ad hoc e proviamo a dividerci qualche compito preliminare.  :D :D

kokiua

Quote
Vuoi utilizzare degli encoder?Quali?
A questo non ho ancora pensato

Scusate se mi "intrometto"  ::)
Sarò monotono: ma cosa ne pensate all'uso di un sensore ottico da mouse (con opportuna lente) per rilevare gli spostamenti? Non risolverà eventuali problemi di rotazione sull'asse del sensore (cosa che resta anche nel caso di due encoder) ma la precisione e l'economicità sono ineguagliabili...

guiott

ma cosa ne pensate all'uso di un sensore ottico da mouse (con opportuna lente)

Forse varrebbe la pena fare qualche prova, il problema principale è proprio quello di spostare il fuoco a qualche cm invece che a qualche mm come con la lente originale. Strano che ci siano pochissimi utilizzi in Rete.

Non risolverà eventuali problemi di rotazione sull'asse del sensore (cosa che resta anche nel caso di due encoder)

questa non l'ho capita. Con un unico sensore di mouse non saprai mai di quanto ha girato il bot, con due encoder si. Al limite potrebbe essere usato in aggiunta, facendo una sensor fusion tra encoder e telecamerina per capire se le ruote stanno slittando.

I primissimi sensori avevano anche una uscita diretta della telecamerina con la quale si poteva anche vedere l'immagine a bassissima risoluzione. I modelli intermedi avevano l'uscita X-Y che poi veniva codificata nello standard PS2 per il PC. Ora escono direttamente in USB e non è più facilissimo interfacciarli con una MCU.

Saki_Kawa

#128
Jul 08, 2010, 10:17 am Last Edit: Jul 08, 2010, 10:19 am by saki_kawa Reason: 1
L'idea dei sensori ottici per mouse non è niente male! Ma anche non ottici andrebbe bene, ho giusto due mouse vecchi sottomano!

Bè ma per la rotazione ne bastano due messi sotto sui lati, così lo spostamento è dato da due vettori, che nel caso della rotazione sono opposti, sapendo la distanza dei sensori dal centro il modulo di ogni vettore è la misura dell'arco dell'angolo di rotazione, il segno è il verso. ;)
angolo = l(arco)/r

[OT]Ma kokiua stai realizzando una telecamera rileva movimento con un mouse ottico????.. geniale!! Non mi perderò un post del tuo topic!![/OT]

[OT]Un'altra domanda OT.. ma GBM sei gioscarab??? Del forum di Ultramotard??.. praticamente è un carramba che sorpresa se sei tu.. ci eravamo sentiti un botto di tempo fa per venderti la mia moto, poi non si era più fatto nulla. ;)[/OT]

Calamaro


kokiua

@guiott:
Quote
(cosa che resta anche nel caso di due encoder)
questa non l'ho capita.

Hai proprio ragione ... ora che mi rileggo non l'ho capita neppure io ...  :-/ ho scritto di botto senza pensare che solo con un mouse con la "pallina" il probelma è uguale, ma se gli encoder sono sulle ruote la cosa è ben diversa ;)

Quote
il problema principale è proprio quello di spostare il fuoco a qualche cm

ci sto "alacremente" lavorando e so di parecchi esperimenti di successo in rete (magari non con Arduino...). Su YouTube ne trovi diversi.

Quote
I primissimi sensori avevano anche una uscita diretta della telecamerina con la quale si poteva anche vedere l'immagine a bassissima risoluzione. I modelli intermedi avevano l'uscita X-Y che poi veniva codificata nello standard PS2 per il PC. Ora escono direttamente in USB e non è più facilissimo interfacciarli con una MCU.


Vedo che ti sei perso il mio topic sul tema (l'ultimo è http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1278511477) ... ho trovato un sensore che ha tutti gli ingredienti che servono ed è tutt'ora in commercio ed in libera vendita (anche a privati... )
Ed è solo per questo che mi sono intestardito nell'impresa di dare un "occhio" ad Arduino  ;)

@Saki_Kawa:
Giusto, con due sensori la precisione è assicurata ... spero di riuscire a mettere insieme tutte le info necessarie a realizzare quanti più sensori sia possibile a costi estremamente contenuti così da poterli sfruttare dove si vuole  :P

guiott

Vedo che ti sei perso il mio topic sul tema (l'ultimo è http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1278511477) ... ho trovato un sensore che ha tutti gli ingredienti che servono ed è tutt'ora in commercio ed in libera vendita (anche a privati... )

rimedio subito :) grazie

gbm

#132
Jul 08, 2010, 07:49 pm Last Edit: Jul 08, 2010, 08:13 pm by gioscarab Reason: 1
Ciao raga. Avete visto che figo il lavoro Kokuia? interessante davvero. Mi chiedevo solo una cosa, ma se per processare le immagini ho bisogno per forza di processing (e quindi di un computer connesso in qualche modo al robot) perchè non utilizzare una webcam qualsiasi a questo punto :-/?

Se invece come mi sembra di capire basta arduino, allora è un altro discorso.
Community robotica / programmazione Arduino
www.gioblu.com

BrainBooster

processing è usato per simulare il sensore che non gli è ancora arrivato..

gbm

Si quello lo avevo chiarito. Credevo che la computazione non la facesse arduino ma jmyron ero rimasto li  ;).
Community robotica / programmazione Arduino
www.gioblu.com

Go Up