Arduino Forum

Forum 2005-2010 (read only) => International => Italiano => Topic started by: gioscarab on Mar 11, 2010, 07:22 pm

Title: [Progetto comune] - Robotica
Post by: gioscarab on Mar 11, 2010, 07:22 pm
Ciao a tutti ragazzi.
Visto il successo della robotica nel poll creo questo post per delineare l'eventuale progetto comune in quest'ambito.
Io sto portando avanti un robot lavapavimenti e aspirapolvere e sto cercnado di concepire un codice semplice per l'HOME MAPPING (vedi roomba) cioè delineare una mappa della casa e magari sapere in che punto si trova il robot.
Aspetto le vostre proposte. 8-)
Title: Re: [Progetto comune] - Robotica
Post by: Davide_Gomba on Mar 11, 2010, 07:32 pm
mmm.
Ti dirò, per limiti personali sono più vicino a questo tipo di progetto.
Il problema é che non é semplice (come nel progetto del CNC, ma infinitamente più facile, in realtà) trovare un "prototipo" da hackerare che non sia (già) un roomba.

Io ho lavorato molto con la cosa più semplice/economica da utilizzare: le macchinine telecomandate.

Ovviamente per un progetto simile la cosa migliore é il tipico robottino rotondo con ruote bassissime.
:P :P
Title: Re: [Progetto comune] - Robotica
Post by: xqtm on Mar 11, 2010, 08:07 pm
non so quanto un'arduino possa salvare determinati dati, ma se mosso con degli stepper creare una mappa di casa con un sensore sharp non è nemmeno difficile, si tratta solo di sovrapporre una matrice di vettori per delinearne il contorno finale... solo che con mathcad è facile fare una cosa simile ... con un'arduino non lo so :D
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 11, 2010, 08:14 pm
beh bisognerebbe delineare un protocollo di salvataggio dei dati di movimento e della ricezione di ostacoli. Graficamente con processing non è cosi difficile, disegna una riga mentre vai, disegna un puntino quando trovi qualcosa davanti a te lo sto gia sperimentando, pero' vorrei pensare a qualcosa che sia libero da processing, non grafico ma matematico.
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Mar 11, 2010, 08:46 pm
wow, l'idea è carina  ;) anche se non ho idee su come affrontare il problema.

Comunque ci sto
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Mar 11, 2010, 08:59 pm
io lo sta già facendo un robottino solo che mi si è rotta la scheda e non mi vanno i programmatori avr quindi sono fermo :-/
Title: Re: [Progetto comune] - Robotica
Post by: xqtm on Mar 11, 2010, 09:49 pm
gio, matematicamente non è problematico farlo, il problema è vedere se l'arduino riesce a stare dietro a tutti quei calcoli ... sono matrici abbastanza grosse e complesse ... dovresti prima provare a fare un poolling di dati e poi processarli sotto mathcad e vedere se riesci a trovare un'algoritmo semplice da eseguire, altrimenti puoi fare un'algorimo di prossimità che è piu semplice... al massimo quando ci becchiamo te lo spiego
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 12, 2010, 10:40 am
i dati del problema potrebbero essere questi?

1 punto di partenza (x;y)
2 propria posizione (x;y)
3 standby (boolean)
4 angolo di curva eventuale (in gradi)
5 rpm ruota (se si vuole la finezza della vel variabile)
6 ostacolo (presenza dell'eventuale ostacolo)





Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Mar 12, 2010, 11:22 am
Se qualcuno e' in grado di farlo matematicamente, non e' possibile pensare di attaccare un piccolo computer ad arduino mentre il robot pattuglia la casa, apprenderne la forma e poi togliere il computer e lasciare arduino che ormai ha imparato? O questo tipo di dati sono di difficile gestione una volta anche appresi? F
Title: Re: [Progetto comune] - Robotica
Post by: xqtm on Mar 12, 2010, 11:45 am
matematicamente c'è un metodo piu semplice per farlo che sovrapporre la matrice di linee, ovvero usare la matrice di punti e un'algoritmo di prossimità. ovvero in sostanza salvi un punto quando ti trovi a x centimetri da un'ostacolo con coordinate x-y, e fai muovere il mezzo una volta trovato l'ostacolo. una volta che hai un'array sufficentemente grande per la precisione che vuoi ottenere, fai un'algoritmo semplice calcolando con un sistema di radious il punto piu prossimo a quello che hai preso in analisi, quindi sposti il tuo cursore su quel punto e flagghi quello precedente come visitato, continui cosi finchè non rimangono piu punti da visitare e dovresti avere qualcosa di simile a una polilinea aperta che dovrebbe delimitare la tua stanza, dopo devi fare un'algoritmo di refine dell'errore e tracciare una linea fra la media dei punti che mantengono una certa linearità, eliminando quindi l'errore e avendo una linea retta che dovrebbe rispecchiare il tuo muro.... insomma farlo non è complesso ... se ti metti a scriverlo in un paio di giorni cel'hai fatta ... solo fossi in te prima proverei a fare questi calcoli graficamente davanti a un pc, poi vedi se il risultato è soddisfacente automatizzi la cosa dentro al robot.

tempo fa scrissi un'algoritmo simile per fare dei calcoli su googlemap :D
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Mar 12, 2010, 11:57 am
sono contento che la sezione robotica abbia preso questa strada...ma a questo punto io ripropongo il maze solver (che avevo già proposto nel 3D del progetto comune).

Si tratta di un robottino, che prima risolve il labirinto disegnato come se fosse un normale line follower e intanto apprende la soluzione che lo sta portando all'uscita. Una volta risolto il labirinto  e riposizionato nella posizione di partenza è in grado di ripercorrere il percorso giusto.

Mi sembra che ci siano delle forti similitudini col robot aspirapolvere, ma un po' più entry level, potrebbe essere il primo step del progetto.

Che ne pensate?
Title: Re: [Progetto comune] - Robotica
Post by: xqtm on Mar 12, 2010, 12:02 pm
fattibile ma di scarsa utilità, se devo spendere tempo ... almeno che mi pulisca casa :D
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Mar 12, 2010, 12:30 pm
Si beh, effettivamente l'unica utilità sarebbe quella di riuscire a farlo funzionare!

L'unica cosa utile è che la struttura e il concetto di fondo del codice sarebbero le stesse...per le mie capacità è più fattibile e potrei contribuire, mentre il progettone "aspirapolvere" lo seguirei comunque ma sarei più passivo.
Dico questo perchè non credo che tutte le 11 persone che hanno votato robotica al poll e che vorrebbero partecipare attivamente al progetto abbiano capacità di modellizzazione e creazione di algoritmi complessi.


Title: Re: [Progetto comune] - Robotica
Post by: Davide_Gomba on Mar 12, 2010, 12:36 pm
algoritmi complessi no  :o
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Mar 12, 2010, 01:09 pm
mi ricordo che per far esaminare uno spazio a un robot si doveva fargli fare delle specie di chiocciole quadrate sul terreno... ora non ricordo se sta tecnica ha un nome però potrete evitare particolari algoritmi...
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Mar 12, 2010, 01:57 pm
Il sistema di mappatura potrebbe essere valido anche per altri tipi di robot, non solo per gli aspirapolveri :)

Potrebbe essere interessante anche, prima della mappatura,  scrivere un sistema veramente efficace di navigazione e decisione via sonar + servo motore. Due componenti che e' sempre figo avere e che se devi muovere un robot ti fanno comodo.
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 12, 2010, 06:30 pm
Beh l'idea di calamaro ci sta, con un ultrasonico montato a lato si possono mappare le posizioni delle pareti in modo piuttosto semplice.

girando ho trovato:
http://www.jonh.net/~jonh/robots/mapping/submitted-paper.html
http://coecsl.ece.uiuc.edu/ge423/spring03/Group7/index.html
http://en.wikipedia.org/wiki/Robotic_mapping
http://www.iorobot.net/index.php?option=com_content&task=view&id=22&Itemid=44


post su roboitalia:
http://forum.roboitalia.com/showthread.php?p=42871#post42871
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 13, 2010, 12:33 am
da quello che ho capito possiamo usare delle matrici ma occupano un sacco di mem e operazioni/secondo, oppure algoritmi un po' piu' complessi ma leggeri da far girare
Title: Re: [Progetto comune] - Robotica
Post by: networm on Mar 13, 2010, 07:19 pm
Federico Vanzati ha scritto:
Quote

Dico questo perchè non credo che tutte le 11 persone che hanno votato robotica al poll e che vorrebbero partecipare attivamente al progetto abbiano capacità di modellizzazione e creazione di algoritmi complessi.


io arrivo a malapena alle equazioni di primo livello...  :-? :o :-[ :-/
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 13, 2010, 08:40 pm
Massi' non è cosi problematico come sembra.
E poi siamo il forum italiano. Dobbiamo spaccare.
(non per mettere competizione con i forum esteri) pero' dovremmo tirare fuori qualcosa di interessante, avete visto in america cosa fanno?
Non possiamo farci surclassare cosi'  :P
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Mar 13, 2010, 08:59 pm
Giusto, dobbiamo fargli il cul0 :)
Title: Re: [Progetto comune] - Robotica
Post by: networm on Mar 14, 2010, 12:12 am
Quote
E poi siamo il forum italiano. Dobbiamo spaccare.
(non per mettere competizione con i forum esteri)


e perchè no?  ;)
un po' di sana competizione non ha mai fatto male a nessuno, anzi, al massimo ci sprona a dare il nostro meglio :)

A me sono arrivati i sensori di colore, vogliamo farci qualcosa?
http://it.mouser.com/ProductDetail/TAOS/TCS3200D-TR/?qs=07cgIB9%2f73FMXjkjs0LJVg%3d%3d
Ho scoperto che su mauser.com costano l'imponente cifrone di 2 euri cadauno... alura?

(piccola precisazione, porca miseria, non abbiamo mai nominato la cosa più interessante nel poll: creare un nuovo shield!! e pensare che doveva essere la prima cosa a venirci in mente  ;D ;D)
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 14, 2010, 12:47 am
sai che non lo trovo? Mi mandi il link? :P
Beh io stavo pensando di utilizzare una bussola per rilevare l'orientamento del robot rispetto al mondo. Si potrebbe pensare a uno shield del genere, e risulterebbe anche utile per il progetto del mapping. In teoria se scegliamo decentemente il componente possiamo spendere davvero poco, vedendo in giro.
Title: Re: [Progetto comune] - Robotica
Post by: giocastel on Mar 14, 2010, 11:20 am
Ciao
Pensavo a come centrare il progetto, l'obieettivo è quello di usare solo Arduino, oppure anche di basarci su calcoli effettuati dsa Pc che appoggiano Arduino sulla parte di calcolo ?

Nel frattempo ho costruito un rover che puo' portare a spasso un netbook, funziona abbastanza bene. ...e risolve anche problemi di eventuali calcoli on site.

Gio'
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Mar 14, 2010, 12:49 pm
Se si potesse fare solo con arduino porebbe essere meglio, metti che un robot possa arrampicarsi o camminare su una griglia, potrebbe essere difficile portarsi a spasso un chilo di netbook...
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 14, 2010, 02:41 pm
ho sperimentato anche io in quella direzione tempo fa e mi son reso conto che non ha alcun senso portarsi dietro il pc soprattutto per robot casalinghi quando esiste il wireless.
Cmq si potrebbe essere carino magari rappresentare graficamente con processing la mappa creata dal robot.
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 17, 2010, 10:07 am
Ok mi sono fatto una cultura. Sembra che possiamo ispirarci molto da:
-http://www.guiott.com/Rino/index.html
questo è un ottimo lavoro, davvero complimenti al realizzatore. Nel sito trovate tutta la parte di mapping spiegata.
Savo ragionando a sviluppare un arduino dedicato solo a ricevere dati da un altro arduino, computare e salvare la mappa su SD. Questo perchè un solo arduino faticherebbe a fare tutto, e quindi con due possiamo anche scrivere una cosa pesantina e non troppo elegante che pero' funzioni.
In questo caso una volta fatta la mappa puo' per assurdo essere inserita in qualsiasi altro robot che conosca il linguaggio utilizzato.
Che ne dite?

materiali necessari:
-2 motoriduttori encoder 60 80 rpm
-2 arduini
-qualche sensore
-lettore scrittore SD
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Mar 17, 2010, 11:38 am
Spettacolo!!!
Ho letto un po' qua e un po' la e mi sembra di capire che il cuore del problema è definire quali sono i colli di bottiglia del problema.
Ad esempio un microcontrollore si occupa solo degli encoder e dei motori, uno della navigazione, uno dei sensori, ecc... e poi ha creato un protocollo di comunicazione su seriale per farli parlare tra di loro, così che si genera una sorta di multitasking su più microcontrollori.

Ho visto che ogni tanto cita anche Arduino, potremmo cercare di coinvolgerlo nel progetto no?

Comunque mi sa che il primo passo è quello di risolvere il problema motori+encoder, è un po' che ho il pallino per questa cosa, ma ci sono troppi argomenti che non conosco bene, magari collaborando se ci riusciamo potremmo anche produrre uno shield... :D
Title: Re: [Progetto comune] - Robotica
Post by: guiott on Mar 17, 2010, 02:41 pm
Compatibilmente con il poco tempo libero che ho a disposizione, partecipo volentieri a questa discussione, se posso essere utile...

un po' di esperienza sul dead reckoning l'ho fatta anche se, come dicevo in una altro forum, sono passato al lato oscuro della forza ed ho usato un dsPIC per fare tutta la navigazione :)
L'Arduino mi piace moltissimo come concetto e l'ho usato per la scheda sensori. Ho usato anche Processing per la console di telemetria. Non sono davvero un esperto ma qualcosa so.

Sicuramente una sola scheda non basta. Mi sembra molto corretto l'approccio che state seguendo di separare il progetto in problemi più piccoli. Vi racconto un po' quale è stato il mio iter, non è detto che sia il migliore, ma almeno è una traccia.

