Dubbi terza esercitazione

Dubbi terza esercitazione

di Jacopo Carlo Adamoli -
Numero di risposte: 39

Buongiorno

Vorrei chiedere, rispetto all'ultimo punto, se l'utente decide di muovere il solo il primo joint, si muove solo esso oppure si muove anche il secondo di conseguenza?

In riposta a Jacopo Carlo Adamoli

Ri: Dubbi terza esercitazione

di Federica Di Lauro -
Mi unisco ai dubbi:

1) il parallelepipedo "basamento" ha sempre pose [0,0,0,0,0,0] o viene inserita dall'utente?
2) il disegno fa rifatto da 0 per ogni iterazione o lasciamo disegnati i parallelepipedi precedenti?
In riposta a Jacopo Carlo Adamoli

Re: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Volevo chiedere qualche commento su una scaletta della soluzione...

Esercitazione denavit hartemberg.
Primo passo
si richiede la costruzione di un [basamento] (parallelepipedo con dimensioni richieste all'utente) ma che presenti il suo sistema di riferimento [frame1] (che coincide con quello del mondo?) nel centro della faccia superiore. Quindi il basamento dovrà avere coordinate negative della z.
Disegnare entrambi ([frame1] e [basamento]).Considerare l'asse z del [frame1] come asse di rotazione del [joint1]. In caso il sistema di riferimento può non coincidere con il sitema mondo?.

Secondo passo
si richiede l'inserimento della pose 3d di [frame2] rispetto a [frame1], mediante i 4 parametri della convenzione denavit hartemberg di cui va indicata la variabile.
Chiedere le dimensioni di [link1] (parallepipedo). [link1] si muoverà a seconda dei movimenti di [joint1].
Aggiungere al disegno i nuovi [frame2] e [link1].

Interazione Utente
Chiedere all'utente se vuole muovere [link1], in caso di risposta affermativa richiedere il valore della variabile in degs.In caso di risposta negativa andare avanti (uscire dal cilco).

Terzo passo
richiedere l'inserimento della pose 3d di[frame3] rispetto a [frame2], mediante i parametri di denavit hartemberg , dei quali va dichiarata la variabile.
Chiedere le dimensioni per rappresentare graficamente [link2], il [link2] si muoverà a seconda dei movimenti di [joint2]
Aggiungere al disegno i nuovi [frame3] e [link2].

Interazione Utente
chiedere all'utente se vuole effettuare un moviemnto del braccio utilizando [joint1] oppure [joint2].
Effettura il disegno dei 3 link nelle nuove pose.
Chiedere all'utente se vuole effetuare un nuovo movimento del [braccio].
in caso di risposta affermativa ritornare al punto altrimenti uscire dal programma.
In riposta a Domenico Giorgio Sorrenti

Re: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Ecco qualche commento, cambierò quindi un pochino il testo dell'esercizio per rendere interattiva la parte di disegno, pensando che consenta una maggiore comprensione delle convenzioni.

>Esercitazione denavit hartemberg.
>Primo passo
>si richiede la costruzione di un [basamento] (parallelepipedo con dimensioni richieste all'utente) ma che presenti
>il suo sistema di riferimento [frame1] (che coincide con quello del mondo?) nel centro della faccia superiore.
>Quindi il basamento dovrà avere coordinate negative della z.
mi pare ok

>Disegnare entrambi ([frame1] e [basamento]).Considerare l'asse z del [frame1] come asse di rotazione del [joint1].
>In caso il sistema di riferimento può non coincidere con il sitema mondo?
- facciamo che non parliamo di frame1, ma di frameb (b = base nella terminologia del libro di testo).
- facciamo che, per lo stesso motivo (aderire alla terminologia del libro di testo) non parliamo di "basamento",
  ma di "base".
- in questo esercizio direi che non serve avere un sistema di riferimento "mondo" distinto da "base".
- credo che possa essere utile fare un cambio di testo dell'esercizio: dopo ciascun disegno, chiedere all'utente se
  il disegno è ok, altrimenti ripetere la acquisizione dei parametri del disegno dall'utente (pose del frame per il
  sistema di riferimento, coordinate dei punti per i parallelepipedi) e ri-disegnare.

>Secondo passo
>si richiede l'inserimento della pose 3d di [frame2] rispetto a [frame1], mediante i 4 parametri della convenzione
>denavit-hartemberg di cui va indicata la variabile.
>Chiedere le dimensioni di [link1] (parallepipedo). [link1] si muoverà a seconda dei movimenti di [joint1].
>Aggiungere al disegno i nuovi [frame2] e [link1].
- facciamo che, usando la terminologia del libro di testo, esista un frame0 posizionato nel posto giusto, rispetto a
  frameb, il posizionamento di frame0 è definito dall'utente.
- facciamo anche che frame2 si chiami invece frame1 e viene posizionato nel posto giusto dall'utente, rispetto a frame0.
- facciamo quindi che prima di dare per acquisito ciascun frame lo si disegna e si chiede se ok all'utente, altrimenti
  si ri-chiede dove disegnarlo, lo si disegna e si ri-chiede all'utente se ok.
- vengono poi richieste le informazioni relative al link, oltre alle dimensioni va chiesto dove va posizionarlo rispetto
  al frame corrente.
- si fa il disegno del link e si chiede se ok all'utente altrimenti si ri-chiede all'utente dimensioni e pose.
 
>Interazione Utente
>Chiedere all'utente se vuole muovere [link1], in caso di risposta affermativa richiedere il valore della variabile in
>degs. In caso di risposta negativa andare avanti (uscire dal ciclo).
ok
 
>Terzo passo
>richiedere l'inserimento della pose 3d di[frame3] rispetto a [frame2], mediante i parametri di denavit hartemberg, dei
>quali va dichiarata la variabile.
>Chiedere le dimensioni per rappresentare graficamente [link2], il [link2] si muoverà a seconda dei movimenti di [joint2]
>Aggiungere al disegno i nuovi [frame3] e [link2].
- anche qui separare frame e link, il primo è funzione dei parametri DH chiesti all'utente, ed il suo disegno finale
  richiede la acquisizione dell'ok da parte dell'utente; il secondo pure va disegnato e chiesto se ok all'utente.

>Interazione Utente
>chiedere all'utente se vuole effettuare un moviemnto del braccio utilizando [joint1] oppure [joint2].
>Effettua il disegno dei 3 link nelle nuove pose.
>Chiedere all'utente se vuole effetuare un nuovo movimento del [braccio].
>in caso di risposta affermativa ritornare al punto altrimenti uscire dal programma.
ok
In riposta a Jacopo Carlo Adamoli

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Adesso il testo dell'esercizio dovrebbe essere coerente con quanto dettoci questa mattina. Verificate e se trovate dei punti dubbi non esitate a farmelo sapere con interventi su questo thread.

In riposta a Domenico Giorgio Sorrenti

Ri: Dubbi terza esercitazione

di Federica Di Lauro -
Continua a non essermi chiara la definizione di frame e giunti.
Abbiamo innanzitutto la base e il sistema di riferimento della base.
C'è poi il frame0 la cui pose è definita dall'utente rispetto alla base.
Il frame1 è definito secondo le convenzioni di DH rispetto a frame0.
Il frame2 è definito secondo le convenzioni di DH rispetto a frame1.

Il primo giunto è quindi il frame0 o il frame1?
Dal libro mi pareva di capire che ad ogni "frame" corrispondesse un giunto, ma dalla traccia sembrerebbe che ci siano solo due giunti, ma abbiamo 3 frame. A cosa si riferisce ogni frame?


Aggiungo: forse un disegno potrebbe rendere tutto molto più chiaro
In riposta a Federica Di Lauro

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Tutto ok fino alla definizione dei frames. Quello che non torna è la supposta coincidenza tra giunto e frame: il primo giunto è quello che fa muovere frame1 rispetto a frame0, il secondo giunto è quello che fa muovere frame2 rispetto a frame1. Guardiamo la figura 2.16 del libro: l'angolo theta_i (che all'inizio della catena di un antropomorfo sarebbe theta_1 ovvero la vita) fa spostare il frame_i rispetto al frame_(i-1) ovvero frame1 rispetto a frame0...

