giovedì 13 novembre 2014

Controllare un braccio robotico con il Leap Motion





Come preannunciavo nell'articolo precedente, ultimamente ho dedicato parte del mio tempo (libero e non) alla realizzazione di questo piccolo progetto. Qualche anno fa infatti ho acquistato il Leap Motion, il mitico (quando inutile!) dispositivo che è in grado di mappare con grande sensibilità una o più mani umane, tenendo traccia della posizione esatta di ogni singolo componente della mano nell'ambiente aereo sovrastante il dispositivo.






il Leap Motion


Come il Leap Motion interpreta una mano



Molto bene. 

Sempre come già detto nel precedente articolo, quest'estate ho acquistato un braccio robotico, e non appena montato la mia idea è stata questa:






"Prendere i dati in input dal Leap Motion, attraverso un programma per computer spedirli attraverso il WiFi al WiFi-Shield di Arduino, infine comandare attraverso Arduino il braccio."



Ci stava troppo.

Solo negli ultimi giorni però mi sono convinto a dedicarmici seriamente, e in circa una settimana/10 giorni l'ho iniziato e finito.

Che dire, non scendo nei dettagli però posso dire che i punti critici erano fondamentalmente due:

1) inviare i dati dal computer ad Arduino
2) risolvere un problema di cinematica inversa 


Andiamo con ordine:

Inviare i dati dal computer ad Arduino


Il braccio in questione è dotato di 6 motori ed io ad ogni istante voglio dire a ciascun motore del braccio quali angolazioni deve assumere. E' chiaro che ciò di cui avevo bisogno era potere inviare dei vettori di 6 elementi in blocco unico, per fare ciò ho creato un piccolo protocollo di comunicazione attraverso TCP, che consente all'applicazione mac di spedire dei pacchetti unici incapsulati in un NSData, e al server su Arduino di ricomporli prendendone un elemento per volta. Alla fine il risultato è piuttosto semplice, ma mi ha portato via qualche oretta di madonne e santi XD.


Risolvere un problema di cinematica inversa

E qui veniamo alle noti dolenti, si tratta tra l'altro del cuore del progetto. Praticamente da un lato abbiamo il leap motion che traccia fedelmente le coordinate XYZ di un particolare componente della mano (facciamo il Palmo della mano) in un teorico grafico 3D.
Dall'altro lato abbiamo un ammasso di ferraglia e servomotori. Come cazzo si fa a convertire un punto tridimensionale in particolari angolazioni dei motori di un braccio robotico?

Guardando quest'immagine:


Se ho le coordinate X e Y di un punto, e conosco L1 e L2 che sono rispettivamente le lunghezze dei due componenti del braccio, come cazzo faccio a determinare Theta1 e Theta2?

Ebbene questo è un problema di Cinematica Inversa, e non è per niente banale. Ho googlato come un ossesso, scoprendo che è roba che si fa alla magistrale di Ingegneria dell'automazione, che avrebbe un bel po di teoria di dietro, e in generale che è tutta roba di cui io non ho assolutamente idea. 

Vabbè, fatto sta che cercando ho trovato il codice di un tizio che ha sviluppato lo stesso mio progetto e che ha pubblicato le sue fatiche su un sito. In questo modo ho copiato pari il codice che riguarda la conversione:


Io l'ho aggiunto pari pari e il risultato è quello del video. Ad essere sinceri non ne sono molto soddisfatto, ma al momento è quanto di meglio ho trovato in giro. Ho trovato qualche alternativa ma il risultato era uno schifo atomico, ho provato ad apportare qualche modifica a quel codice ma bo peggiorava solo. Sono certo che questo è un modo di implementare il problema e non IL modo, e che si può sicuramente fare di meglio.


Per quanto riguarda i movimenti di rotazione della base, di apertura della pinza e di inclinazione del polso è stato piuttosto facile, nulla di complicato.


Diciamo che al momento mi accontento ma ho già in piano di migliorare il progetto in futuro. Intanto mi devo trovare con un mio amico che appunto sta facendo la magistrale a Ingegneria dell'automazione e con il quale credo di riuscire a migliorare di molto il comportamento del braccio, in più ce da migliorare la reattività del sistema in generale, ma quella è la meno.

Fottuta cinematica inversa!



Vabbé, questo é

stay motherfuckin' tuned

Beto


Nessun commento:

Posta un commento