Risolto il problema della meccanica, per prima cosa ho affrontato la lettura della velocità tramite gli encoder. Poi mi sono preoccupato di impostare e mantenere la velocità delle ruote per far andare dritto il robot tramite controllo PID. Poi l'odometria e la parte matematica per calcolare la posizione corrente. Poi ho studiato un protocollo di comunicazione tra le schede e verso il PC per la telemetria. Poi la scheda sensori per capire l'ambiente che circonda il robot e mappare gli ostacoli. Ultimamente mi sono occupato molto della taratura dei parametri meccanici in vista delle prossime gare RTC che vorremmo fare (chi sa se ci riusciamo?) con risultati decenti (http://www.guiott.com/Rino/RinoUMBmark.htm). Il prossimo passo che devo affrontare è l'obstacle avoidance, ho studiato un mucchio di teoria, mi manca di metterla in pratica.

Vabbeh... per questo primo post mi sono dilungato anche troppo.
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Mar 17, 2010, 03:49 pm
Complimenti!!

Io sono sempre più intenzionato a cimentarmi nel controllo motori con encoder e PID.
Visto che probabilmente hai un bel po' di esperienza, come lo vedi un ATMega328 per questo uso?
Secondo i ragionamenti che mi sono fatto, dovrebbe andare più che bene per leggere bene un encoder ed elaborare un PID, però non sono dei ragionamenti spannometrici dato che conosco poco le architetture dei microcontrollori. Che vantaggi in più mi darebbe in questo caso un architettura a 16bit rispetto a quella a 8bit?

Perdonami l'abbondanza di domande, ma non ho inquadrato ancora bene il problema!
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 17, 2010, 04:07 pm
il problema principale è il consumo di potenza di calcolo da parte del mapping software. credo che un 168 basti e avanzi per il PID!!
Questo progetto è una figata contiene tutto quello che serve imparare, cioè:
-interazione tra piu' arduini
-applicazione e sviluppo di un software complesso
-applicazione e acquisizione sensori
-una applicazione vera e sensata per il risultato finale (aspirapolvere diy)

ve li immaginate finalmente i nostri robot che dopo un po' di musate iniziano a filare veloci come fusi in casa senza sbattere da nessuna parte?
Title: Re: [Progetto comune] - Robotica
Post by: guiott on Mar 17, 2010, 04:17 pm
Per il controllo di velocità tramite encoder e PID non vedo grossi problemi con un architettura anche a 8bit. Il problema è più che altro la velocità di elaborazione o meglio, la capacità di gestire gli impulsi dagli encoder. Lo avevo già fatto con una MCU a 8 bit PIC18F (http://www.guiott.com/PID/index.html) gestendo ad interrupt i due encoder ricavati dalle rotelle dei mouse, quindi con meno risoluzione rispetto agli encoder che uso ora. Il vantaggio con il dsPIC33F è la presenza di due moduli QEI (quadrature encoder interface) che fanno già gran parte del lavoro in HW.

Ti devi fare bene i conti per i tuoi encoder, magari segui questa traccia:
http://www.guiott.com/dino/swmovimento.html
per capire se hai risorse a sufficienza, ad occhio dovresti farcela.

L'unico dubbio che ho è sulla scrittura del SW, non sono sicuro che basti usare il Wiring per realizzare una cosa del genere. Ho paura che ti debba gestire le cose a livello un po' più basso, ma è solo una sensazione, non conosco così bene gli Atmel, io avevo fatto tutto in C sul PIC, ottimizzando tutto, anche il flow del programma usando una specie di RTOS personalizzato.

Per quanto riguarda l'odometria invece serve un po' più di matematica, e una MCU a 16bit potrebbe fare la differenza.

All'epoca di Dino avevo cominciato a studiare le librerie Cordic per calcolare seni e coseni con gli interi ottimizzando al massimo i calcoli (http://www.guiott.com/dino/swdivide.html), poi ho deviato per la soluzione più facile con un PIC con core DSP che non ha grossi problemi nei calcoli anche di float.
Con un po' di applicazione non dovrebbe essere impossibile, non credo però che basti una sola scheda per controllo velocità, PID, odometria e navigazione.

ciao

P.S.
Scusate se cito così spesso pagine del mio sito, ma ci ho speso molto tempo e li ci sono tutti i miei appunti, credo possano essere utili senza che mi metto a ripetere gli stessi concetti.

Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 17, 2010, 04:36 pm
No anzi sei un grande.
Suddividere in piu' microprocessori il lavoro è importante per piu' motivi. Si possono creare dei gruppi di lavoro e suddividere la sperimentazione in piu' blocchi inter-dipendenti.
uno schema di base potrebbe essere:
-un arduino che si fa la parte PID e pilotaggio motori
-un arduino che segue input sensori e li pilota (in caso si parli di US)
-un arduino che elabora dati spediti dagli altri due e salva su sd.
Cosa ne dici?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 17, 2010, 04:38 pm
No anzi sei un grande.
Suddividere in piu' microprocessori il lavoro è importante per piu' motivi. Si possono creare dei gruppi di lavoro e suddividere la sperimentazione in piu' blocchi inter-dipendenti.
uno schema di base potrebbe essere:
-un arduino che si fa la parte PID e pilotaggio motori
-un arduino che segue input sensori e li pilota (in caso si parli di US)
-un arduino che elabora dati spediti dagli altri due e salva su sd.
Cosa ne dite?
Title: Re: [Progetto comune] - Robotica
Post by: guiott on Mar 17, 2010, 05:30 pm
Bellissimo! La suddivisione di più task a diversi gruppi di lavoro è molto interessante, ognuno farebbe la parte che gli piace di più.

Bisogna solo definire molto bene il colloquio tra le varie schede prima di partire. Fino a 2 va benissimo la classica seriale, anche a livello TTL. Oltre bisogna usare altri sistemi. Un sistema valido potrebbe essere un collegamento tramite RS485 o I2C. l'RS485 richiederebbe l'aggiunta di un driver in più per ogni scheda ma a quel punto si possono mettere quante schede si vuole e a qualsiasi distanza, poi si vede come una normale seriale. Con l'I2C si possono sfruttare tutte le librerie esistenti e senza aggiunta di HW, però si è più limitati sulla distanza (non è un problema su un robot) e sul numero massimo di device.

Sarebbero entrambi protocolli master/slave, quindi va definito un master che si occupi della supervisione (sconsiglio, almeno per ora, il multimaster). La cosa si complica un po' per la scheda sensori, che già avrebbe diversi dispositivi I2C da gestire come master. Bisogna verificarne la possibile convivenza, oppure usare una scheda con 2 I2C in HW, oppure usare un I2C HW e uno SW in modo che la scheda sia master verso i sensori e slave verso il supervisore.

Insisto sul definire molto bene questo punto, il resto viene poi con il tempo.
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 19, 2010, 08:01 pm
Beh qui bisogna valutare il parere comune.
Cosa ne pensate ragazzi?
Chi sarebbe interessato (e a che parte del progetto) ??
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Mar 19, 2010, 08:15 pm
Io sono interessato a tutto il progetto chiaramente, però se devo scegliere un "task" su cui lavorere, preferirei dedicarmi al controllo dei motori con encoder e PID.
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 19, 2010, 09:11 pm
Anche a me interessa molto quella parte, anche se spero di poter saltare anche nel gruppo del mapping  ::)
Title: Re: [Progetto comune] - Robotica
Post by: Davide_Gomba on Mar 20, 2010, 10:35 am
ciao gente.
Noto con piacere che il progetto si sta definendo.
@gbm: potresti usare il primo post ti questo thread per sintetizzare il progetto come fanno per il CNC?

Questo permette un più semplice update sui lavori.
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 20, 2010, 01:26 pm
Questo trhead verte sulla costruzione di un robot lavapavimenti tipo roomba, completamente costruito da noi sia a livello software che hardware, integrando tutte le funzionalità (volendo anche qualcosa di piu' avanzato) del roomba o degli altri robot lavapavimenti commerciali. Ho proposto questa sfida al forum italiano come esperimento per testare la nostra capacita' organizzativa e le nostre competenze messe non solo in share, ma organizzate verso un fine comune.  ;D

i gruppi delineati quindi sono:
-azionamento motori Encoder e PID
-modulo acquisizione dati dai sensori
-modulo di mapping

Io mi inserirei nel gruppo del mapping.
C'è qualche altro interessato?
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Mar 21, 2010, 07:38 pm
vorrei farvi vedere questo video :D

http://www.youtube.com/watch?v=5FjT9nUkj-I
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 22, 2010, 05:10 am
Quest'uomo è l'emblema del nerdismo!!! hahahah
Beh ottimo lavoro direi. Anche se non so con quanta precisione possa muoversi per casa in modo autonomo, sembra piu' un sistema per telepresenza e teleuccisione  :o.
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Mar 22, 2010, 08:16 am
il progetto è su instrutables o qualcosa del genere... per capirsi è quel sito di tutorial con la mano aperta!
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 26, 2010, 02:20 pm
Non questa domenica, la prossima ci sara' il primo incontro presso Via Savona 123 in Milano di questo gruppo. Chiunque è il benvenuto. Ci sara' un workshop GRATUITO su cui discuteremo il futuro del progetto e le sue direzioni future. ;)
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Mar 26, 2010, 03:02 pm
Il 4 Aprile? Ma non è Pasqua???
Wow a me interessa parecchio quand'è che avete deciso e poi...cosa c'è in via Savona 123?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 29, 2010, 02:35 am
Mmm hai ragione. E' Pasqua!!
Vediamo come saranno gli impegni degli altri.
A questo punto realisticamente forse sarebbe da slittare a domenica 11.
In questi giorni uppo una pagina con tutte le info e contatti.

Per il progetto:
Sto facendo i primi disegni per una eventuale platform board realizzabile in compensato, balsa o alluminio per chi ne ha la possibilità.

Il mio problema è scegliere uno "standard" per la ruota pivotante o casterball, e per i motori. Nei primi disegni io ho integrato i fori per attacchi vari per servomotori a rotazione continua e per i micromotors che ha utilizzato guido.

Anche i motori della solarbotics sembrano attuabili e a basso costo.

Avete qualche consiglio?

Title: Re: [Progetto comune] - Robotica
Post by: networm on Mar 29, 2010, 03:25 am
Io ancora non ho capito come fermare i servi a rotazione continua, perchè se setto li valore a 90 come descritto in giro non sono mai fermi, ma vibrano parecchio... certo sono molto più semplici da utilizzare rispetto ai dc o agli stepper...
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Mar 29, 2010, 03:49 am
guarda è semplicissimo, dovrebbe esserci un potenziometro a resistenza variabile (quello che nei servi normali determina la posizione della squadretta) o all'interno di un foro a lato del servo, oppure all'interno del case al di sotto del circuitino (in questo caso devi dissaldare i due poli del motore e sfilare il circuito per accedervi).
Setti il servo a 90 e poi giri il potenziometro finchè il servo non è perfettamente fermo. In questi giorni sto proprio ragionando a un circuitino da collegare al posto del potenziometro per poter permettere ad arduino di auto regolare i servi.
Title: Re: [Progetto comune] - Robotica
Post by: guiott on Mar 29, 2010, 08:18 am
Per il caster, un'ottima soluzione, se c'è spazio, è quella di usare una omniwheel:
http://www.trossenrobotics.com/store/p/3126-VEX-Omni-Wheel.aspx
http://www.acroname.com/robotics/info/ideas/omnimod/omni_mod.html
http://www.robotexp.com/products/list.asp?id=89
http://sketchup.google.com/3dwarehouse/details?mid=2dc47cfe2678b166ae3f90abcf68560b

io, per questioni di spazio, ho usato un classico caster a sfera:
http://www.robot-italy.com/advanced_search_result.php?search_in_description=1&keywords=ruote&osCsid=b7ea64f9dc42dac485dc0465f4fe7d32&x=0&y=0

da 19mm. Li ho provati entrambi, in plastica e in metallo. Quello in metallo è ottimo per la sfera ma si consuma il supporto. Quello in plastica è ottimo il supporto ma si consuma la sfera. In conclusione: sto usando la sfera in metallo sul supporto per la sfera in plastica (che ha i rullini). Sembra funzionare bene e si consuma poco.

I motori vanno scelti anche in funzione dell'encoder che possono montare.
Per i servi a rotazione continua, ad esempio, si può usare anche questo:
http://www.acroname.com/robotics/parts/R239-WW01.html
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Apr 05, 2010, 10:06 am
A che ora domenica 11? F
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Apr 05, 2010, 12:08 pm
astromech.net/ date un'occhiata a questo forum. :D
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Apr 13, 2010, 12:30 am
La pagina non e' stata uppata, le conferme neanche... ma vi siete incontrati poi ? F
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 13, 2010, 01:16 pm
Ciao Federico. Si ci siamo trovati per i primi test e per predisporre lo spazio per un workshop. Lo spazio è predisposto e i mezzi ci sono.
Gia questa domenica per chi è interessato iniziera' il percorso sulla robotica. Qui puoi trovare la pagina di cui parlavo:
http://www.gioblu.com
nella sezione worshops!

Il sito è completamente undercostruction!!
Chiunque volesse caricare un articolo, una spiega o un tutorial è il benvenuto.
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Apr 13, 2010, 01:57 pm
Mannaggia mi ero quasi tenuto libero tra i miei complicatissimi impegni :) Adesso vado a guardare bene la pagina!

Quando dura in media un incontro? (Ho un impegno in viale papiniano domenica pomeriggio, cosi' mi organizzo e vedo un po'!)
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Apr 13, 2010, 03:20 pm
M'è passato di mente l'incontro!! >:( >:( >:( >:( >:(
Anch'io sono un po' impegnato però domenica prossima se riesco vorrei partecipare!!
Sono curioso, di cosa avete parlato al primo incontro?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 13, 2010, 03:35 pm
principalmente della meccanica del robot, dell'eventuale PID e della eventuale modularità e compatibilità con altri prodotti della robotica di base.
Title: Re: [Progetto comune] - Robotica
Post by: faustof on Apr 14, 2010, 04:45 pm
ciao a tutti
sto lavorando ad un progetto che richiede un servo con una coppia abbastanza potente, ho un contatto con un azienda che ha questi servi
http://www.drivesystems.it/data/prodotti_2006_2.htm
mi chiedevo se si possono controllare con arduino e come?
grazie a tutti
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Apr 14, 2010, 05:27 pm
Non puoi aprire una discussione apposita? Qui stiamo discutendo di altro! F
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Apr 14, 2010, 08:29 pm
Salve a tutti!

Veramente interessante questo workgroup!!

La robotica affascina anche me!..
Tra i mille progetti che ho nella mia to-do list c'è anche un hexapode autonomo, che forse potrebbe avere qualcosa in comune con il vostro roomba-mod.

In realtà il mio progetto è leggermente diverso, e si basa sull'integrazione del/dei robot con un sistema di assistente digitale per la casa (Digital life assistent), qualcosa a metà tra Hall9000 e Jarvis di Ironman..

Per la parte di automazione nei movimenti ho riflettuto parecchio, anche dal punto di vista matematico (studio fisica), su quale fosse la strada migliore, e forse dedicare un cervello proprio ad un robot che dovrebbe essere leggero, agile e veloce non è il massimo, tanto più che il robot si muoverebbe solo su un piano bidimensionale, quindi un riferimento su un'asse z sarebbe ottimale per gestirlo, più che un riferimento "interno" al piano.
Se ci pensate come funziona il cervello umano?
Vede la mano e la muove in una direzione, la vede da un riferimento esterno alla mano, anche camminare è qualcosa che viene astratto dal cervello in un piano esterno, e anche quando non vediamo la nostra mano per afferrare un oggetto, ci immaginiamo dove possa essere, quindi tutto si basa su un sistema di riferimento esterno alla parte in movimento.
Il robot, se non può vedere o ancora meglio astrarre se stesso, conviene che qualcuno lo faccia per lui.
Vi siete chiesti cosa dovrebbe fare il robot realmente?
Secondo me solo due cose: pulire ed evitare ostacoli inattesi, e per fare questo non serve un cervello onboard, basta una connessione wifi con un processore centrale che gli dica cosa deve fare e dove deve andare.
Così sto provando a risolvere il problema della mappatura delle stanze con un approccio diverso.

La mia strada è quella di usare una telecamera sul soffitto collegata ad un pc, che riconosca dove si trova il robot in ogni momento e che gli indichi dove andare, mandandogli un percorso predefinito.
La telecamera è collegata ad un software a riconoscimento visivo.
Il progetto forse è più ambizioso, ma dal punto di vista concettuale e funzionale forse è più semplice, tutto il difficile sta nel definire bene i metodi di riconoscimento della telecamera.
Praticamente bisognerebbe creare delle mappe delle stanze con dei waypoint che il processore centrale dovrebbe inviare al robot, con la possibilità di quest'ultimo di indicare al processore se c'è un ostacolo inatteso e aggiornare i waypoint.

Alla fine questo progetto esula un po' dal vostro, ma se vi può interessare l'approccio sarebbe figo svilupparlo insieme.. tanto più che rientrerebbe nel campo della robotica, ma anche della domotica e in parte dell'automazione cartesiana.

Qualcuno si intende di software di riconoscimento visivo? (io sto iniziando a leggere materiale ora, ma conosco già molti linguaggi di programmazione).

Un saluto a tutti!!
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Apr 14, 2010, 11:41 pm
...e computer vision  :)

c'è un programma che qualcuno qui ha già provato che sembra potente e facile, si chiama Roborealm.
Oppure io sto facendo un po' di esperimenti con processing e ci sono un po' di librerie che aiutano, mi sto lanciando nella OpenCV che è quella più "famosa"...c'è un sacco di roba da capire e la strada la vedo lunga ma interessante!!!

Però secodo me è più "al passo coi tempi" non un approccio con un cervellone centrale, potente che impartisce dei comandi a delle periferiche in sparse in giro, ma una serie di piccoli dispositivi dotati di intelligenza in grado di dialogare tra loro e aiutarsi a svolgere il compito.
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Apr 15, 2010, 01:14 am
Grazie mille per le dritte!! ;)

Quote
Però secodo me è più "al passo coi tempi" non un approccio con un cervellone centrale, potente che impartisce dei comandi a delle periferiche in sparse in giro, ma una serie di piccoli dispositivi dotati di intelligenza in grado di dialogare tra loro e aiutarsi a svolgere il compito.


Sicuramente le bot net collaborative sono affascinanti, ma siamo un po' lontani dalla pratica, sopratutto perchè le variabili in gioco sono molte e già serve molta potenza di calcolo per compiere operazioni base, e se non ci si approccia alla realizzazione come si farebbe con una piccola rete neurale, dividendo i compiti si rischia di disperdere le forze e necessitare di processori potenti.. ma non credo che tutti abbiano le competenze/mezzi per applicare teorie di reti neurali a macchine che devono collaborare tra loro.. ovviamente se creassimo i nostri piccoli droidi su processori ARM o roba simile non ci sarebbero problemi, ma costerebbero 10 volte tanto! ;)
IMHO..
Poi secondo me il problema non è neanche di essere al passo con i tempi.. alla fine siamo tutti alla ricerca di una soluzione funzionale, ognuno ha la sua strada e la sua opinione, sarà il confronto di efficienza a parità di lavoro svolto a decretare il successo di un metodo su un altro.
Quindi è anche giusto che qualcuno provi qualche strada differente, secondo le proprie capacità e valutazioni.  8-)
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 15, 2010, 02:29 am
Ciao! Piacere di conoscerti, o forse abbiamo gia chiacchierato sul forum :P.

Non sono completamente d'accordo con te sull'uso di una struttura tipo hexapod se quello che cerchi è leggerezza e agilità. Ipotizzando almeno 3 gradi di libertà di movimento stai parlando di 18 servomotori!! Con delle ruote abbastanza grandi due servo fanno 20-25cm al secondo..un hexapod se li sogna (e quanto pesa?).

X la possibile connessione alla cloud io sto sperimentando una connessione ir, per dare via web app comandi al robot, es richiamare una funzione.

Delocalizzare la computazione è intelligente fino a un certo punto, credo che la cosa più interessante per un progetto del genere sia l'interfaccia uomo-macchina via web e le sue possibili applicazioni.

Per la computer vision "in terza persona" è gia stato fatto vai su roborealm credo potrai trovare l'eseguibile gia settato che fa il lavoro che hai bisogno, devi solo dipingere una freccia con nastro adesivo del colore richiesto e orientarla nella direzione forward del robot. Il programma credo sia in grado di riconoscere gli ostacoli tramite un semplice filtro rgb e analisi dei bordi.

Interessante anche il tuo intervento sull'astrazione e acquisizione del posizionamento in rapporto alle 3 dimensioni. Il pid a cui stiamo pensando è esattamente la forma prima di questo concetto (o meglio l'hello world della questione) ... in due dimensioni chiaramente
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Apr 15, 2010, 11:11 am
Ciao gbm, piacere! No non credo che abbiamo mai chiaccherato per ora, mi sono appena registrato, anche se seguo da parecchio! ;)

