Prove con cinematica

Sezione dedicata a Linuxcnc
Rispondi
Gima
Newbie
Newbie
Messaggi: 6
Iscritto il: lunedì 17 febbraio 2014, 21:42
Località: Brescia

Prove con cinematica

Messaggio da Gima » lunedì 9 ottobre 2017, 17:07

Ciao a tutti.
Sto cercando di fare qualche prova cambiando la cinematica, credo di essere a buon punto ma ci sono un paio di cose che non mi sono chiare.
La versione che sto usando è la 2.7.11. Ho scritto un file con nuova cinematica che compilo correttamente: halcompile --install mytriviks.c
Ho poi provato con un primo esperimento, invertire X con Y, ovvero

kinematicsForward
pos->tran.x = joints[1];
pos->tran.y = joints[0];

kinematicsInverse
joints[1] = pos->tran.x;
joints[0] = pos->tran.y;

E in effetti funziona ma solo se eseguo dei comandi GCode, cioè con G0X100 si muove il motore delle Y, se invece premo sulla tastiera la freccia a destra (movimento in X) si muove ancora il motore della X. :?


Ho poi provato con l'esempio sul sito di Linuxcnc
http://linuxcnc.org/docs/html/motion/kinematics.html

kinematicsForward
double AD2 = joints[0] * joints[0];
double BD2 = joints[1] * joints[1];
double x = (AD2 - BD2 + Bx * Bx) / (2 * Bx);
double y2 = AD2 - x * x;
if(y2 < 0) return -1;
pos->tran.x = x;
pos->tran.y = sqrt(y2);
pos->tran.z = joints[2];
pos->a = joints[3];
pos->b = joints[4];
pos->c = joints[5];
pos->u = joints[6];
pos->v = joints[7];
pos->w = joints[8];

kinematicsInverse
double x2 = pos->tran.x * pos->tran.x;
double y2 = pos->tran.y * pos->tran.y;
joints[0] = sqrt(x2 + y2);
joints[1] = joints[1] = sqrt((Bx - pos->tran.x)*(Bx - pos->tran.x) + y2);
joints[2] = pos->tran.z;
joints[3] = pos->a;
joints[4] = pos->b;
joints[5] = pos->c;
joints[6] = pos->u;
joints[7] = pos->v;
joints[8] = pos->w;

Anche quì compilo senza problemi (Bx ha valore di 200) ma quando premo F2 ottengo un errore di inseguimento sull'asse 1. I motori sono passo passo ad anello aperto quindi credo che il problema sia nel definire le posizioni iniziali o qualche cosa del genere.

Qualche suggerimento?


Grazie in anticipo.

billielliot
Senior
Senior
Messaggi: 1747
Iscritto il: martedì 16 ottobre 2007, 23:23
Località: Trezzo sull'Adda

Re: Prove con cinematica

Messaggio da billielliot » martedì 10 ottobre 2017, 12:43

Ciao Gima,

I miei due centesimi: una possibile causa dell'errore di inseguimento e' data da una scheda madre non adatta a LinuxCNC. Se non lo hai ancora fatto, esegui il latency-test e sincerati che la scheda sia adeguata a supporatre un kernel in real-time.

Ciao :-)

Mauro
Amat victoria curam

ross
Member
Member
Messaggi: 351
Iscritto il: mercoledì 3 agosto 2011, 23:16
Località: Macerata (MC)

Re: Prove con cinematica

Messaggio da ross » martedì 10 ottobre 2017, 20:41

Codice: Seleziona tutto

joints[1] = joints[1] = sqrt((Bx - pos->tran.x)*(Bx - pos->tran.x) + y2); 
Credo che in questa riga c'è un "joints[1]" di troppo.

Ross

Dino
Senior
Senior
Messaggi: 815
Iscritto il: lunedì 13 novembre 2006, 23:08
Località: Dolomiti (BL)
Contatta:

Re: Prove con cinematica

Messaggio da Dino » martedì 10 ottobre 2017, 23:11

Gima ha scritto:E in effetti funziona ma solo se eseguo dei comandi GCode, cioè con G0X100 si muove il motore delle Y, se invece premo sulla tastiera la freccia a destra (movimento in X) si muove ancora il motore della X. :?
I tasti della tastiera muovono direttamente i "giunti" (Joint) per quello premendo le frecce Dx e Sx si muove comunque l'asse X.

Mentre per il problema dell'errore di inseguimento ora mi viene in mente solo che l'errore massimo ammesso (per l'asse che va in errore) sia minore della risoluzione del sistema, considera che ci sono molte variabili in questa configurazione e la somma degli errori potrebbe essere alta.
NON più moderatore della sezione EMC ( http://www.linuxcnc.org/ )
Felice utilizzatore di GNU/Linux http://www.gnu.org/ http://www.kernel.org/
Linux Registered User #192043 http://counter.li.org/
Sito internet http://dino.delfavero.it/

Gima
Newbie
Newbie
Messaggi: 6
Iscritto il: lunedì 17 febbraio 2014, 21:42
Località: Brescia

Re: Prove con cinematica

Messaggio da Gima » mercoledì 11 ottobre 2017, 1:47

Grazie a tutti per le risposte

A Ross, in effetti è sbagliato, nel codice originale non c'è, colpa del copia incolla, scusa.

A Dino, ho provato a cambiare leggermente il codice:
da
if(y2 < 0) return -1;

a
if(y2 < 0){
y2=-y2;
}

e ora ottengo errore di inseguimento anche per l'asse 2. Probabilmente il codice rispondeva con return -1 (proprio per la somma degli errori) e avevo l'errore solo sull'asse 1. A proposito, l'errore è quello nel file .ini? MIN_FERROR = .25

Ad ogni modo ora ho qualche cosa su cui lavorare, vi tengo informati.

Grazie a tutti.
Ciao

Dino
Senior
Senior
Messaggi: 815
Iscritto il: lunedì 13 novembre 2006, 23:08
Località: Dolomiti (BL)
Contatta:

Re: Prove con cinematica

Messaggio da Dino » mercoledì 11 ottobre 2017, 18:55

Si esatto, per fare la prova aumenta di molto il valore di MIN_FERROR e vedi se risolvi.
il fatto che c'era:

Codice: Seleziona tutto

if(y2 < 0) return -1;
è dato dal fatto che in certe condizioni non hai una corrispondenza unica tra posizione nello spazio e posizione dei vari joints, per alcune aree è possibile avere lo stesso punto nello spazio (che poi in realtà con quella configurazione sarà nel piano) con due posizioni diverse dei giunti, credo che in "produzione" bisognerà prevedere una unica posizione per tutti i casi particolari.

D
NON più moderatore della sezione EMC ( http://www.linuxcnc.org/ )
Felice utilizzatore di GNU/Linux http://www.gnu.org/ http://www.kernel.org/
Linux Registered User #192043 http://counter.li.org/
Sito internet http://dino.delfavero.it/

Rispondi

Torna a “Linuxcnc”