figura 2.16 del libro di testo

Secondo me ci potrebbe invece essere poca chiarezza sul fatto che richiedo che il link0 sia definito nel frame1; questo comporta che il torso si muova quando si muove il giunto 1. Si potrebbe però pensare che il torso "stia fermo" e quando si muove il giunto 1 si muova solo la parte infinitesima superiore del torso. La scelta che ho fatto è quindi che il pezzo "torso" (sempre parlando come se stessimo modellando un antropomorfo) si muova tutto, come se il giunto si trovasse subito sopra la base.

In riposta a Domenico Giorgio Sorrenti

Ri: Dubbi terza esercitazione

di Federica Di Lauro -
Si ecco, l'ultimo paragrafo riassume esattamente il mio dubbio: anche nell'immagine del libro mi aspetterei che il link i-1 si muova quando si muove il joint i-1.
Ho provato a disegnare ciò che interpreto dalla sua traccia (figura1 nel pdf) e quello che mi era sembrato di capire leggendo il libro (figura 2).
Nel primo caso il link0 viene mosso quando viene movimentato il frame1 (ovvero quello che mi pare di capire sia il primo giunto), idem per link1 e frame2.
Nel secondo caso il link0 viene mosso quando viene movimentato il frame0, stessa cosa per link1 e frame1.
Allego il file pdf in cui ho provato a disegnare questi due casi
In riposta a Federica Di Lauro

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -
>Si ecco, l'ultimo paragrafo riassume esattamente il mio dubbio: anche nell'immagine del libro mi aspetterei che il
>link i-1 si muova quando si muove il joint i-1.
In generale ok, se il link_(i-1) è definito nel sistema frame(i-1) allora si muove quando frame(i-1) si muove ovvero
quando il giunto (i-1) di muove. C'è però una cosa che non torna: se (i-1)=0 allora parliamo di qualcosa inchiavardato
alla base, che non si muove. Non esiste infatti un giunto 0.