Quote
Non sono completamente d'accordo con te sull'uso di una struttura tipo hexapod se quello che cerchi è leggerezza e agilità. Ipotizzando almeno 3 gradi di libertà di movimento stai parlando di 18 servomotori!! Con delle ruote abbastanza grandi due servo fanno 20-25cm al secondo..un hexapod se li sogna (e quanto pesa?).

Comprendo le tue perplessità, ma forse è colpa mia che non ho detto che sto sviluppando questo hexapode completamente motorless, uso nanomuscle al NiTinol, per ora il prototipo di zampa è piuttosto grezzo, ma ci sto lavorando su. ;)
Il peso dei singoli muscoli è davvero ridicolo, qualche decina di grammi.
Secondo, il mio hexapode non è assolutamente associabile all'idea di leggerezza e agilità di cui parlavo, era un discorso in generale sui droni da casa quello; tutti gli n-podi sono creati più che altro per terreni accidentati, la similitudine dei progetti potrebbe esserci nel sistema di controllo, tanto che sia hexapode o munito di ruote poco importa alla fine, cambiano le funzioni per compiere i movimenti.

Quote
Delocalizzare la computazione è intelligente fino a un certo punto, credo che la cosa più interessante per un progetto del genere sia l'interfaccia uomo-macchina via web e le sue possibili applicazioni.

Be' dipende come la intendi, ma nel mio progetto c'è anche quello, ma i comandi e l'interprete dei comandi vi web sarebbero su un pc centrale che a seconda dell'operazione manderebbe i comandi anche ai droni-appendice, come dire: io dico al cervellone cosa voglio, e lui sa quali droni/operazioni azionare per arrivare allo scopo.

Quote
dipingere una freccia con nastro adesivo del colore richiesto

Intendi che devo disegnare il percorso per terra??..
No no, questo lo escludo, io parlo di fotografare dall'alto la stanza e calcolare in automatico una geometria per il movimento, cosa che su pc si può fare abbastanza bene, poi "l'occhio" impartirà al drone solo i comandi base per muoversi, come una normale macchina telecomandata, tutto gestito visivamente, quindi niente calcolo della posizione del drone o della distanza da un oggetto.
Comunque sto leggendo un po' bene su Roborealm e ci sono davvero tante cose utili che potrebbero servirmi, grazie mille!!

Il problema dell'astrazione è uno dei principali problemi del movimento spaziale dei droni. Per far si che il robot abbia "coscienza" della propria posizione deve poter astrarre lo spazio intorno a lui, senza però dipendere essenzialmente dalla posizione iniziale (se no in qualunque caso imprevedibile, malfunzionamenti, errori di calcolo, colpi contro oggetti, in cui il drone potrebbe "inciampare" gli farebbero perdere ogni riferimento), cosa in realtà non difficilissima.. il difficile è scegliere quale sistema usare per fargli percepire lo spazio circostante. Alcuni si stanno muovendo sempre nella direzione visiva (in realtà anche agli ultrasuoni, ma sempre sistema visivo è..) per triangolare la distanza da oggetti/ostacoli noti dopo ogni spostamento, cioè 4 o più sensori che quadrino il robot in ogni istante; in questo modo la matrice non sarebbe neanche troppo complessa, un arduino potrebbe riuscire a gestirla, ma secondo me ne servirebbero comunque due: uno per l'acquisizione dei dati dai sensori e l'altro per il calcolo della posizione e dei movimenti.. ah e forse un terzo per comandare i movimenti, se non si sceglie un arduino mega.. IMHO! ;)

Dai spero che riusciate a creare qualcosa di davvero funzionale!! Dobbiamo sbaragliare gli altri paesi!  ;D
Se vi serve una mano, nei limiti di tempo e di conoscenze che ho, sono qui! Intanto posterò qualche progresso del mio progetto in un topic, magari potrebbe essere utile anche a voi qualcosa.
In bocca al lupo!
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Apr 15, 2010, 12:55 pm
Scusa l'ignoranza profonda ma come fa un robot a muoversi senza motori? Cosa sono questi muscoli di cui parli?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 15, 2010, 02:46 pm
Saki sei il benvenuto, ti aspettiamo ai workshop con il tuo mostriciattolo!! Magari crea un post e facci vedere cosa stai facendo.
Ci vuole un po' di anti-conformismo (in questo caso anti-lynxmotion)  :-X.

x roborealm: ummm in questo istante non trovo il video cmq c'è un ragazzo estero che ha montato una webcam in una posizione rialzata nella sua camera e attaccando una freccia sul dorso del suo robot, riusciva a comandarlo tramite roborealm ed evitare gli ostacoli.

X assenza motori: si i motori ci sono sono degli attuatori lineari molto simili ai muscoli, esempio, ci sono dei metalli che se percorsi da corrente modificano la loro forma e la loro elasticità, oppure ci sono i muscoli pneumatici che con una pompetta si tendono.
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Apr 15, 2010, 02:58 pm
Quote
X assenza motori: si i motori ci sono sono degli attuatori lineari molto simili ai muscoli, esempio, ci sono dei metalli che se percorsi da corrente modificano la loro forma e la loro elasticità, oppure ci sono i muscoli pneumatici che con una pompetta si tendono.

che figata  :P :P :o
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 15, 2010, 03:10 pm
http://www.robotshop.com/shadow-air-muscles-2.html
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Apr 15, 2010, 04:26 pm
Sì i muscoli ad aria sono belli, sopratutto perchè sono molto potenti e arrivano a delle belle forze alcuni, ma io punto sulla leggerezza e sull'uso ridotto di corrente.
Per adesso io sto usando degli attuatori lineari fatti con il NiTinol, un metallo a memoria di forma molto performante.
Si può allungare parecchio e riscaldandolo torna alla sua forma originale (memorizzata precedentemente a 800° circa).
Può prendere qualunque forma volendo, ma per ora mi sto dedicando solo a fili.
Il bello è che con un impulso di 3.5V e 410mA si contrae istantaneamente di 4mm, sollevando fino a 70g (in realtà anche di più).. contando che un attuatore pesa 1.1g direi che è ottimo! ;)
Ovviamente mettendone 2, 3 o 4 accopiati la forza che applicano è proporzionale, quindi già due possono arrivare a sollevare 1 etto e mezzo!
E le batterie, funzionando tutto ad impulsi brevi, durano una mare, senza contare che il peso è davvero ridicolo.. rimane solo lo scheletro.. ma anche li ci sto lavorando per farlo di materiali leggeri e robusti.

@gbm: allora cerco il video del ragazzo di cui parli, è proprio quello che avevo in mente, segnare i poli anteriore e posteriore del robot, giusto con un decal o una shape riconoscibile, e permettere alla telecamera di individuarlo e capire anche in che direzione è orientato! Grande!!

Per il post aspetto un attimo.. magari vi posto giusto un video sulle potenzialità dei nano muscoletti e quanto sono forti, ma per ora sto progettando tutto su una struttura di LEGO.. e la cosa non è molto professionale..  ::) tanto più che è piuttosto grande..  :-?
Sto prendendo accordi con una ditta che lavora l'alluminio per avere degli scarti di lavorazione e con un amico per avere in prestito il tornio (purtroppo in uni per usarlo ci vogliono mille permessi se sei studente).
Ma appena avrò qualcosa di mezzo fatto lo posterò qui.. anche perchè vorrei riuscire ad ottimizzare tutte le funzioni del moto e la comunicazione con il cervello centrale con un Arduino Mega.

