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?
Si muove anche il secondo.
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.
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
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.
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...
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.
>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!
Ho scorso il codice e mi sembra ok. Ho provato a lanciarlo, ma si lamenta: alla riga 239 ha luogo un "Assignment to roto_trasl_matrix not supported. Variable has the same name as a local function".
function pippo = pippofunction(parametri) . . . pippo = valore_da_restituire end
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);
Non ho capito questa osservazione, ma ho controllato: ho la 2018a.
Mi pare che serva un intervento anti-malocchio ;-)
ci mancherebbe! tra poco ritento!
Allora, stavolta è partito! Non mi chiede niente su link0 e poi non disegna link0.
Uummhh... guarda che ha disegnato link1... ho messo una z grande ed è venuta orizzontale (e avevo messo \alpha 90º)...
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.
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.
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
>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.
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
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?
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.