>Ho provato a disegnare ciò che interpreto dalla sua traccia (figura1 nel pdf) e quello che mi era sembrato di capire
>leggendo il libro (figura 2). Nel primo caso il link0 viene mosso quando viene movimentato il frame1 (ovvero quello
>che mi pare di capire sia il primo giunto), idem per link1 e frame2.
Faccio prima un commento sulla terminologia perché non sono sicuro che siamo allineati sulla semantica e se sia solo
una svista (ma sarebbe la seconda): non ha senso riferirsi ad un giunto come ad un frame. Un giunto è una trasformazione
rigida tra frames, quindi ok "quando viene movimentato frame1" in quanto frame1 viene mosso quando si muove giunto 1,
ma "frame 1" non è un giunto.
Veniamo adesso alla questione: abbiamo 2 strade: vogliamo che tutta la colonna verticale "torso" si muova quando si
muove giunto 1 oppure vogliamo che si muova solo la parte superiore del torso, dove c'è la spalla? Sono entrambe delle
opzioni lecite. Ad esempio si muove solo la parte alta nel vero PUMA560, il primo braccio antropomorfo industriale che
sia stato messo in vendita, un braccio molto famoso in robotica (https://www.youtube.com/watch?v=4ddfhcbIr1Y), ma si
muove invece "tutto" (ovvero il giunto è vicino alla base e tutta la colonna verticale ruota) in altri robot. La scelta
che avevo fatto è la seconda. L'importante è che sia chiara la questione (tutto sommato banale) che la parte movimentata
quando si muove il giunto 1 "si deve muovere" ovvero deve esistere nel frame1. Se invece volessimo seguire l'altra strada,
in cui link0 sta fermo quando si muove il giunto "vita", ditelo e fatelo, non mi offendo.

>Nel secondo caso il link0 viene mosso quando viene movimentato il frame0, stessa cosa per link1 e frame1. Allego il
>file pdf in cui ho provato a disegnare questi due casi.
Il disegno forse richiede spiegazioni ulteriori perché un lento di comprendonio come me lo capisca (movimentare frame0
per me è un ossimoro), ma forse adesso ci siamo capiti? In caso contrario andiamo avanti!
In riposta a Domenico Giorgio Sorrenti

Ri: Dubbi terza esercitazione

di Federica Di Lauro -
Non sono ancora sicura al 100% di come vadano movimentate le varie cose. Ho iniziato a scrivere la prima parte di esercizio (fino al loop in cui si chiedere di muovere il giunto1 per intenderci), il .m è in bozza nella mia consegna. Se può fare una prova e dirmi se ho ben inteso come vanno posizionate e movimentate le varie parti le sarei molto riconoscente.
In riposta a Federica Di Lauro

Re: Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -
Grazie ad Augusto e Simone: non puoi usare lo stesso identificatore per il nome della funzione e la variabile che contiene il risultato della funzione (come si farebbe in C). usa un identificatore diverso per la variabile e poi assegni il valore, dentro la funzione, riferendoti alla variabile. Ad esempio:

function pippo = pippofunction(parametri)
.
.
.
pippo = valore_da_restituire
end
In riposta a Domenico Giorgio Sorrenti

Ri: Re: Ri: Dubbi terza esercitazione

di Federica Di Lauro -
Sì, stavo cercando anche io e sembra abbiano cambiato il comportamento tra le versioni matlab, sulla mia funzionava. Ho appena cambiato il codice, dovrebbe andare ora.
In riposta a Federica Di Lauro

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Putroppo non riesco ad eseguirlo, ci sono ancora degli errori.

Error using patch
Invalid color value.

Error in testb>print_poly (line 291)
poly_patch_obj =  patch('Faces', poly_faces, 'Vertices', ...

Error in testb (line 66)
poly_basamento = print_poly(basamento_new_vert);
In riposta a Domenico Giorgio Sorrenti

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Non ho capito questa osservazione, ma ho controllato: ho la 2018a.

In riposta a Domenico Giorgio Sorrenti

Ri: Dubbi terza esercitazione

di Federica Di Lauro -
Gli errori sono dovuti a incompatibilità tra le varie versioni matlab, ad esempio l'errore su patch credo sia dovuto dal fatto che specifico i colori dei parallelepipedi in esadecimale, e ho scoperto che è una feature abbastanza recente. Per evitare di stare a capire ogni volta dove risiedono queste incompatibilità è più semplice usare la stessa versione matlab ed evitarle a prescindere. Scarico la 2018a e verifico che funzioni tutto, grazie
In riposta a Federica Di Lauro

Ri: Dubbi terza esercitazione

di Federica Di Lauro -
Confermo che l'errore era causato dal fatto che stavo specificando i colori in esadecimale, feature non supportata dalla 2018a. Ho modificato il codice e testato, ora dovrebbe andare.
Aggiungo: specificavo i colori nello stesso modo anche nell'assignment precedente, nel caso modifico anche quello e riconsegno una versione compatibile con la 2018a.
In riposta a Federica Di Lauro

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Mi pare che serva un intervento anti-malocchio ;-)


In riposta a Federica Di Lauro

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Allora, stavolta è partito! Non mi chiede niente su link0 e poi non disegna link0.

In riposta a Domenico Giorgio Sorrenti

Ri: Dubbi terza esercitazione

di Federica Di Lauro -
Mea culpa, quando richiedo i parametri di link1 intendo i parametri di link0, errore di distrazione. Il link viene disegnato dopo la richiesta rotativo/prismatico.
In riposta a Federica Di Lauro

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Uummhh... guarda che ha disegnato link1... ho messo una z grande ed è venuta orizzontale (e avevo messo \alpha 90º)...

In riposta a Domenico Giorgio Sorrenti

Ri: Dubbi terza esercitazione

di Federica Di Lauro -
"A questo punto il programma dovrà chiedere all'utente di definire un secondo parallelepipedo, che costituirà il "link0" (torso, per un antropomorfo); questo parallelepipedo verrà definito nel sistema di riferimento "frame1". Da qui capisco che l'orientamento del link0 è quello del frame1, quindi essendo ruotato frame1 di 90 gradi sulle x, ho l'asse z in "orizzontale". Anche a me il disegno pareva strano ma non saprei come altro interpretare la frase citata.
In riposta a Federica Di Lauro

Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

direi che hai ragione tu, se è in frame1 la z è quella di frame1 e se è girato per \alpha = 90º allora va bene così, è l'utente che deve farlo estendere nella direzione giusta, se vuole che l'intero torso ruoti con giunto 1.

In riposta a Domenico Giorgio Sorrenti

Ri: Dubbi terza esercitazione

di Fabio D'Elia -
Salve,
avrei un dubbio che mi attanaglia da giorni.
Il dubbio sta nella frase 'Quindi, considerando la z di questo sistema come l'asse di rotazione del "giunto 1" '. Se l'asse di rotazione sta sull'asse z del frame base, quando ruoto il giunto 1, la rotazione avviene su questo asse (quindi il frame 1 si troverà in una posizione differente) oppure c'è stato una lapsus e questa frase non è da considerare? Nel caso se potesse fare un disegno di una rotazione del giunto 1 saremmo perfetto.
In riposta a Fabio D'Elia

Re: Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

Mi pare che ci fosse un errore nel testo. Ho provato a correggere sempre nella interpretazione "tutto il torso, dalla base alla spalla, ruota quando si muove il giunto vita".

Se qualcuno volesse invece seguire l'interpretazione "il torso sta praticamente tutto fermo, quando si muove il giunto vita ruota solo la parte superiore del torso", come ad esempio la parte verde in questo video: https://www.youtube.com/watch?v=4ddfhcbIr1Y, si senta libero di dichiararlo e poi farlo.

In riposta a Domenico Giorgio Sorrenti

Ri: Re: Ri: Dubbi terza esercitazione

di Artur Mikulski -

Salve prof,

Ho un problema parecchio fastidioso che non riesco a risolvere.

Se metto la posizione del frame0 in origine, ovvero (0,0,0), costruisco frame1 rispetto frame0 come richiesto e dopo costruisco il parallelepipedo cercando di far ruotare quest'ultimo va tutto bene, il parallelepipedo gira bene, frame1 gira bene ed è tutto a posto, se invece, alla creazione di frame0 lo metto in (2,0,0), costruisco frame1 e dopo il parallelepipedo, quando cerco di girare la figura questa sfasa, ovvero trasla di quel x=2(che sarebbe la traslazione del frame0), in base a dove punta l'asse x del frame1. Frame1 invece gira normalmente, il problema si verifica solo con la figura.

Sto provando a sistemare sta cosa ormai da due giorni, ho provato a ruotare prima rispetto a frame1, poi rispetto a frame0, poi ho provato altri modi ma il problema persiste.

Allego il link al video che ho fatto per poter essere più chiaro possibile https://drive.google.com/file/d/1KjlK50XjPjTSRpPm8dRuFOz--ENcMV4r/view?usp=sharing

In riposta a Artur Mikulski

Re: Ri: Re: Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -
>Salve prof,
>Ho un problema parecchio fastidioso che non riesco a risolvere.
vediamo se riesco ad essere utile, non è scontato!

>Se metto la posizione del frame0 in origine
presumo "origine del sistema base", ok?

>, ovvero (0,0,0), costruisco frame1 rispetto frame0 come richiesto
>e dopo costruisco il parallelepipedo cercando di far ruotare quest'ultimo
>va tutto bene, il parallelepipedo gira bene, frame1 gira bene ed è tutto
>a posto
tutto ok vuol dire che il parallelepipedo gira solidale con frame1, ok?

>, se invece, alla creazione di frame0 lo metto in (2,0,0), costruisco
>frame1 e dopo il parallelepipedo, quando cerco di girare la figura questa
>sfasa, ovvero trasla di quel x=2 (che sarebbe la traslazione del frame0),
>in base a dove punta l'asse x del frame1. Frame1 invece gira normalmente,
>il problema si verifica solo con la figura.
non ho ben capito...

>Sto provando a sistemare sta cosa ormai da due giorni, ho provato a ruotare
>prima rispetto a frame1, poi rispetto a frame0, poi ho provato altri modi
>ma il problema persiste.
uummhh... ancora poco chiaro.

>Allego il link al video che ho fatto per poter essere più chiaro possibile
>https://drive.google.com/file/d/1KjlK50XjPjTSRpPm8dRuFOz--ENcMV4r/view?usp=sharing
adesso provo a vedere il video perché così non ho ben capito.
In riposta a Artur Mikulski

Re: Ri: Re: Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -
In riposta a Domenico Giorgio Sorrenti

Ri: Re: Ri: Re: Ri: Dubbi terza esercitazione

di Artur Mikulski -

Mi sono scordato di renderlo publico. Adesso l'ho reso visualizzabile con l'account di università.

https://drive.google.com/file/d/1KjlK50XjPjTSRpPm8dRuFOz--ENcMV4r/view?usp=sharing

In riposta a Artur Mikulski

Re: Ri: Re: Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

ok, adesso funziona.

questione terminologica: più che chiedere di ruotare "link0" dovrebbe chiedere di ruotare giunto1.

ma non ruota proprio, trasla soltanto. non so che dire se non che c'è qualche errore nella matrice di rototraslazione. ma se prendi quello che hai fatto per la consegna precedente, a parte che quello che ottieni lì va poi moltiplicato ancora per baseTframe0, non può fare da base di partenza del lavoro?

In riposta a Domenico Giorgio Sorrenti

Ri: Re: Ri: Re: Ri: Dubbi terza esercitazione

di Artur Mikulski -
Ruota, ma non si vede perché ruoto di 90 gradi. Sono partito proprio dall'assignment precedente, l'unica cosa che adesso al posto della matrice di trasformazione omogenea per svolgere la rotazione mi appoggio alla matrice dei paramentri DH, e quindi esce sto casino. Ho provato anche ad usare la matrice di trasformazione omogenea ma il problema persiste. Vabbe, continuo a provare a far cose
In riposta a Artur Mikulski

Re: Ri: Re: Ri: Dubbi terza esercitazione

di Domenico Giorgio Sorrenti -

btw: 2 giorni sono tanti, ma rispetto ai 6 mesi di chi non aveva capito che i numeri in un calcolatore sono privi di dimensione (uno studente erasmus portoghese di tanti anni fa)... non è nulla! se tieni colori solidi sulle facce forse si vede meglio che c'è una rotazione. mi spiace, mi pare di essere stato poco utile stavolta.