@Federico:
Il problema è proprio quello.. come fare a farlo muovere? Il corpo umano usa micro impulsi per azionare i muscoli e sostanze chimiche per renderli più performanti.. ovviamente ricreare un sistema simile sarebbe un po' fuori dalla mia portata attuale..  ;D
Quindi è ovvio che il problema di tenere in tensione dei muscoli per tenere sollevato da terra lo scheletro, cosa che con i servi non esiste, è una questione cruciale.
Per ora sto ovviando al problema con una serie di perni che bloccano le giunture in una posizione, sempre attuati da nanomuscoli, e sembra funzionare bene.. vedremo se montando tutto ad uno scheletro e coordinando i movimenti delle zampe riuscirà a non essere troppo impacciato, ma la velocità di contrazione e allungamento di questi prodotti è davvero buona!
Vedremo..
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Apr 15, 2010, 04:45 pm
io tempo fa li ho visti anche su futura elettronica
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Apr 15, 2010, 05:31 pm
Sì esatto, anche loro li vendono.. non volevo fare pubblicità.. ;)
..e poi sono lievemente fuori mercato.. ma come tutti i venditori italiani online dopotutto.. forse perchè qui sono prodotti di nicchia..
..per un Arduino duemilanove si spendono in media dai 7 agli 11 euro in più e la spedizione è praticamente la stessa cifra che dagli usa.. contando che l'Arduino è prodotta in Italia e che con quei soldi ci faccio uscire un po' di materiale.. fate voi..  >:( >:(
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 23, 2010, 05:58 pm
Ciao a tutti ragazzi. Vista l'impossibilità di lavorare in gruppo su una realizzazione robotica, senza interferire con il lavoro degli altri, oppure solo immaginarsi le nostre sperimentazioni applicate vista la mancanza di una base comune, ho deciso di realizzare un kit di montaggio per un robot. Datemi qualche giorno per info piu' precise.
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Apr 25, 2010, 09:44 pm
Non ho capito i visti, ma sono curioso
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 26, 2010, 12:32 am
Ciao Fede!! Cosa intendi con i visti?  :D
Se intendi le motivazioni per cui sto sviluppando la base per sperimentazione è semplice.
Come hai visto sul thread creato da xqtm sul CNC arduino, è difficile permettere a una comunità di lavorare su un unico progetto. Il suo post secondo me è di un certo spessore (ma dov'è finito poi il post??) e soprattutto ben fatto il modello in tre dimesioni realizzabile a casa. Ci sono vari problemi di carattere pratico che limitano la possibilità di lavorare assieme da casa, a un qualsiasi progetto, nel caso del progetto CNC è mancata la possibilità di avere una base comune facilmente realizzabile (e vista la longevità media dei nostri interessi MOLTO facilmente realizzabile), ma soprattutto con la possibilità di upgrade e personale interpretazione del progetto, per permettere un'evoluzione radiale in tutte le possibili applicazioni. Io sto pensando a una struttura di base che permetta la sperimentazione  della programmazione con robot su ruote e le altre eventuali funzionalità: PID, mapping, telepresenza ecc. . Ognuno di noi a casa puo' lavorare sullo stesso progetto e allo stesso modo proporre una modifica, o un upgrade, o proporre i propri programmi.

Se non sbaglio calamaro mi ha mandato un link di un forum di appassionati super-nerd di C1P8 che lavorando assieme lo hanno fatto uguale in svariate versioni con diverse funzionalità: un lavoro incredibile.

I primi due workshop sono serviti a elaborare una base su cui sperimentare tutti assieme parallelamente:


(http://www.gioblu.com/GiO/robot/octagon/octagon-blu500x500.png)


http://www.gioblu.com/GiO/robot/octagon/DEFINITIVO.pdf


Come vedete la struttura è predisposta per montare:
-microservi frontali per movimentare sensori
-fori per servi
-cave per ruote servi
-fori per montare arduino
-fori per ruotino posteriore
-spazio studiato per alloggiare porta batterie 4xAAA
-4 fori per montare viti di fissaggio eventuale secondo livello

quello che serve per realizzare la base:
-Stampata di questo pdf in formato 1:1
-balsa max 3mm
-tagliarino affilato (occhio)
-resina bicomponente (epoxi)

come si realizza:
attaccare con biadesivo staccabile il foglio stampato alla balsa e ritagliare con taglierino la forma e forare con trapano dove serve (se proprio non volete usare il trapano usate viti da legno autofilettanti del diametro corretto). Dopo aver rimosso la stampa e lo scarto della stessa spargere un sottile strato di resina sulla balsa per irrigidire la struttura (diventa davvero rigida e resistente alle torsioni).

materiale necessario:
-due servi rotazione continua o da trasformare in rotazione continua
-due supporti per servi
-una ruota girevole

Questo piu' o meno è quello che è venuto fuori dai primi due workshop iniziali!! Chiaramente ogni domenica ci troveremo qua in via Savona, per continuare lo sviluppo. Chiunque sia interessato è il benvenuto, chiaramente gratuitamente.

Il bello sara' vedere  come interpreteranno gli altri utenti il nostro lavoro e che cosa proporranno  ;D.

Se scaricate il file e lo aprite con illustrator, ci sono gia tutti i livelli suddivisi e potrete facilmente modificare. Un'altra cosa comoda è che stampando il file o anche solo visualizzandolo 1:1 sullo schermo potrete raffrontare con i componenti in mano direttamente appoggiandoli sullo schermo (o sul foglio) e controllando se avete posizionato bene i vostri fori.
(o meglio facendolo sfiorare se no potreste rigarlo  :D).




Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Apr 26, 2010, 04:46 pm
ottimo, se abbiamo una base comune ci saranno tutti i presupposti per fare il progetto di un robot tutti insieme. Almeno ci possiamo confrontare e scambiarci le idee su come migliorare a vicenda i propri robot e confrontare i vari codici!
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Apr 26, 2010, 05:13 pm
Ciao a tutti!

Direi che questa cosa di realizzare un kit di partenza open source è molto utile, così ognuno può partire con il suo sviluppo e confrontarsi con gli altri in presa diretta, davvero grandi!!

Piccolo OT (..ma neanche troppo) veloce veloce!

Riguardo la "computer vision" invece qualcuno del post robotica (e affini) è interessato?
Io sto sviluppando un programma in C che gira su "processing", partendo da zero, dato che gli altri sono tutti a pagamento a quanto ho visto.
Per ora riconosce il colore di un pixel, se quello corrisponde al colore scelto, controlla una matrice di pixel circostante (di range stabilita dall'utente) e se la percentuale di pixel nella matrice del colore scelto è superiore ad un valore fissato dall'utente prova a tracciare uno spostamento, se superiore ad un certo valore prestabilito.
L'idea è quella di avere un simbolo colorato sulla schiena di un robot, poterlo riconoscere dall'alto con una telecamera e guidarlo lungo un percorso.
E' già praticamente tutto fatto, manca da ultimare la parte di tracciatura.

Se qualcuno fosse interessato al codice (ancora grezzo), ad implementare altre funzionalità o a darmi una mano a normalizzarlo, mi contatti, magari apriamo un post e cominciamo a lavorarci!

Un saluto!
Saki
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Apr 26, 2010, 05:23 pm
Ho visto che prevedi il movimento delle ruote attraverso dei servi modificati per rotazione continua...non ne ho molta esperienza però a me convince poco come soluzione anche se probabilmente è più partica.

Due motoriduttori o più semplicemente un Twin Gearbox della Tamiya sarebbe una soluzione più economica e un po' più laboriosa.

Che ne pensi?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 26, 2010, 05:34 pm
Ciao Federico, stiamo testando anche una versione per il twingearbox tamiya!! Unico problema, è la luce a terra. Diciamo che con le ruote cosi' piccole diventa difficile anche solo superare un tappeto e rende l'oggetto molto più giocattoloso. Comunque se pensi che vanno controllati i motori (vista la mancanza di controller motore) si rischia di spendere di piu' e avere una unità motrice peggiore.

Cosi' com'è la base permette di avere la possibilità di navigare in casa senza troppi problemi (superare tappeti, calze, vestiti leggeri, casa mia è un casino). Visto che il gearbox tamiya necessita di solo due fori di fissaggio li sto aggiungendo nel PDF per permettere di alloggiare anche questo tipo di unità motrice a scelta dell'utente.  :D
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on Apr 26, 2010, 06:02 pm
Beh effettivamente l'idea dei servo a rotazione continua è la più semplice, anche se non hanno nessun feedback per posizione e velocità.

Comunque per comandare i motori basterebbe un L293D che non è una gran spesa, ci sarebbe un po' di codice in più da scrivere e credo che si dovrebbe quuasi per forza aggiungere un encoder se si vuole qualcosa di preciso!
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Apr 27, 2010, 02:18 am
L'encoder ci vuole, ed è uno dei punti focali del nostro workshop, insieme allo sviluppo conseguente di un programma di mapping del movimento del robot e degli eventuali ostacoli incontrati durante il movimento.
Sara' divertente vedere dove e come verrano sventrati o modificati i servi per ottenere un feedback piu' preciso possibile. Per chi non ha voglia potra' ripiegare su componenti gia fatti presenti sul mercato (vedi solarbotics).
Anche l'acquisizione dei dati dal mondo esterno con i microservi (o senza) è un altro punto libero per la sperimentazione. Un ragazzo ha proposto lo sviluppo di un codice che in rapporto all'inclinazione dei microservi e al rilevamento dato dai sensori ricavare distanza e posizionamento dell'ostacolo percepito rispetto al robot (con teorema di pitagora). Piu' o meno quello che facciamo noi con gli occhi (vista in modo mooolto semplicistico)
Beh diciamo che lo spazio per la sperimentazione sembra esserci e alla fine era il goal che ci siamo prefissati di raggiungere  ;).
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on May 03, 2010, 03:35 am
Ciao a tutti ragazzi!
Ecco un video dove potete vedere la piattaforma di sviluppo:

http://www.youtube.com/watch?v=Km9XJVvacD8&feature=player_embedded

qui per il codice:
http://www.gioblu.com/index.php?option=com_content&view=article&id=71:da-ricevente-rc-ad-arduino&catid=39:comunicazione&Itemid=6

qui trovate l'articolo sul workshop di questa domenica:
http://www.gioblu.com/index.php?option=com_content&view=article&id=81&Itemid=36

vi aspettiamo domenica prossima per sviluppare tutti assieme PID e obstacle avoiding  :D

Cosa ne pensate? come fareste il PID?
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on May 03, 2010, 06:31 pm
FIGO  ;)
Title: Re: [Progetto comune] - Robotica
Post by: Federico_Vanzati on May 03, 2010, 08:29 pm
wow dal video i risultati sembrano buoni! Carino anche l'articolo 8-)
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on May 07, 2010, 07:59 pm
Ciao a tutti ragazzi. Ci troviamo domenica alle 14.30 per la sperimentazione del sensore di prossimità a riflessione basato su due led IR (http://www.gioblu.com/index.php?option=com_content&view=article&id=59:sensore-prossimita-led&catid=37:sensori&Itemid=18) e sulla stesura del codice necessario. In piu' lavoreremo sulla piattaforma di sviluppo robot.
Vi aspettiamo
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on May 11, 2010, 10:43 am
il mio robot si muove grazie a comandi sulla seriale, a breve l'articolo con pics e videi
EDIT
[media]http://www.youtube.com/watch?v=-sSzOonENFU[/media]
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on May 11, 2010, 03:18 pm
Bellissimo hahaha!!!
Bello anche il sottofondo musicale  ;D. Ma chi è caparezza?

Magari posta il codice sono curioso!  ;)
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on May 11, 2010, 03:59 pm
stavo ascoltando uochi toki - estetica
il codice è questo
Code: [Select]


#include <Servo.h>

Servo leftservo;  
Servo rightservo;
char a;
long previousMillis = 0;      
long interval = 200;

void setup()
{
 Serial.begin(9600);
 leftservo.attach(9);
 rightservo.attach(10);
 leftservo.write(90);  
 rightservo.write(90);
}


void loop()
{
   if(Serial.available() > 0){
   a = Serial.read();
   leftservo.write(90);  
   rightservo.write(90);
   switch(a){
   case 'w':
   previousMillis = millis();  
   while(millis() - previousMillis < interval) {
   Serial.println("avanti");
   leftservo.write(180);
   rightservo.write(180);
   }
   leftservo.write(90);  
   rightservo.write(90);
   break;
   case 's':
   previousMillis = millis();  
   while(millis() - previousMillis < interval) {
   Serial.println("indietro");
   leftservo.write(0);
   rightservo.write(0);
   }
   leftservo.write(90);  
   rightservo.write(90);
   break;
   case 'a':
   previousMillis = millis();  
   while(millis() - previousMillis < interval) {
   Serial.println("destra");
   leftservo.write(0);
   rightservo.write(180);
   }
   leftservo.write(90);  
   rightservo.write(90);
   break;
   case 'd':
   previousMillis = millis();  
   while(millis() - previousMillis < interval) {
   Serial.println("sinistra");
   leftservo.write(180);
   rightservo.write(0);
   }
   leftservo.write(90);  
   rightservo.write(90);
   break;
   case 'c':
   previousMillis = millis();  
   while(a != 'v') {
   Serial.println("avanti tutta");
   a = Serial.read();
   leftservo.write(180);
   rightservo.write(180);
   }
   leftservo.write(90);  
   rightservo.write(90);
   break;

   }
 }
}


ho un monte di prolunghe usb e volendo potrei mappare una stanza solo che il cavo è robosto e impedisce movimenti precisi. Poi i servi hanno un passo leggermente diverso e uno tira più dell'altro... devo risolvere sta cosa.
O mi prendo un'altro servo normale e lo modifico e mi prendo un servo a rotazione continua altrimenti detto "vericello"!
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on May 12, 2010, 03:17 am
Ciao ragazzi, scusate la mia sparizione ma sono afflitto da lavoro arretrato  ;D.
Qui vi allego il video della base di sviluppo con montati i sensori che abbiamo sviluppato al workshop!!

http://www.youtube.com/watch?v=s8n60nRRrBU

Nel video il robot procede in retromarcia per pura comodità (veniva comodo con la breadboard posizionata cosi'  ;))

Appena accedo al netbook posto il codice che muove il robot e pilota i LED.

Qui potete trovare il tutorial dei sensori, con l'algoritmo E.R.E.R. spiegato:http://www.gioblu.com/index.php?option=com_content&view=article&id=59:sensore-prossimita-led&catid=37:sensori&Itemid=18

Costo di realizzazione due sensori: 1.75 euro
Range: 1,2m al buio / 1-2 cm sole diretto nel beam


Grazie a tutti gli sviluppatori che hanno collaborato al concept e realizzazione.  :)

Cosa ne pensate? Avete qualche consiglio?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on May 14, 2010, 11:47 pm
Ciao a tutti. Ci troviamo domenica alle 15 per lavorare sulla piattaforma. Viste le richieste penso lavoreremo su un sistema di selfbalancing applicabile al robot che abbiamo sviluppato.
Vi aspettiamo
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on May 15, 2010, 01:10 pm
Implementato il controllo del robot tramite manopola play2 wireless, ma dato che non ho pile non posso mostrare nulla al pubblico :D mi sono appena arrivati i modulini radio a 433 MHz quelli come si interfacciano lo sapete?
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on May 15, 2010, 02:29 pm
[media]http://www.youtube.com/watch?v=8OACa-mgQWQ[/media]
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on May 16, 2010, 06:16 pm
Quote
Ciao a tutti. Ci troviamo domenica alle 15 per lavorare sulla piattaforma. Viste le richieste penso lavoreremo su un sistema di selfbalancing applicabile al robot che abbiamo sviluppato.
Vi aspettiamo


[media]http://www.youtube.com/watch?v=qq3vQ9mD8dM[/media]
Da Pistoia con amore :P
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on May 20, 2010, 07:33 am
Ciao Calamaro. Mi fa piacere vedere che non solo a Milano si sperimenta  :D. Ottimo ma che codice hai usato? Usi il filtro di Jordi?

Aggiornamento workshop:
Scusate se posto solo Giovedi' ma sto impazzendo di lavoro.
Domenica scorsa abbiamo lavorato a questo codice:
Code: [Select]
#include <Servo.h>
int sensorPin = 3;    // asse x accelerometro
int ledPin = 13;      //led pin (inutile)
double orientation = 0;  // orientamento attuale
double correctPosition = 0; // orientamento corretto
double primoGiro = 0; // val per calibrazione iniziale
unsigned int giri = 0;
Servo left;
Servo right;

void setup() {
 Serial.begin(9600);
 pinMode(ledPin, OUTPUT);  
 left.attach(10);
 right.attach(9);
 correctPosition = calcolo(); //calcolo posizione corretta
 //mantenere il robot parallelo al terreno
}

double calcolo() {
 double position = 0;
 for (int i = 0; i < 100; i++) {
 position = analogRead(sensorPin) + position;
}
position = position / 100;
return position;
} // facciamo una media grossolana

void loop() {
orientation = calcolo();
int delta = orientation - correctPosition;
delta = delta * abs(delta) / 3.75; //delta per se stesso per ottenere valore esponenziale (3.75 è il threshold, potete usare un trimmer viene comodo)
if (delta > 90) {
  delta = 90;
}
if (delta < -90) {
  delta = -90;
}
left.write(90 - delta);
right.write(90 + delta);
Serial.print("////posizione corretta////");
Serial.print(correctPosition);
Serial.print("////delta////");
Serial.print(delta);
Serial.print("///orientation////");
Serial.print(orientation);
Serial.println();
}


Quello che manca in questo codice è l'algoritmo di over control che permetta al robot di tornare in posizione corretta fermandosi (cosa che cosi' non sa fare, sa solo tornare corretto e correre in avanti :P).

E soprattutto il filtro di Kalman che permetta lo smoothing della variabile e la sua eventuale interpolazione con gli altri due assi dell'accelerometro.

Domenica lavoreremo proprio su questo.
Speriamo con l'incontro di riuscire a farlo stare in piedi correttamente  ;D

Visto che Sergio e Agostino mi chiedevano se era possibile avere una visualizzazione grafica dell'output accelerometro ho sviluppato questo veloce tutorial:http://www.gioblu.com/index.php?option=com_content&view=article&id=90:grafico-con-processing&catid=38:programmazione&Itemid=7
spero possa esservi utile.


Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on May 20, 2010, 08:23 am
Mi sono accorto ora che te usi un 90- delta io invece ho usato un map. del tipo

Code: [Select]
 if(angle*57.295779513082<20){
   stica = map(angle*57.295779513082, -50,14,0,90);
   leftservo.write(stica);  
   rightservo.write(stica);
   Serial.println(stica);
 }
 if(angle*57.295779513082>20){
   stica = map(angle*57.295779513082, 14,78,90,180);
   leftservo.write(stica);  
   rightservo.write(stica);
   Serial.println(stica);
 }

comunque ho usato il filtro di kalman dell'esempio di jordi solo che lui ha anche un giroscopio, io un l'ho :(
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on May 22, 2010, 02:29 pm
Hahahah stica mi piace come variabile.
Sei riuscito a risolvere il problema di oscillazione che si vede nel video?
In teoria con il filtro dovresti riuscire.
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jun 01, 2010, 07:04 am
Ciao a tutti ragazzi. Come promesso ci siamo trovati e abbiamo lavorato al filtro di Kalman. Devo ringraziare msx per i consigli utilissimi che ci ha dato per lo sviluppo del codice e chiaramente tutti i presenti che ci hanno lavorato.  

Siamo partiti dal codice di msx e lo abbiamo adattato, studiato e commentato in modo da funzionare con la IMU main board di sparkfun. Cosa che da un'attenta ricerca sul web sembra risultare a molti ostica (c'è davvero poco al riguardo e mal documentato).

Visto che il tempo è finito subito (e le chiacchiere non sono mancate, ammettiamolo  :))  ci siamo dilettati solo a test statici del sistema. Questo sembra essere davvero preciso.

Ho scritto un articolo riassuntivo sull'incontro:
http://www.gioblu.com/index.php?option=com_content&view=article&id=98:veloce-guida-al-filtro-di-kalman&catid=38:programmazione&Itemid=7http://www.gioblu.com/index.php?option=com_content&view=article&id=98:veloce-guida-al-filtro-di-kalman&catid=38:programmazione&Itemid=7

Spero possa esservi utile!!

Domenica prossima lavoreremo principalmente ai test pratici e in movimento del robot, per studiare il PID che è solo dichiarato:
Code: [Select]
#include <Servo.h>
#include <math.h>

Servo leftServo;
Servo rightServo;


/////////////////////////////////////////
#define NUMREADINGS 5       //Filtro spurie Giro [media di 5 valori in questo caso]
int readings[NUMREADINGS];  //Lettura del giroscopio
int index = 0;              //Index della lettura corrente
int total = 0;              //Il totale
int average = 0;            //La media
int inputPin =0;            //Gyro Analog input
///////////////////////////////////////

float dt = .1;              // .06; //( 1024.0 * 256.0 ) / 16000000.0; (Kalman)  // what does this means ?? hand tuned
 int mydt = 20;            //in ms.
 static float PP[2][2] = { //(Kalman)
   {
     1, 0   }
   ,                       //(Kalman)
   {
     0, 1   }
   ,                       //(Kalman)
};                          //(Kalman)


//I due stati, angolo ed errore sistematico del giroscopio. Come sottoprodotto
//della computazione dell'angolo, otteniamo anche la velocità angolare pulita
//dall'errore [bias]

float angle = 0.0;         //(Kalman)
float q_bias = 0.0;        //(Kalman)
float rate = 0.0;          //(Kalman)
float q_m = 0.0;           //(Kalman)

double ax_m=0;
double ay_m=0;
int cnt = 0;               //Counter
unsigned long lastread=0;
unsigned long startmillis=0;

//R rappresenta il valore della convarianza della lettura.
//In questo caso utiliziamo una matrice 1x1 che produce un' ipotesi
//di distorsione della lettura di 0.3 rad

float R_angle = .3;


//Q è una matrice 2x2 in cui viene processata la covarianza.
//Questa struttura ci permette di capire quanto, in rapporto alla
//covarianza stessa, è possibile fidarci dell'accelerometro o del giroscopio

static const float Q_angle = 0.001; //(Kalman)
static const float Q_gyro = 0.003; //(Kalman)
int ledPin = 13;

byte displayState = 0;    
float oldAngle = 0.0;

float P = 0.0; //dichiarazione P
float I = 0.0; //dichiarazione I
float D = 0.0; //dichiarazione D

void setup() {
 pinMode(ledPin, OUTPUT);
 Serial.begin(9600);
 
 for (int i = 0; i < NUMREADINGS; i++)
   readings[i] = 0;                      // initialize all the readings to 0 (gyro average filter)
   startmillis = millis();
 }
 float sqr(float a) {
  return a*a;  
 }
 float sgn (float a) {
   if (a > 0)
       return +1;
   else
       if (a < 0)
           return -1;
   else
       return 0;
}

 long readMAX127(byte chan) {
 byte control = 0x80 + (chan << 4);
 byte addr = 0x28;
 return 0;
}


void loop()
{
 int delta = millis()-lastread;
 if( delta >= mydt) {    //lettura ogni dt ms -> 1000/dt hz.
   lastread = millis();
   
   total -= readings[index];        // Sottrai la scorsa lettura giroscopio
   readings[index] = analogRead(2); // Lettura giroscopio
   total += readings[index];        // Aggiungi lettura al totale
   index = (index + 1);             // Aggiornamento indice

   if (index >= NUMREADINGS)        // Se siamo alla fine dell'array
     index = 0;                     // Torniamo all'inizio

   average = (total / NUMREADINGS)-500;    // Calcoliamo la media dell'input

   dt = ((float)delta) / 1000.0;

   q_m= ((float)average)*(1500.0/1024.0)*PI/180 ;  // HAC remove 1.5 mult

   // Togliamo le spurie dal giroscopio
   const float q = q_m - q_bias;  //(Kalman)

   const float Pdot[2 * 2] = {
     Q_angle - PP[0][1] - PP[1][0],  /* 0,0 */ //(Kalman)
     - PP[1][1], /* 0,1 */
     - PP[1][1], /* 1,0 */
     Q_gyro /* 1,1 */
   };

   // Salviamo in rate la stima del valore giroscopio pulito
   rate = q; //(Kalman)

   /*
// Aggioniamo la stima dell'angolazione

   /* Aggiorniamo la matrice della covarianza*/
   PP[0][0] += Pdot[0] * dt; //(Kalman)
   PP[0][1] += Pdot[1] * dt; //(Kalman)
   PP[1][0] += Pdot[2] * dt; //(Kalman)
   PP[1][1] += Pdot[3] * dt; //(Kalman)


   //INSERIAMO QUI I PIN DEI DUE ASSI DELL'ACCELEROMETRO
   ax_m = analogRead(3)- 338; // 338 è un valore utilizzato per regolare i gradi
   ay_m = analogRead(4)- 338; // idem
   const float angle_m = atan2( ay_m, ax_m ); //(Kalman)
   const float angle_err = angle_m - angle;   //(Kalman)
   const float C_0 = 1;                       //(Kalman)
   const float PCt_0 = C_0 * PP[0][0];        //(Kalman)
   const float PCt_1 = C_0 * PP[1][0];        //(Kalman)
   const float E =R_angle+ C_0 * PCt_0;       //(Kalman)
   const float K_0 = PCt_0 / E;               //(Kalman)
   const float K_1 = PCt_1 / E;               //(Kalman)
   const float t_0 = PCt_0;
   /* C_0 * P[0][0] + C_1 * P[1][0] (Kalman) */
   const float t_1 = C_0 * PP[0][1];
   /* + C_1 * P[1][1]  = 0 (Kalman) */
   PP[0][0] -= K_0 * t_0;                     //(Kalman)
   PP[0][1] -= K_0 * t_1;                     //(Kalman)
   PP[1][0] -= K_1 * t_0;                     //(Kalman)
   PP[1][1] -= K_1 * t_1;                     //(Kalman)
   angle += K_0 * angle_err;                  //(Kalman)
   q_bias += K_1 * angle_err;                 //(Kalman)

 //VALORE DI CALIBRAZIONE
 float calibration = -4.5;
 float myangle=(angle*57.2957795130823)-90.0 + calibration;
 if ((millis()-startmillis) > 6000 ) {
   digitalWrite(ledPin, HIGH);
   float rate_deg = rate * 57.2957795130823;
   // myangle is up at 0
   // motors is stopped at 128
   }
   oldAngle = myangle;
   Serial.print(" Angolo ");  
   Serial.print(int(angle_m * 57.295779513082) + 180, DEC);
   Serial.print(" Accelerometro Y ");
   Serial.print(ay_m, DEC);
   Serial.print(" Accelerometro X ");
   Serial.print(ay_m, DEC);
 }
   digitalWrite(ledPin, LOW);
}


Questo codice manda via seriale il dato pulito dell'inclinazione analizzando due assi accelerometro e il giroscopio.

Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jun 22, 2010, 01:12 pm
Ciao ragazzi. Scusate l'assenza ma siamo stati presi per approntare l'ecommerce e tutte le questioni burocratiche/legali.

Abbiamo portato avanti con Martino e Sergio il progetto self-balancing introducendo il PID come promesso.

Abbiamo costruito una proto con 3 potenziometri e due pulsanti digitali e le femmine dei pinhead x imu sparkfun. I tre potenziometri vengono utilizzati per regolare il PID in modo simile al sistema di Nicola Lugato, anche se abbiamo utilizzato un metodo differente per l'acquisizione del valore poteziometro e alcune rifiniture.

Il software combina e filtra (tramite filtro di Kalman) l'arco tangente dei due assi dell'accelerometro presi in considerazione e il valore ottenuto dal giroscopio, di conseguenza genera tramite l'algoritmo di correzione PID una reazione al movimento al fine di tornare nella posizione stazionaria.

Per creare il robot abbiamo utilizzato alcuni componenti del kit pico. Come potete vedere l'abbiamo abbassato per renderlo piu' stabile. Sperimentalmente parlando è decisamente opportuno partire da una base di sviluppo bassa e con il baricentro più in basso (rispetto all'asse delle ruote) e il più centrato possibile. Con questa forma sembra essere decisamente agile nei cambi di direzione.

C'è una grossa problematica che è decisamente il delay della reazione che lo porta ad entrare nella sorta di risonanza (vedi video). C'è qualcuno che ha qualche idea o qualche consiglio? Vi posto il codice:
Code: [Select]
#include <Servo.h>
#include <math.h>

float myangle = 0;
float pid = 0;

float P = 0.0; //dichiarazione P
float I = 0.0; //dichiarazione I
float D = 0.0; //dichiarazione D

long calibration = 90;
int calibrationUP = 6;
int calibrationDOWN = 5;

#define NUMREADINGSCOEF 10
int readingscoef[3][NUMREADINGSCOEF];
int indexcoef = 0;


/////////////////////////////////////////
#define NUMREADINGS 5    //Filtro spurie Giro [media di 5 valori in questo caso]
int readings[NUMREADINGS];  //Lettura del giroscopio
int index = 0;              //Index della lettura corrente
int total = 0;              //Il totale
int average = 0;            //La media
int inputPin =0;            //Gyro Analog input
///////////////////////////////////////

float dt = .1;              // .06; //( 1024.0 * 256.0 ) / 16000000.0; (Kalman)  // what does this means ?? hand tuned
 int mydt = 1;             //in ms.
 static float PP[2][2] = { //(Kalman)
   {
     1, 0   }
   ,                       //(Kalman)
   {
     0, 1   }
   ,                       //(Kalman)
};                          //(Kalman)


//I due stati, angolo ed errore sistematico del giroscopio. Come sottoprodotto
//della computazione dell'angolo, otteniamo anche la velocità angolare pulita
//dall'errore [bias]

float angle = 0.0;         //(Kalman)
float q_bias = 0.0;        //(Kalman)
float rate = 0.0;          //(Kalman)
float q_m = 0.0;           //(Kalman)

double ax_m=0;
double ay_m=0;
int cnt = 0;               //Counter
unsigned long lastread=0;
unsigned long startmillis=0;

//R rappresenta il valore della convarianza della lettura.
//In questo caso utiliziamo una matrice 1x1 che produce un' ipotesi
//di distorsione della lettura di 0.3 rad

float R_angle = .025;


//Q è una matrice 2x2 in cui viene processata la covarianza.
//Questa struttura ci permette di capire quanto, in rapporto alla
//covarianza stessa, è possibile fidarci dell'accelerometro o del giroscopio

static const float Q_angle = 0.001; //(Kalman)
static const float Q_gyro = 0.001; //(Kalman)
int ledPin = 13;

byte displayState = 0;    
float oldAngle = 0.0;
Servo left;
Servo right;

void setup() {
 left.attach(10);
 right.attach(9);
 pinMode(ledPin, OUTPUT);
 Serial.begin(19200);
 
 for (int i = 0; i < NUMREADINGS; i++)
   readings[i] = 0;                      // initialize all the readings to 0 (gyro average filter)
   startmillis = millis();
 }
 float sqr(float a) {
  return a*a;  
 }
 float sgn (float a) {
   if (a > 0)
       return +1;
   else
       if (a < 0)
           return -1;
   else
       return 0;
}

void loop() {
 int delta = millis()-lastread;
 if( delta >= mydt) {    //lettura ogni dt ms -> 1000/dt hz.
   lastread = millis();
   
   total -= readings[index];        // Sottrai la scorsa lettura giroscopio
   readings[index] = analogRead(3); // Lettura giroscopio
   total += readings[index];        // Aggiungi lettura al totale
   index = (index + 1);             // Aggiornamento indice

   if (index >= NUMREADINGS)        // Se siamo alla fine dell'array
     index = 0;                     // Torniamo all'inizio

   average = (total / NUMREADINGS);    // Calcoliamo la media dell'input

   dt = ((float)delta) / 1000.0;

   q_m= ((float)average)*(1500.0/1024.0)*PI/180 ;  // HAC remove 1.5 mult

   // Togliamo le spurie dal giroscopio
   const float q = q_m - q_bias;  //(Kalman)

   const float Pdot[2 * 2] = {
     Q_angle - PP[0][1] - PP[1][0],  /* 0,0 */ //(Kalman)
     - PP[1][1], /* 0,1 */
     - PP[1][1], /* 1,0 */
     Q_gyro /* 1,1 */
   };

   // Salviamo in rate la stima del valore giroscopio pulito
   rate = q; //(Kalman)

   /*
// Aggioniamo la stima dell'angolazione

   /* Aggiorniamo la matrice della covarianza*/
   PP[0][0] += Pdot[0] * dt; //(Kalman)
   PP[0][1] += Pdot[1] * dt; //(Kalman)
   PP[1][0] += Pdot[2] * dt; //(Kalman)
   PP[1][1] += Pdot[3] * dt; //(Kalman)


   //INSERIAMO QUI I PIN DEI DUE ASSI DELL'ACCELEROMETRO
   ax_m = analogRead(4)- 338; // 338 è un valore utilizzato per regolare i gradi
   ay_m = analogRead(5)- 338; // idem
   const float angle_m = atan2( ay_m, ax_m ); //(Kalman)
   const float angle_err = angle_m - angle;   //(Kalman)
   const float C_0 = 1;                       //(Kalman)
   const float PCt_0 = C_0 * PP[0][0];        //(Kalman)
   const float PCt_1 = C_0 * PP[1][0];        //(Kalman)
   const float E = R_angle + C_0 * PCt_0;     //(Kalman)
   const float K_0 = PCt_0 / E;               //(Kalman)
   const float K_1 = PCt_1 / E;               //(Kalman)
   const float t_0 = PCt_0;
   /* C_0 * P[0][0] + C_1 * P[1][0] (Kalman) */
   const float t_1 = C_0 * PP[0][1];
   /* + C_1 * P[1][1]  = 0 (Kalman) */
   PP[0][0] -= K_0 * t_0;                     //(Kalman)
   PP[0][1] -= K_0 * t_1;                     //(Kalman)
   PP[1][0] -= K_1 * t_0;                     //(Kalman)
   PP[1][1] -= K_1 * t_1;                     //(Kalman)
   angle += K_0 * angle_err;                  //(Kalman)
   q_bias += K_1 * angle_err;                 //(Kalman)

 //VALORE DI CALIBRAZIONE  
 
 if (digitalRead(calibrationUP) == HIGH) {
  calibration = calibration + 1;
  delay(100);
 }
 if (digitalRead(calibrationDOWN) == HIGH) {
  calibration = calibration - 1;
  delay(100);
 }
 
 myangle = (angle*57.2957795130823) + calibration;
 if ((millis()-startmillis) > 6000 ) {
   float rate_deg = rate * 57.2957795130823;
   }
   
 readingscoef[0][indexcoef] = analogRead(0);
 readingscoef[1][indexcoef] = analogRead(1);
 readingscoef[2][indexcoef] = analogRead(2);
 
 indexcoef = (indexcoef + 1) % NUMREADINGSCOEF;
 
 int totalcoef[3];
 
 for(int j = 0; j < 3; j++) {
   totalcoef[j] = 0;
   
   for(int k = 0; k < NUMREADINGSCOEF; k++)
     totalcoef[j] += readingscoef[j][k];
     
   totalcoef[j] /= NUMREADINGSCOEF;
 }
 
 float coefP = (float) totalcoef[0] * 5 / 1024;
 float coefI = (float) totalcoef[1] * 5 / 1024;
 float coefD = (float) totalcoef[2] * 5 / 1024;
 
 P = myangle * coefP;
 I = (I + myangle) * coefI;
 
 if(I * myangle < 0)
   I = 0;
 
 D = (myangle - oldAngle) * coefD;
 
 pid = P+I+D;
 
 if (pid >= 90)
  pid = 90;
 
 if (pid <= -90)
  pid = -90;
 
 left.write(90 - pid);
 right.write(90 + pid);
 
 Serial.print("P ");
 Serial.print(coefP);
 Serial.print(" I ");
 Serial.print(coefI);
 Serial.print(" D ");
 Serial.print(coefD);
 Serial.print(" A ");
 Serial.print(myangle);
 Serial.print(" C ");
 Serial.println(calibration);

 
 oldAngle = myangle;
 }
}


Verso la fine del video potete vedere i primi test di avanzamento, con un buon software immaginate che agilità e che effetto un oggettino del genere che gira per la casa. Non vediamo l'ora di finirlo.

E' ancora abbastanza posticcia la posizione della batteria, vista la a-simmetria nella distribuzione del peso dei servomotori (il motore è da un lato non al centro) porta il robot a essere sbilanciato in un senso.

[media]http://www.youtube.com/watch?v=RaN0itBbVR4[/media]


Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Jun 22, 2010, 02:07 pm
Ragazzi io aggiungerei soltanto una cosa, questo codice e` veramente PRO quindi vi consiglio di leggervelo, studiarvelo e salvarlo da qualche parte. I filtri di Kalman sono utilizzati molto nell'ambito dei processi di acquisizione di dati per ripulire dai disturbi.
Trovo che l'implementazione di questi filtri su un Arduino sia una cosa assolutamente innovativa. Non lo dico solo perche` sono del team, avendo comunque studiato sta roba in linea teorica, vederla applicata mi ha aiutato a capirne le dinamiche.
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Jun 22, 2010, 08:20 pm
Scusate mi sono poco chiare due cose.

@calamaro
hai qualche riferimento/documentazione per il wireless dal controller stile ps2? Si puo' fare anche con moduli 313mhz? Vorrei sperimentare in tal senso...

@gbm
leggo che avete inserito un giroscopio e un accellerometro (o forse uno solo o tutti e due?) ma non ho trovato riferimenti a cosa utilizzate. L'implementazione di questi rende molto piu' costoso il progetto o sbaglio? Possiedo un accellerometro adxl335 se non sbaglio ma non un giroscopio perche' appunto costicchiano...
Cosa usate di preciso? Mi indichi la pagina dove lo spiegate se c'e', perche' non trovo?

Grazie, Fede
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Jun 23, 2010, 12:37 am
per quanto riguarda la ps2 qui spiegano il protocollo
http://store.curiousinventor.com/guides/PS2#hardware
qui trovi delle librerie aggiornate ma che non ho testato personalmente
http://www.billporter.info/?p=240
qui trovi la libreria che uso io
http://www.arduino.cc/playground/Italiano/ArduinoPsx
Le manopole wireless della ps2 lavorano sui 2GHz e qualcosa, io ho i moduli a 700 e rotti MHz e sono sempre incartati perche` non ho avuto modo di giocarci :D

la IMU di gbm e` un 5 DOF di sparkfun ma credo che tu possa fare un autobalance con semplicemente un giroscopio (cit Gbm).
geometrie. con 5 dof viene bene perche` ti calcoli le velocita` angolari sia tramite accelerometro che tramite giroscopio, in questo modo sai sempre se uno dei due sta mentendo.
Puoi farlo anche con un 3 assi. Devi un attimino sbatterti sulle
Dovrai trovarti la velocita` angolare del corpo del robot, quindi calcolarti il movimento da fare per riportarlo a 0. Magari riprendendo in mano Metodi e Fisica1 ci si potrebbe arrivare :D  :-/ i dati pero` andranno ugualmente filtrati che a quanto ho visto sti chippettini ti mandano anche un monte di robaccia.
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jun 23, 2010, 02:41 am
Ragazzi ho trovato il problema, all'alba delle 2.36 AM chiaramente.
Allora nel codice se spulciate c'è float R_angle, questo valore rappresenta la stima di quanto crediamo che sbaglierà il giroscopio, in radianti. Piu' la stima dell'errore è alta piu' il delay di funzionamento della IMU rispetto al movimento è alto, ma allo stesso tempo si riduce l'errore dato da vibrazioni e accelerazioni laterali. In poche parole esiste un setting di float R_angle che permette un equilibrio tra velocità di acquisizione e pulizia del dato acquisito.

X Fede. Nel video c'è un accenno, dormo qualche ora e poi iniziero' la documentazione sul sito.

Incredibile quanto sia preciso questo software, posso utilizzare arduino come un lazzo da cowboy per vari secondi e riposizionando la IMU a 90 gradi rispetto al terreno il valore torna su 90!! Perchè sente l'accelerazione gravitazionale!! E' bellissimo!!!!! :D :D

codice aggiornato:
Code: [Select]
#include <Servo.h>
#include <math.h>

float myangle = 0;
float pid = 0;

float P = 0.0; //dichiarazione P
float I = 0.0; //dichiarazione I
float D = 0.0; //dichiarazione D

#define NUMREADINGSCOEF 1
int readingscoef[3][NUMREADINGSCOEF];
int indexcoef = 0;


/////////////////////////////////////////
#define NUMREADINGS 1    //Filtro spurie Giro [media di 5 valori in questo caso]
int readings[NUMREADINGS];  //Lettura del giroscopio
int index = 0;              //Index della lettura corrente
int total = 0;              //Il totale
int average = 0;            //La media
int inputPin =0;            //Gyro Analog input
///////////////////////////////////////

float dt = .1;              // .06; //( 1024.0 * 256.0 ) / 16000000.0; (Kalman)  // what does this means ?? hand tuned
 int mydt = .1;             //in ms.
 static float PP[2][2] = { //(Kalman)
   {
     1, 0   }
   ,                       //(Kalman)
   {
     0, 1   }
   ,                       //(Kalman)
};                          //(Kalman)


//I due stati, angolo ed errore sistematico del giroscopio. Come sottoprodotto
//della computazione dell'angolo, otteniamo anche la velocità angolare pulita
//dall'errore [bias]

float angle = 0.0;         //(Kalman)
float q_bias = 0.0;        //(Kalman)
float rate = 0.0;          //(Kalman)
float q_m = 0.0;           //(Kalman)

double ax_m=0;
double ay_m=0;
int cnt = 0;               //Counter
unsigned long lastread=0;
unsigned long startmillis=0;

//R rappresenta il valore della convarianza della lettura.
//In questo caso utiliziamo una matrice 1x1 che produce un' ipotesi
//di distorsione della lettura di 0.3 rad

float R_angle = .02;


//Q è una matrice 2x2 in cui viene processata la covarianza.
//Questa struttura ci permette di capire quanto, in rapporto alla
//covarianza stessa, è possibile fidarci dell'accelerometro o del giroscopio

static const float Q_angle = 0.001; //(Kalman)
static const float Q_gyro = 0.001; //(Kalman)
int ledPin = 13;

byte displayState = 0;    
float oldAngle = 0.0;
Servo left;
Servo right;

void setup() {
 left.attach(10);
 right.attach(9);
 pinMode(ledPin, OUTPUT);
 Serial.begin(19200);
 
 for (int i = 0; i < NUMREADINGS; i++)
   readings[i] = 0;                      // initialize all the readings to 0 (gyro average filter)
   startmillis = millis();
 }
 float sqr(float a) {
  return a*a;  
 }
 float sgn (float a) {
   if (a > 0)
       return +1;
   else
       if (a < 0)
           return -1;
   else
       return 0;
}

void loop() {
 int delta = millis()-lastread;
 if( delta >= mydt) {    //lettura ogni dt ms -> 1000/dt hz.
   lastread = millis();
   
   total -= readings[index];        // Sottrai la scorsa lettura giroscopio
   readings[index] = analogRead(3); // Lettura giroscopio
   total += readings[index];        // Aggiungi lettura al totale
   index = (index + 1);             // Aggiornamento indice

   if (index >= NUMREADINGS)        // Se siamo alla fine dell'array
     index = 0;                     // Torniamo all'inizio

   average = (total / NUMREADINGS);    // Calcoliamo la media dell'input

   dt = ((float)delta) / 1000.0;

   q_m= ((float)average)*(1500.0/1024.0)*PI/180 ;  // HAC remove 1.5 mult

   // Togliamo le spurie dal giroscopio
   const float q = q_m - q_bias;  //(Kalman)

   const float Pdot[2 * 2] = {
     Q_angle - PP[0][1] - PP[1][0],  /* 0,0 */ //(Kalman)
     - PP[1][1], /* 0,1 */
     - PP[1][1], /* 1,0 */
     Q_gyro /* 1,1 */
   };

   // Salviamo in rate la stima del valore giroscopio pulito
   rate = q; //(Kalman)

   /*
// Aggioniamo la stima dell'angolazione

   /* Aggiorniamo la matrice della covarianza*/
   PP[0][0] += Pdot[0] * dt; //(Kalman)
   PP[0][1] += Pdot[1] * dt; //(Kalman)
   PP[1][0] += Pdot[2] * dt; //(Kalman)
   PP[1][1] += Pdot[3] * dt; //(Kalman)


   //INSERIAMO QUI I PIN DEI DUE ASSI DELL'ACCELEROMETRO
   ax_m = analogRead(4)- 338; // 338 è un valore utilizzato per regolare i gradi
   ay_m = analogRead(5)- 338; // idem
   const float angle_m = atan2( ay_m, ax_m ); //(Kalman)
   const float angle_err = angle_m - angle;   //(Kalman)
   const float C_0 = 1;                       //(Kalman)
   const float PCt_0 = C_0 * PP[0][0];        //(Kalman)
   const float PCt_1 = C_0 * PP[1][0];        //(Kalman)
   const float E = R_angle + C_0 * PCt_0;     //(Kalman)
   const float K_0 = PCt_0 / E;               //(Kalman)
   const float K_1 = PCt_1 / E;               //(Kalman)
   const float t_0 = PCt_0;
   /* C_0 * P[0][0] + C_1 * P[1][0] (Kalman) */
   const float t_1 = C_0 * PP[0][1];
   /* + C_1 * P[1][1]  = 0 (Kalman) */
   PP[0][0] -= K_0 * t_0;                     //(Kalman)
   PP[0][1] -= K_0 * t_1;                     //(Kalman)
   PP[1][0] -= K_1 * t_0;                     //(Kalman)
   PP[1][1] -= K_1 * t_1;                     //(Kalman)
   angle += K_0 * angle_err;                  //(Kalman)
   q_bias += K_1 * angle_err;                 //(Kalman)

 //VALORE DI CALIBRAZIONE  
 myangle = (angle*57.2957795130823) + 101;
 if ((millis()-startmillis) > 6000 ) {
   float rate_deg = rate * 57.2957795130823;
   }
   
 readingscoef[0][indexcoef] = analogRead(0);
 readingscoef[1][indexcoef] = analogRead(1);
 readingscoef[2][indexcoef] = analogRead(2);
 
 indexcoef = (indexcoef + 1) % NUMREADINGSCOEF;
 
 int totalcoef[3];
 
 for(int j = 0; j < 3; j++) {
   totalcoef[j] = 0;
   
   for(int k = 0; k < NUMREADINGSCOEF; k++)
     totalcoef[j] += readingscoef[j][k];
     
   totalcoef[j] /= NUMREADINGSCOEF;
 }
 
 float coefP = (float) totalcoef[0] * 5 / 1024;
 float coefI = (float) totalcoef[1] * 5 / 1024;
 float coefD = (float) totalcoef[2] * 5 / 1024;
 
 P = myangle * coefP;
 I = (I + myangle) * coefI;
 
 if(I * myangle < 0)
   I = 0;
 
 D = (myangle - oldAngle) * coefD;
 
 pid = P+I+D;
 
 if (pid >= 90)
  pid = 90;
 
 if (pid <= -90)
  pid = -90;
 
 left.write(90 - pid);
 right.write(90 + pid);
 
 /*Serial.print("P ");
 Serial.print(coefP);
 Serial.print(" I ");
 Serial.print(coefI);
 Serial.print(" D ");
 Serial.println(coefD);
 Serial.println(myangle);*/
 
 Serial.println(myangle);
 
 oldAngle = myangle;
 }
}


C'è solo una rifinitura che non riesco a inquadrare perfettamente... eventualmente utilizzare il terzo asse dell'accelerometro per avere maggiori info...ecco sempre se ha senso. Ma visto che c'è  :D cosa ne dite?
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jun 24, 2010, 10:36 am
Ehm.. domanda stupida.. ma non doveva essere un robot lava pavimenti?.. come siete approdati alla soluzione dell'autobalancing e dei filtri di Kalman??.. capisco che Arduino porti a voli pindarici non da poco, ma il progetto iniziale direi che è completamente andato?..  ;)
..ero fiducioso di arrivare qui e trovare qualcosa di utile anche per me, da poter implementare con il sistema di CV che sto sviluppando, per guidare un bel drone lava pavimenti in giro per la casa, ma ora mi aspetto di vedere dei razzi a propulsione e un sistema di navigazione orbitale da un momento all'altro..  ;D
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jun 24, 2010, 03:19 pm
Ciao Saki. Si indubbiamente ci siamo lasciati prendere dalla matematica, ma la scelta democratica durante i workshop ci ha portati verso questa direzione. Ovviamente, abbiamo utilizzato strumenti matematici che potrebbero risultare utili a progetti come quello citato da te. Infatti l'algoritmo PID è una delle scelte più semplici ed utilizzate per movimentare un drone del genere.
Ma che tipo di robot vorresti realizzare?
Con che tipo di unità motrici?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jun 29, 2010, 06:07 am
Ciao a tutti ragazzi. Questo week-end sono stato inchiodato a Milano per varie vicissitudini familiari, perdendomi clamorosamente Neverland e quindi il grande incontro dedicato (al vino) e alla robotica. Sono sicuro vi siate divertiti!!

Tornando alla risposta di Saki:

"Ehm.. domanda stupida.. ma non doveva essere un robot lava pavimenti?.. come siete approdati alla soluzione dell'autobalancing e dei filtri di Kalman??.. capisco che Arduino porti a voli pindarici non da poco, ma il progetto iniziale direi che è completamente andato?..  

..ero fiducioso di arrivare qui e trovare qualcosa di utile anche per me, da poter implementare con il sistema di CV che sto sviluppando, per guidare un bel drone lava pavimenti in giro per la casa, ma ora mi aspetto di vedere dei razzi a propulsione e un sistema di navigazione orbitale da un momento all'altro..  "

Solo dopo questa risposta ho capito che si doveva partire da una base più semplice, seguendo il principio K.I.S. (keep it simple) ho sviluppato questo tutorial per permettere a chi non c'è stato di capire meglio cosa abbiamo sviluppato in questi workshop:
(http://www.gioblu.com/images/picofront.jpg)
Questo robot si basa sul kit pico, che è un piccolissimo automa a 3 ruote, con classica ruotina posteriore pivotante. Diciamo che è studiato per dare capacità di movimento nello spazio a una scheda arduino e permettere di approcciare alla robotica economicamente, o almeno l'idea iniziale era quella poi siamo sfociati nel self-balancing e quindi il mio  è stato adattato per questo utilizzo.
(http://www.gioblu.com/images/picotrequarti.jpg)

Il robot è composto da:
2x ruote per servi/microservi con pneumatico in foam
2x staffe microservi
2x microservi (in questo caso Turborix)
2x sensori ir possibilmente analogici (in questo caso SHARP)
1x Arduino duemilanove
1x layer Pico
1x portabatterie 4xAAA
4x batterie stilo AAA

Questo primo prototipo è in grado solo di mantenere una posizione bilanciata e correggere eventuali errori di inclinazione. Per farlo utilizza due semplicissimi sensori Sharp, che in realtà non sono esattamente studiati per rilevare cosi' brevi distanze (in teoria sono utilizzati per range da 50 a 3cm io li uso tra 3 e 0 ), ma sembrano fare decisamente bene il loro lavoro.
(http://www.gioblu.com/images/pico%20down.jpg)
L'algoritmo che ho scritto è semplicissimo: calcolo la distanza dal suolo per ognuno dei due sensori, e sottraggo la prima alla seconda. Se il robot è parallelo al terreno il valore sarà 0 o vicinissimo allo 0 (micro-correzioni). Quindi basterà scrivere: Servo.write(90 + il nostro valore); per ottenere una reazione in rapporto alle due distanze rilevate dai sensori. Cioè il nostro valore sarà negativo se il primo dei due sensori otterrà una rilevazione minore della seconda, o positivo in caso contrario.

Code: [Select]
#include <Servo.h>

Servo left;
Servo right;

#define servoLeftPin     9
#define servoRightPin   10
#define servoZero       81
#define IRFront         0
#define IRBack          1
#define ledPin          13

int frontSense = 0;
int backSense = 0;
int orientation = 0;


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;
 }
}
}


void loop() {
getOrientation();

float delta = orientation / 10;
if(delta > 90) delta = 90;
if(delta < -90) delta = -90;

left.write(81 - delta);
right.write(81 + delta);

Serial.print(orientation);
Serial.print("   ");
Serial.println(delta);
}


Qui il video (non riesco a embeddarlo mi embedda quello precedentemente postato?!?!)
http://www.youtube.com/watch?v=18pmm4bZ20c

Ecco tutto, fatto il self-balancing .
Qui dentro ragazzi c'è tutto quello che serve. Se analizzate il primo programma da noi postato sul self-balancing grazie a IMU e questo, sono del tutto simili, ed entrambi utilizzano sistemi fondamentali per noi potenziali creatori di automi. Il valore delta, buttato direttamente in servo.write, è definibile come la P del PID. Infatti il robot è in grado solo di correggere non oltre una quindicina di gradi di inclinazione per lato e chiaramente solo sul posto, non in movimento, proporzionalmente all'errore di inclinazione. La mancanza della I e della D si sentono infatti se il robot accelera in una direzione.

La semplicità di questo sistema permette più o meno a chiunque di poterlo testare con ciarpame di recupero e componenti a costo irrisorio. Con questo bisogna chiaramente prendere atto delle elevate limitazioni di questo sistema, per esempio senza almeno un accelerometro che determini il reale vettore gravità i nostri amici non potranno mai fare una salita o una discesa.

Ho capito, scrivero' un articolo sul PID.  ;D

Qui l'articolo originale: http://www.gioblu.com/index.php?option=com_content&view=article&id=100:self-balancing-robot-per-noobs-p&catid=36:robotica&Itemid=34

Title: Re: [Progetto comune] - Robotica
Post by: guiott on Jun 29, 2010, 10:03 am
Per farlo utilizza due semplicissimi sensori Sharp, che in realtà non sono esattamente studiati per rilevare cosi' brevi distanze (in teoria sono utilizzati per range da 50 a 3cm io li uso tra a 3 e 0 ), ma sembrano fare decisamente bene il loro lavoro

Complimenti per il lavoro. La capacità di fare cose semplici, ben documentate, alla portata di tutti e che funzionano anche bene non è una cosa banale.

Volevo solo chiarire un attimo il discorso degli Sharp. Non è una magia il fatto che funzionino anche da 0 a 3cm.

Se guardate a pag.9 di questo documento, potete vedere la curva di risposta dei sensori.

http://www.acroname.com/robotics/parts/GP2D120_SS.pdf

Sotto la distanza minima dichiarata il comportamento semplicemente si inverte.

Usandoli nel modo giusto, considerando che la tensione di uscita aumenta all'aumentare della distanza, invece che diminuire come nel range di misura di funzionamento normale, funzionano anche abbastanza linearmente. Tenendo conto che tu li stai usando non come misura assoluta ma relativa tra i due, è una furbata niente male.

Attenzione però che vanno usati esattamente esattamente in quel range, diverso da modello a modello come si può vedere in questo documento:

http://www.acroname.com/robotics/info/articles/sharp/sharp.html

Se analizzi la curva sul documento precedente infatti, puoi vedere che non c'è modo di capire se la distanza è, ad esempio, di 2 o di 5cm. La tensione di uscita è la stessa. Quindi: o sei sicuro che la distanza misurata è tra 0 e 3cm o sei sicuro che è tra 3 e 50cm. Non puoi usarli, ad esempio, tra 0 e 10cm.
Title: Re: [Progetto comune] - Robotica
Post by: kokiua on Jun 29, 2010, 11:34 am
L'idea dei due sensori è decisamente intrigante, e anche farlo muovere avanti e indietro non è certo un problema visto che ti sarà sufficiente spostare (in proporzione alla velocità che vuoi ottenere)  in + o in - il punto zero nel confronto che fai, facendogli così "rincorrere" il punto di equilibrio che non arriva sino a quando non riporti lo zero nella posizione corretta.
Un pochino più complicato forse sarà il farlo girare, perchè si tratterà di lievissime differenze dello sbilanciamento tra i due servi  ;)

Comunque sia, complimenti per l'idea! Bravo!
Title: Re: [Progetto comune] - Robotica
Post by: kokiua on Jun 29, 2010, 11:46 am
Quote
senza almeno un accelerometro che determini il reale vettore gravità i nostri amici non potranno mai fare una salita o una discesa.

Utilizzando un semplice sensore ottico da mouse posto al centro, di fatto puoi fare a meno anche di un accelerometro, perchè ti basterà correggere il punto zero sino a quando non rileverai che il tutto si ferma, e con il "mouse" puoi determinare esattamente in quale direzione ti stai spostando e quindi dove si trova "all'incirca" anche il punto di equilibrio... o no?   :-?
Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jun 29, 2010, 06:34 pm
io ho avuto un'idea che potrebbe tornare utile...
l'idea è questa:
per diminuire l'effetto "beccheggio" potreste (tramite un servo centrale) spostare un peso messo in cima ad un braccetto di lunghezza adok in avanti o indietro in modo da controbilanciare l'inclinazione  invece di farlo con le ruote, forse così si riesce a separare il bilanciamento dal movimento, e diventa tutto più semplice. :)
Edit:
aggiungendo robe il peso potrebbe cambiare, ma basterebbe rendere il peso mobile sul braccio con un grano di bloccaggio.
altro piccolo problemino potrebbe essere la velocità di reazione del servo, ma adesso ci sono servi abbastanza veloci da poter superare il problema.
Title: Re: [Progetto comune] - Robotica
Post by: kokiua on Jun 29, 2010, 06:48 pm
Anche il portare in peso da una parte all'altra richiede una capacità di reazione tale che dubito possa funzionare bene... e poi si rischia di peggiorare l'effetto (stiamo parlando di Arduino ;) )

Me lo immagino che balzella in qua e la con un peso che oscilla nel tentativo di stabilizzare il tutto  ;D (molto comico ;D )

Per stabilizzare eventuali oscillazioni può essere utilizzato anche un volano centrale... ma la cosa migliore è un controllo più preciso sulle ruote (maggiore la precisione minore il "beccheggio") e forse l'utilizzo di servi standard non è proprio la soluzione ideale, forse sarebbe meglio dei passo passo di precisione (ma tutto dipende anche dal costo totale ;) )
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Jun 29, 2010, 06:52 pm
Siccome ho visto modelli autobilancianti su questo forum anche di dimensioni notevoli e alti quasi un metro, credo che le richieste per andare bene siano due: la costruzione hardware e il software! :)
Comunque da quello che ho visto in giro e' fattibile. Forza.
F
Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jun 29, 2010, 07:01 pm
;D ;D per un istante "è partito il filmato" di quello che ha scritto kokiua ;D ;D
però con un servo tipo questo http://www.hitecrcd.com/products/servos/digital/hv-ultra-premium-digital/hs-7940th.html forse il sistema sarebbe abbastanza rapido (costi permettendo), e poi nelle piattaforme, in mare aperto, si usa una cosa simile, se non sbaglio, per stabilizzarle  ::)

edit: se disponete di un imu allora qui ho trovato roba che potrebbe interessare (magari l'avete già visto):
http://sites.google.com/site/onewheeledselfbalancing/Home/easy-build-low-cost-arduino-self-balancer
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jun 30, 2010, 03:14 am
Grazie dei complimenti raga ma è proprio una cavolata!! Piu' che altro mi fa piacere di aver creato un oggetto che sta in piedi da solo e corregge in un range di 25 / 30 gradi (totali), con 53 linee di codice  ;)
Un grande grazie va a Martino che come al solito si diverte con me a creare questi oggettini.

Quindi vorreste tiltare le batterie ;D.
E' sorto un mega-dibattito con Martino, proprio sulla problematica del rallentare. Cioè come si puo' rallentare con una struttura in equilibrio senza rovesciarla nella direzione del senso di marcia. Ho notato sperimentalmente che il principale problema di un selfbalancing che esca dalla situazione statica è rallentare la sua corsa per correggere. Nei programmi postati da me in precedenza manca una cosa fondamentale, prendere in considerazione l'inerzia ottenuta da una eventuale accelerazione. Molti di voi avranno impennato o visto moto impennare. C'è chi ha la dote che ci serve, cioè chi sa impennare decelerando, alcuni sanno anche quasi fermarsi ancora in equilibrio. Come? Controbilanciando il momento dato dalla decelerazione inclinando verso la direzione opposta al moto la struttura e quindi il peso. Piu' si vorrà frenare piu' il codino rischiera' di grattare a terra se si vuole rimanere in equilibrio (passatemi la metafora sono un motardista). Credo che il PID da solo non sia in grado di fare questo.

Credo ci voglia un termine da inserire che vari in rapporto a inclinazione * ultimo comando dato ai servi (cioè velocità attuale). Un valore che vari quando velocità e angolo aumentano. Come un motociclista deve saper togliere gas (o meglio frenare) se sta per ribaltarsi indietro  e accelerare se sta per appoggiare la ruota e rimanere in quel sottile angolo che mantiene stabile il mezzo fino all'arresto e all'esaurimento della forza di inerzia, tutto questo variando l'intervento in rapporto alla forza di inerzia a cui è soggetto (e quindi calcolare il momento ottenuto dall'eventuale frenata in rapporto alla velocità). Per ora come potrete sperimentare il robot se viene spinto con forza si riposiziona corretto ma non sa che sta andando in una direzione, quindi toglie motore perchè per lui cosi' è ok, di conseguenza per momento dato dalla decelerazione si ri-inclina, questo ciclicamente fino a quando arriva alla massima velocità e non avendo piu' momento imprimibile (accelerazione) cade nel senso di marcia.
Sarei curioso di sapere cosa ne pensa Guido.
Magari muovento il peso si puo' fare le veci del motociclista meglio che semplicemente frenando e accelerando.

Mi fa piacere che vi abbia intrippato la cosa  ;)
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Jun 30, 2010, 02:07 pm
ho visto il progetto sul mio rss che segue let's make robots!
Title: Re: [Progetto comune] - Robotica
Post by: guiott on Jun 30, 2010, 02:19 pm
Sono la persona meno adatta, non sono mai salito su una moto :)
Scherzi a parte, secondo me si può anche fare senza muovere un peso, però devi sapere con una buona precisione tutto quello che succede. Come hai detto anche tu, i sensori IR ti fanno stare sempre parallelo al terreno, che non è necessariamente la stessa cosa di stare dritto.
Con un accelerometro puoi bilanciare il tutto, quando freni si inclina automaticamente indietro per compensare la decelerazione, a lui interessa che la somma vettoriale sia = 0. Se si aggiunge il vettore della decelerazione, si inclina per avere  il vettore risultante sempre rivolto verso il centro della terra. Che è poi quello che fa il motociclista con il suo senso dell'equilibrio e i sensori vestibolari.
Questo in teoria, non ho la pratica necessaria per capire quanti accelerometri servono e/o se ci vogliono anche dei giroscopi.
Segaway docet:
http://www.segway.it/default.aspx?tabid=120
Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jun 30, 2010, 03:41 pm
ho dato un'occhiata al codice del segway e (per quanto ho potuto capire) funziona ma fino ad un certo punto...
se si inclina troppo, l'algo rinuncia al bilanciamento e "spegne" i motori.
::)
Title: Re: [Progetto comune] - Robotica
Post by: guiott on Jun 30, 2010, 03:47 pm
se si inclina troppo, l'algo rinuncia al bilanciamento e "spegne" i motori


con conseguente craniata del passeggero? :)

E pensare che quello usa diversi accelerometri e giroscopi.
Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jun 30, 2010, 04:02 pm
http://www.youtube.com/watch?v=BD-y8F1Fa7g  :)
con spegne non volevo chiaramente dire che disalimenta ma che non controlla più il bilanciamento :) lo avevo virgolettato apposta.
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jun 30, 2010, 04:36 pm
Ciao guido, brain, Fede, grazie per le risposte. Ieri notte sono andato a letto tardissimo perchè il mio cervello è partito per la tangente.
Ragionavo su un eventuale algoritmo del genere:

C (correzione) = [P (proporzionale o differenza dei valori ir) + S (ultimo comando dato ai servi)] + (S - K)
cioè la correzione è uguale alla differenza tra i due sensori + la velocità dei servi + la velocità dei servi meno quanto voglio decelerare in un loop. In poche parole:

(P+S) è un valore che si azzera in un certo punto in rapporto alla velocità, (infatti P scende quando sta salendo la velocità  ;)) che è il punto di equilibrio piu' lo scarto che serve per rallentare in rapporto a quanto stiamo andando + la velocità attuale ( se no il robot si fermerebbe perchè la correzione sarebbe = 0) - quanto vogliamo decelerare.


In teoria a conti fatti stanotte (non troppo precisamente) cosi' (P + S) diventano 0 spostati rispetto al reale 0 di solo P (storpiamento del giuin rapporto alla velocità dei servi) sommati alla velocità attuale meno qualcosina, seguendo i loop portano l'oggetto a fermarsi tenendo conto della velocità  :D

poniamo di essere fermi:
C = 0 + 0 + 0 - K <- K è una variabile con cui si puo' gestire in che direziona andare il robot. Che puo' variare in rapporto ai sensori ostacolo per esempio.

poniamo che S = 12 p = -21
C = -21+12+12-1 -> 2 -> cioè motori quasi fermi.

Sto delirando?


Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jun 30, 2010, 09:17 pm
a vederlo così non fà una piega, ma le forze in gioco sono dei vettori che cambiano direzione durante gli eventi, mentre il calcolo mi sembra molto lineare...
ma hai già provato a mettere giù il codice per implementare l'idea?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 01, 2010, 08:24 am
Ok P+S + S-K lo devo ancora testare anche se credo ci sia un errore di concetto alla base, spero di trovare un minimo di tempo per lavorarci. Nei pochi momenti liberi ho aggiunti la auto get up function  :D a PICO.
http://www.youtube.com/watch?v=aTZNH05Dl0s

Code: [Select]
Servo left;
Servo right;

#define servoLeftPin     9
#define servoRightPin   10
#define servoZero       81
#define IRFront         0
#define IRBack          1
#define ledPin          13

int frontSense = 0;
int backSense = 0;
int orientation = 0;
int fall = 0;


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;
 }
}
}


void loop() {
getOrientation();

float delta = orientation / 8;
if(delta > 90) delta = 90;
if(delta < -90) delta = -90;
if(orientation > 250) fall = fall + 1;
if(orientation < -250) fall = fall - 1;
left.write(81 - delta);
right.write(81 + delta);
if (fall == 25 || fall == -25) {
  left.write(servoZero);
  right.write(servoZero);
  delay(250);
  fall = 0;
}
Serial.print(orientation);
Serial.print("   ");
Serial.println(fall);
}

Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jul 03, 2010, 12:33 pm
Vaneggio un pò...
Sapendo il peso del robot, si potrebbe precalcolare l'inclinazione in avanti (frenata) o inditero (partenza), i vettori in gioco sarebbero,
la quantità di moto e l'inerzia (alla partenza o in frenata)
ed il prodotto vettoriale di questi due vettori con verso contrario dovrebbe rappresentare la forza che spinge in testa o in coda e l'angolo di questo vettore dovrebbe essere quello "previsto" di inclinazione del robot durante le due fasi "critiche" (partenza e frenata).
Conoscendo in anticipo (con buona approssimazione)  il valore dell'inclinazione si potrebbe pensare ad un sistema tipo l'ABS delle auto che però "stacchi" quando in veicolo raggiunge l'angolo previsto.
così forse si potrebbe "smorzare" un pò di effetto "pendolo".
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 05, 2010, 07:34 am
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?
Title: Re: [Progetto comune] - Robotica
Post by: FEDERICO on Jul 05, 2010, 11:41 am
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
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 07, 2010, 11:33 am
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!!!
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 07, 2010, 03:19 pm
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?
Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jul 07, 2010, 06:21 pm
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]
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 08, 2010, 01:45 am
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
Title: Re: [Progetto comune] - Robotica
Post by: kokiua on Jul 08, 2010, 08:43 am
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...
Title: Re: [Progetto comune] - Robotica
Post by: guiott on Jul 08, 2010, 09:07 am
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.
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 08, 2010, 10:17 am
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]
Title: Re: [Progetto comune] - Robotica
Post by: Calamaro on Jul 08, 2010, 11:09 am
si si è lui :D
Title: Re: [Progetto comune] - Robotica
Post by: kokiua on Jul 08, 2010, 11:20 am
@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
Title: Re: [Progetto comune] - Robotica
Post by: guiott on Jul 08, 2010, 12:01 pm
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
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 08, 2010, 07:49 pm
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.
Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jul 08, 2010, 08:40 pm
processing è usato per simulare il sensore che non gli è ancora arrivato..
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 09, 2010, 01:10 am
Si quello lo avevo chiarito. Credevo che la computazione non la facesse arduino ma jmyron ero rimasto li  ;).
Title: Re: [Progetto comune] - Robotica
Post by: kokiua on Jul 09, 2010, 06:54 am
Quote
Credevo che la computazione non la facesse arduino ma jmyron


ad oggi non conoscevo ancora il progetto Myron (http://webcamxtra.sourceforge.net/) .. interessante: appena avrò un pochino di tempo gli darò uno sguardo più attento  ;)
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 09, 2010, 11:28 am
@Calamaro:
Quote
si si è lui

Grande! Eheh, solo che non credo si sia accorto dei messaggi.. ;)

@Tutti:
Io riapro il discorso robot hoover.. il sistema di controllo procede.. con una piantina di una stanza simulata (disegno su foglio di carta ;) ), con colori netti, il sistema isola il pavimento e ne risolve il perimetro, tracciando il percorso, ha bisogno di qualche ritoccata perchè è troppo sensibile e non ha calcolo sugli errori e le fluttuazioni dei pixel, ma tra poco riuscirà ad individuare se un "buco" nel pavimento è un errore o un oggetto. (in realtà sto ancora decidendo quale tecnica sia migliore per isolare il pavimento, per ora ho fatto un algoritmo mio, ma pensavo di usa un normalissimo filtro.. devo vedere cosa richiede meno aggiustamenti e meno approssimazioni).

Rilancio la richiesta.. se qualcuno fosse interessato a darmi una mano con la realizzazione del robot, magari che abbia un po' d'esperienza con motori e comandi via radio/bluetooth/wifi/quello che volete, è il benvenuto!! Così apriamo un topic ad hoc con le fasi!
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 09, 2010, 11:38 pm
Ciao Saki. Scusa non avevo letto. Si credo di essere io, o almeno un tempo avevo contattato un ragazzo per l'acquisto di una kawa 250sm??
Ma si parla di anni fa!!!! ;) ;) ;) Eri tu?

Io sono piu' che felice di aiutarti. E sono sicuro che molti del forum faranno lo stesso. Il mapping è davvero intrigante e ci ho lavorato decisamente poco. Quindi SI, ti do tutto il mio appoggio.

Allora, partendo dall'inizio, devi decidere il grado di precisione del tuo sistema, che è dato unicamente dagli encoder. Piu' utilizzi encoder precisi piu' il progetto cambia la sua forma e realizzazione.

Se punti a un robot che abbia una risoluzione di 1stepencoder/cm è una cosa (la mappa servirebbe poco, o quantomeno servirebbe a poco per evitare gli ostacoli, ci sarebbe un elevato rischio di collisione).

Io se fossi in te utilizzerei una risoluzione minima di 1stepencoder/mm di avanzamento che cmq alla lunga potrebbe rischiare di portare il robot in errore rispetto alla mappa. In piu' sarebbe carino come dicevi computare encoder e sensori di prossimità per "disegnare" la forma degli oggetti all'interno della mappa. X disegnare mappa partirei da processing connesso ad arduino via seriale. Altra possibilità è salvare direttamente su memoria/sd sul robot. Oppure ulteriore possibilità puoi portarti dietro il computer  ;).

Poi sara' da pensare alla base di ricarica.
Credo serva un sistema emettitore (su base) ricevitore su robot per trovarla (puoi scegliere tra ir / ultrasonici se vuoi un metodo semplice).
Volendo potrebbe essere un modo che ha il robot per, se posizionato perfettamente sulla base, di resettare la sua posizione e cancellare l'errore accumulato dal periodo di roving precedente. 8-)

Domanda, effettivamente cosa dovrà saper fare??
Vuoi inventare qualcosa di nuovo o vuoi costruirti un roomba ben funzionante da solo?? (non è una critica vorrei solo inquadrare effettivamente i tuoi intenti).



Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 11, 2010, 03:47 pm
Mm.. no nessuna kawa 250sm, la mia era un ktm 400 sm!.. ma sono sicurissimo che ci fossimo sentiti, ma ero ancora in dubbio se venderla.. va bè roba troppo remota! ;)

Allora, le tue domande e un po' di prove pratiche sul campo mi hanno indirizzato su un altro binario..

Prendo buono come punto di partenza 1stepencoder/mm, in effetti a senso mi pare ottimo per evitare ostacoli in maniera sufficientemente precisa arrivando però proprio vicino all'oggetto (per poterlo pulire). Anche se forse non sarebbe necessario per il futuro essere così precisi, ora vedo un po'.

Per il sistema di guida ho appena "finito" (è in versione alpha) un sistema che si basa sul gioco per cellulari snake.. ;)
Praticamente con le frecce della tastiera si ci può muovere su una superficie e registrare movimenti eseguiti per fare quel tragitto e coordinate cartesiane rispetto la mappa, con la possibilità di graficarle. Una volta sostituito l'input delle frecce della tastiera con un radiocomando il gioco è fatto.

Tutto questo perchè l'attuale idea è di memorizzare il percorso da fare guidando il robot la prima volta che entra in una stanza, poi salvare quel percorso associandolo ad un'etichetta, da richiamare ogni volta che si voglia compiere quel percorso.
In parallelo sul robot sensori di prossimità individuano ostacoli inattesi, ed il sistema di CV/shape detection ne individua forma e dimensioni.

Tutto questo dovrebbe tradursi in un'efficienza elevate in termini di superficie realmente pulita e garantire al tempo stesso sufficiente autonomia del robot per gironzolare per casa senza perdersi.

Per la base di ricarica in effetti bisogna pensarci bene, non se ne può mettere una in ogni stanza, come bisogna fare per gli attuali roomba, quindi pensavo quasi di creare una "super mappa" della casa, unendo le varie mappe delle stanze, di modo che il robot possa sfruttare i percorsi accessibili su ogni mappa per arrivare alla posizione della base.. probabilmente è più facile a farsi che a dirsi.

Per cancellare gli errori io pensavo di usare due sistemi, o il solito sistema CV dall'alto, che identifica il robot e controlla che la sua posizione sia corretta rispetto al sua mappa, oppure sfruttare il sistema in parallelo sul robot che identifica gli ostacoli inattesi per capire se si tratta di un ostacolo inatteso o proprio un errore sullo spostamento, anche qui è più facile farlo che spiegarlo. Tanto l'errore sarà di qualche millimetro ad ogni ostacolo, se viene di volta in volta corretto.. spero..


Ci mancherebbe, anche fosse una critica non ci sarebbero problemi, potrebbe servirmi per riflettere bene, come tutte le altre domande.
L'idea è creare qualcosa per me innanzi tutto.. per pulire la mia stanza senza dovermene preoccupare, ma pulirmela bene (rapidamente e senza dispersioni di tempo ed energia), non come il roomba.  :D :D ;D
Vorrei dare all'idea del roomba, cioè del robot che gira per la casa e pulisce, un senso più pratico ed efficiente, meno giocoso e casuale.


Dato che mi piace sperimentare, senza stare a teorizzare per giorni.. parto con le prime domande pratiche:
- che tipo di motore usare (non sò proprio nulla di questo argomento)? Alla luce del fatto che devono essere economici e con velocità relativamente basse. (Contando che in casa ho qualche motore sparso qua e la, di mini 4wd, registratori, stampanti, macchine telecomandate, ecc, e vorrei capire se potrei usarli per un prototipo oppure mi conviene investire in prodotti nuovi ad hoc)
- come fare per trasmettere dati via radio/bluetooth/ir tra arduino ed un pc con processing, o un telecomando (magari di una macchina telecomandata che ho già)? Il modo più economico finanziariamente! ;)
- come realizzare il chassis o lo scheletro? Materiali, persone a cui rivolgersi.. io per un prototipo pensavo a del cartoncino spesso..  ;D ;D Sono al risparmio assoluto!.. e poi sarebbe anche riciclabile e modellabile!

P.S.: meglio aprire un nuovo topic? O possiamo usare questo?
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 12, 2010, 02:04 pm
Come preferisci. Puoi scrivere anche qui, visto che stiamo parlando di robotica  ;). Allora:
- Se il robot è acceso sempre, credo che l'errore si sommi senza fine. Quindi questa è una delle prime cose da prendere in considerazione. Devi trovare il modo di cancellare questo errore. Utilizzando i sensori, puoi evitare gli ostacoli inattesi e evitare gli ostacoli che invece sono attesi (ma da un'atra parte) cioè errore. Ma devi capire che piu' passera' il tempo meno il robot utilizzera' la mappa, perchè sara' sempre piu' spesso in errore. Dovresti trovare un modo per azzerare questo errore, come ti dicevo per esempio trovando la base di ricarica e resettandosi quando sopra di essa, o qualcosa del genere. La cosa di fare piu' stanze inizia ad essere piu' complessa per vari motivi, uno dei quali sono le porte  :D. Per la computer vision se ti diverte ti consiglio di dare un occhio a Roborealm. Davvero facilissimo da usare, se devi sperimentare un programmino semplice è davvero comodo.
Si avendo una webcam ben posizionata (sarebbe meglio esattamente perpendicolare al terreno al centro della stanza (con obiettivo piu' grandangolare possibile) puoi ottenere ottimi risultati e pilotare direttamente tramite PC il robot. Puoi pilotarlo con una semplicissima ricevente RC e suo telecomando. Come? recupera la tua macchinina RC. Falla a pezzi ed estrai la ricevente. Se è una buona macchina RC, utilizzera' dei servi per sterzare. Questi servi vengono pilotati dal solito cavo bianco/giallo PWM. Se prendi questo cavo e lo connetti ad arduino, puoi "sentire" quali comando vengono dati tramite la funzione pulseIn(). A quel punto servirebbe un secondo arduino connesso via usb all computer e via PWM al posto dei potenziometri del telecomando, per spedire le info all'arduino sul robot. A questo punto se ti scrivi una sorta di protocollo di comunicazione hai fatto  ;)
http://www.gioblu.com/index.php?option=com_content&view=article&id=71:da-ricevente-rc-ad-arduino&catid=39:comunicazione&Itemid=6 (da rc ad arduino)
http://www.gioblu.com/index.php?option=com_content&view=article&id=60:leggere-dati-servo&catid=39:comunicazione&Itemid=6 (pulseIn())

Scusa la risposta frettolosa ma sono in viaggio  :(

Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 12, 2010, 03:38 pm
Quote
Scusa la risposta frettolosa ma sono in viaggio  

Figurati, no problem! ;)

Quote
Allora:
- Se il robot è acceso sempre, credo che l'errore si sommi senza fine. [..]

Per questo pensavo di usare una mappa, così mappa + sensore di prossimità, posso azzerare l'errore: il sensore mi da la misura esatta, mentre la mappa quella approssimativa per sapere la direzione (ho già in mente il codice per farglielo fare).
Quote
La cosa di fare piu' stanze inizia ad essere piu' complessa per vari motivi, uno dei quali sono le porte.

Già! Avere porte chiuse potrebbe essere un problema.. ma sto valutando di lasciare stare la base di ricarica per ora, una volta scarico potrei caricarlo io a mano, almeno all'inizio..
Anche perchè vorrei fare un sistema di ricarica totalmente autonomo, dalla normale 220, senza base.. vediamo cosa uscirà fuori.. ;)
Quote
Per la computer vision se ti diverte ti consiglio di dare un occhio a Roborealm. Davvero facilissimo da usare, se devi sperimentare un programmino semplice è davvero comodo.
Si avendo una webcam ben posizionata (sarebbe meglio esattamente perpendicolare al terreno al centro della stanza (con obiettivo piu' grandangolare possibile) puoi ottenere ottimi risultati e pilotare direttamente tramite PC il robot.

Eh me lo avevate già consigliato precedentemente roborealm.. ma costicchia.. e usare la versione di prova che dopo 30 giorni finisce non mi ispira molto.. così anche per un altro progetto ho realizzato tutto da me (filtri, riconoscimento colori, tracking di colori, conteggio ed identificazione di shape, densità colore, ecc).
Per la webcam ho fatto un po' di prove, avevo già praticamente finito la prima parte del prog in processing per guidare il robot totalmente dall'alto, ma per ora sono sprovvisto di webcam grandangolare, e le ombre degli oggetti viste dall'alto sono un vero disastro per riconoscere il pavimento.. l'esempio fatto con roborealm sul loro sito è piuttosto banale, dato che il robot si muove in un campo uniforme sia di colori che di luci.
Quote
Puoi pilotarlo con una semplicissima ricevente RC e suo telecomando. Come? recupera la tua macchinina RC. Falla a pezzi ed estrai la ricevente. Se è una buona macchina RC, utilizzera' dei servi per sterzare. Questi servi vengono pilotati dal solito cavo bianco/giallo PWM. Se prendi questo cavo e lo connetti ad arduino, puoi "sentire" quali comando vengono dati tramite la funzione pulseIn(). A quel punto servirebbe un secondo arduino connesso via usb all computer e via PWM al posto dei potenziometri del telecomando, per spedire le info all'arduino sul robot. A questo punto se ti scrivi una sorta di protocollo di comunicazione hai fatto  
http://www.gioblu.com/index.php?option=com_content&view=article&id=71:da-riceven... (da rc ad arduino)
http://www.gioblu.com/index.php?option=com_content&view=article&id=60:leggere-da... (pulseIn())

Mm.. bene bene, almeno sò da dove iniziare ora!! ;)
Grazie mille!! Proprio quello che mi serviva!!

..anche se mentre scrivo mi è venuta un'altra idea.. perchè non fare a pezzi il telecomando??.. alla fine sono già lì tutti i potenziometri che mi servono.. basta simularli con arduino e così dovrei risparmiarmi un arduino e la lettura dei protocolli originali.. dovrebbe funzionare! ;)
..sempre che riesca a regolare bene i singoli impulsi per comandare precisamente il moto.
Bene bene, questa sera mi armo di cacciavite e inizio ad operare i trapianti nella macchina RC! Grazie!
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 14, 2010, 02:13 am
Ehila Saki. Non ho capito bene cosa intendi con "risparmiare un arduino", se vuoi poter spedire tramite un computer comandi a un arduino via radio, hai per forza bisogno di:


Scrivendo il tutorial che ti ho linkato e facendo dei test, ho notato che il valore analogico ricevuto da arduino utilizzando pulseIn(), varia in rapporto alla distanza dal telecomando (emettitore), quindi per ottenere un funzionamento corretto ho dovuto applicare la media che puoi vedere nel codice che ho postato (che rallenta decisamente tutto, dato che gia pulseIn è pesante da eseguire). Non ho avuto la possibilità di provare con altri sistemi di trasmittente/ricevente, quindi non ho chiaro se fosse la mia ricevente un po' cotta o è un problema che affligge tutti questi sistemi. Sarei curioso di vedere i tuoi progressi e la tua sperimentazione. Tra poco avro' sotto mano una nuova trasmittente(telecomando) - ricevente 2.4 ghz, sono curioso di vedere cosa succederà. Sarebbe carino scrivere una libreria per interfacciare questi sistemi in modo piu' o meno user-friendly.




Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jul 14, 2010, 06:48 am
per il problema dei segnali variabili secondo la distanza, si potrebbe interporre un trigger di schmitt che "ripulirebbe" il segnale e gli darebbe un'ampiezza costante (o quasi).
http://it.wikipedia.org/wiki/Trigger_di_Schmitt
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 14, 2010, 02:32 pm
@gbm:
intendo che se interfaccio un arduino direttamente sull'integrato (o al posto dei potenziometri, come dici tu) del trasmettitore, poi non mi serve un arduino anche sul robot, dato che ha già la sua bella scheda che elabora i segnali del telecomando.. in teoria dovrebbe funzionare.. sto proprio per provare, appena ho fatto, e se funziona, faccio un video o qualche foto!

@brainbooster:
Quel trigger sembra tanto un comparatore o un filtro anti rumore con feedback, anzi sono quasi sicuro che gli integrati che montano i ricevitori ne abbiano uno all'interno.. vado a vedere su qualche datasheet se lo trovo!
Ma forse non basterebbe un amp-op con un bel guadagno? Si perde qualcosa in ampiezza, quando il segnale va in tensione di saturazione, ma tanto a noi interessa la frequenza del segnale se non sbaglio.. spero di non dire castronerie.. ;)
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 14, 2010, 05:28 pm
Ah Saki ora capisco. Attento (so che sono pignolo) ma a questo punto, non stai parlando di robot, ma di "remoto", cioè un esserino completamente telecomandato e privo di logica, la logica sarebbe sul pc.
Non che non sia un'idea intelligente, anzi, trovo che sia un'ottima idea e permetterebbe al robot una maggiori possibilità di computazione.

Grazie Brain per il consiglio sto proprio leggendo e cercando di farmi una cultura, questi cosi sono una figata!!
Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Jul 14, 2010, 06:53 pm
per il trigger di solito si usano dei "dozzinalissimi" ne555 :) e ti fà da squardatore ed in un certo senso da ripetitore del segnale, inquanto quello in uscita ha la tensione di alimentazione del 555 e non quella del segnale di ingresso.
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 14, 2010, 07:18 pm
Belin son un pirla.. l'ho anche realizzato un trigger del genere con un 555, solo che non sapevo si chiamasse Schmitt!

Comunque confermo, in alcuni integrati (almeno in un vecchio L9362 che ho in un vecchissimo radiocomando) c'è questo trigger, o comunque è molto simile a quanto pare, dato che fa la stessa cosa! ;)

@gbm:
Eh sì hai ragione, non è più nè un drone nè un robot! Ma solo per ora! ;) Dato che poi un Arduino per gestire sensori di prossimità, correzione mappa e altre faccende servirà.. solo che credo di appoggiarmi sempre sugli integrati presenti per farlo, almeno all'inizio, poi vorrei sostituire tutto con moduli xbee, molto più efficienti, versatili e facili da gestire!
Conta che la mia idea è collegare questo robot al mainframe che mi sto creando in casa.. si chiama Mambo, è un DLA (Digital Life Assistant) comandato vocalmente, sarà lui a pilotare tutto.. appena sarà un po' più presentabile (leggere: avrà tutte le funzioncine che sto creando per lui) posterò qualcosa.. per ora mi da la sveglia, mi dice se un mezzo è parcheggiato sotto casa o è in uso da qualcuno, mi dice che tempo fa, accende e spegne le luci (anche se il sistema è da rifare un po' meglio).. ;)
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 16, 2010, 11:08 am
Questo è stra interessante:
http://www.jonh.net/~jonh/robots/mapping/submitted-paper.html
Qui il PDF scaricabile (per iscritti)
http://www.gioblu.com/index.php?option=com_content&view=category&id=38&Itemid=7

Altro ebook sicuramente inerente:
http://iopscience.iop.org/1742-6596/90/1/012088/pdf/jpconf7_90_012088.pdf

Society of robots come al solito chiarissimo:
http://www.societyofrobots.com/programming_wavefront.shtml

Altro pdf un pochettino piu' complesso ma sicuramente utile:
http://www2.itu.edu.tr/~altuger/Documents/Papers/IECON2009.pdf
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 16, 2010, 12:17 pm
Belin il primo articolo fa duemila parole e poi il risultato non è così esaltante.. allora il mio prog è ben ben più avanti.. almeno traccia già una mappa definita, manca il sistema di correzioni tramite sonar (che non ho ancora), ma è più preciso in origine come idea.. IMHO! ;)
Bello però l'approccio "robotcentrico" e le coordinate polari.. anche se diventa un macello poi poter gestire delle coordinate assolute, il piano cartesiano rimane lo standard secondo me.

Il mio progetto è davvero simile a quello su Society of Robots. Davvero un bell'articolo quello, mi ha dato anche due nuovi spunti!

Thanks gbm!
Title: Re: [Progetto comune] - Robotica
Post by: gioscarab on Jul 17, 2010, 05:55 pm
Figurati Saki. Appena torno in quel di Milano sperimentero' alcune idee che sto buttando giu da qui. Sono curioso di vedere come si evolverà la tua sperimentazione. Gio.
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 18, 2010, 12:35 am
;)
Mi sta prendendo proprio questa cosa e sfruttando il tempo libero sto andando abbastanza spedito.. Oggi ho adattato un vecchio mouse a pallina per contare al centimetro.. ora vedo se riesco ad arrivare anche al mezzo centimetro, non sò come possa risultare l'errore alla fine con il lasco della pallina se scendo troppo.
L'obiettivo è attaccarlo sotto alla macchina RC e contare effettivamente lo spazio percorso, così da avere una mappa il più possibile precisa..

C'è un piccolo problema, per ora il prog è stato realizzato pensando ad un robot che potesse ruotare su se stesso, mentre la mia macchina ha uno sterzo classico, quindi sballerà un po' tutto, ma almeno mi darà un indice di massima.. fatto questo si monta il sonar (qui mi servirebbe un bel consiglio, meglio IR o ultrasuoni?? Esperienze al riguardo?).. e poi realizzazione vera e propria del robot, compresa la parte sugli studi di fluidodinamica per dare un po' di potenza a basso consumo al piccolino!
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Jul 26, 2010, 12:47 pm
Piccolo aggiornamento!!

Ok che è arrivato il progetto comune sulla domotica, ok che arriva l'estate e siamo tutti più propensi ad andare al mare, piuttosto che leggere e sperimentare, ma cerco di tenere vivo questo thread!

Ecco la descrizione del mio progetto, i passaggi e l'aggiornamento degli step fino a qualche giorno fa.

Si chiama Roombot, nuovo nome, e dovrebbe diventare la base per vari robot domestici.

Vi lascio al link, se volete chiedere qualcosa fatelo qui o sul forum di Gioblu, come preferite.

http://www.gioblu.com/index.php?option=com_agora&task=topic&id=10&Itemid=39

Per ora c'è la descrizione dei passaggi iniziali e le prove che hanno portato a rami abbandonati, ma presto ci saranno i test con encoder e sensore di distanza, oltre il pre-codice del sistema di mapping!
Title: Re: [Progetto comune] - Robotica
Post by: brainbooster on Sep 19, 2010, 08:25 am
Sono curioso, vorrei vedere qualche aggiornamento :)
@Saki linka qualche foto!
Title: Re: [Progetto comune] - Robotica
Post by: saki_kawa on Nov 06, 2010, 06:04 pm
Ciao Brain!!!
Scusa il ritardo nella risposta, ma l'uni mi sta assorbendo al 200%!!

Ecco alcuni aggiornamenti!

Prima di tutto l'interfacciamento tra Arduino e un radiocomando Tamiya, per vedere se era fattibile usare una vecchia macchina telecomandata come piattaforma per il Roombot.
http://www.gioblu.com/community/forum/topic?id=10&p=1#p54

Tutto funzionava alla perfezione, salvo che poi avrei avuto bisogno di un DAC per simulare i potenziometri sul telecomando e decidere via software anche le velocità di avanzamento.
Cosa fattibilissima comunque, ci ho scritto anche un tutorial:
http://www.gioblu.com/tutorials/elettronica/139-tensione-analogica-da-un-circuito-digitale-con-i-pwm

Poi mi sono dedicato all'odometro per poter mappare le dimensioni della stanza mentre si pilota il Roombot.
Ho preso un mouse, l'ho un po' smembrato  ;) :D, ho aggiunto un sensore IR smd preso dal meccanismo di una macchina fotografica e ne ho fatto un conta centimetri:
http://www.gioblu.com/community/forum/topic?id=10&p=1#p64

(http://www.gioblu.com/components/com_agora/img/members/20/mini_IMAG0060-mod.png) (http://www.gioblu.com/components/com_agora/img/members/20/mini_IMAG0060-mod.png)

Funzionava bene, ma non riuscivo ad individuare il verso di rotazione.

Così ho deciso di usare un encoder di una rotella per mouse.

Nel prossimo post metterò foto e test di questo encoder.


Per ora sono un po' fermo a causa dello studio, ma appena ho un po' di tempo mi sto dedicando al programma di mapping!

A presto con altri aggiornamenti!!
Title: Re: [Progetto comune] - Robotica
Post by: Jujo on Nov 29, 2010, 09:51 am
A me sembra che il maze solver sia una buona base di partenza per poter poi passare a qualcosa di più complesso. In fondo la robotica con Arduino è fatta per puro piacere più che per utilità.