Problema geometrico su macchine CNC.

johnjohn2
Salve a tutti,
vorrei esporvi un problema di tipo geometrico che ho incontrato nello sviluppo di un software per macchine a controllo numerico e non sapendo dove postare ho pensato di lasciarlo qui!!!

il problema è piuttosto semplice : percorrere un segmento AB comunque orientato nello spazio (x,y,z) partendo dal punto A e potendo effettuare solo spostamenti di lunghezza fissa predefinita lungo ogni asse.
Provo a spiegarmi meglio con un esempio su un piano: mi trovo nel punto A(10,12) e devo raggiungere il punto B(27,-96) (o il punto a B più vicino possibile) eseguendo solo spostamenti pari a 0,85 per ogni singolo asse, quindi a partire da A il primo punto successivo P(x,y) che posso raggiungere sarà uno dei seguenti :
1)P(10 + 0,85 , 12 + 0,85)
2)P(10 - 0,85 , 12 + 0,85)
3)P(10 + 0,85 , 12 - 0,85)
4)P(10 - 0,85 , 12 - 0,85)
5)P(10 , 12 + 0,85)
6)P(10 , 12 - 0,85)
7)P(10 + 0,85 , 12 )
8)P(10 - 0,85 , 12 )

ora non mi resta che calcolare la distanza di ogniuno degli 8 punti P(x,y) possibili dalla retta passante per AB e scegliere il più vicino al segmento da seguire e ricominciare da capo sino a raggiungere il punto B o un suo "intorno"!

Ovviamente posso estendere il ragionamento sullo spazio a 3 dimensioni.

Purtroppo questo sistema già su 2 dimensioni richiede di calcolare almeno 8 distanze ed eseguire i relativi confronti, su 3 assi diventa improponibile.

Se qualcuno ha la possibilità di proporre un algoritmo più veloce sarò ben lieto di testarlo sul mio sistema!!!!

Grazie a tutti in attesa di una vostra idea!!!

Risposte
codino75
forse potresti escludere i seguenti casi:

decrementi per le componenti che devono aumentare (cioe' per le quali ascissa finale>ascissa iniziale) , analizzando quindi le solle possibilita' di [=0] e di [+passounitario]

e analogamente per le componenti che devono diminuire...

alex

johnjohn2
Grazie Alex, è una cosa alla quale non avevo pensato e che userò sicuramente (già oggi!!).

Devo comunque riuscire a trovare un algoritmo più veloce per calcolare l'n-esimo punto successivo più vicino al mio segmento avendo anche notato che dopo i primi passi si ha un blocco che si ripete sempre uguale!!! ma ancora non sono riuscito ad estrapolare una regola.

Comunque grazie per il suggerimento.... risparmierò un sacco di millisecondi!!! :-)

JohnJohn

codino75
ok ora ci penso....
che hardware hai a disopsizione?

johnjohn2
che cosa intendi??
un pentium 4 con un bel po' di memoria!! :-)
Poi ci sono i drives per i motori passo-passo.
Se vuoi dettagli chiedi pure in maniera specifica!!!
Grazie

codino75
in rete non hai trovato niente?
mi sembra un problema abbastanza standard...

TomSawyer1
Visto che puoi spostarti contemporaneamente sia sull'asse $x$ che sull'asse $y$, e' sufficiente che ti sposti diagonalmente vverso B fino a quando sei allineato (piu' o meno) o con la $x$ o con la $y$ di B, poi procedi nell'unica direzione consentita. Tu intendi questo?

codino75
"Crook":
Visto che puoi spostarti contemporaneamente sia sull'asse $x$ che sull'asse $y$, e' sufficiente che ti sposti diagonalmente vverso B fino a quando sei allineato (piu' o meno) o con la $x$ o con la $y$ di B, poi procedi nell'unica direzione consentita. Tu intendi questo?


da quello che ho capito io lui deve seguire il segmento AB piu' da vicino possibile...non andare semplicemente da A a B

johnjohn2
Ho inserito un'immagine per spiegare meglio il problema, comunque è come dice codino75, io devo rimanere in ogni passo il più vicino possibile al segmento!!!
come potete notare sembra esistere un modulo che si ripete, in questo caso un passo su X e Y poi uno solo su X e infine uno su X e Y , poi si ricomincia sino al punto B.
ho fatto molti test e prove ma non riesco ad estrapolare una regola fissa per calcolare il modulo base e poi ripeterlo!!!
Mi metto a piangere!!! :-(

la soluzione immediata non è difficile : calcolo i possibili spostamenti per ogni passo, trovo tra questi quello più vicino alla retta passante per AB imponendo la perpendicolarità e scelgo il meno distante poi ricomincio.

il mio problema però è nel trovare una soluzione con pochi passaggi poichè deve essere ripetuta centinaia o migliaia di volte e la cosa mi rallenta la macchina sopratutto su 3 assi!!

se qualcuno ha una vaga idea io sono qui!!!


codino75
il fatto che ci siano un gruppo di spostamenti che si ripete dipende dalla particolare scelta del segmento AB.
in generale cio' non si verifica...cioe' in generale la soluzione non sara' costituita da un insieme di spostamenti che si ripetono sempre uguali...

codino75
a meno che non ti accontenti di una soluzione approssimata...
ma in concreto, cosa e' che devi muovere?

johnjohn2
"codino75":
il fatto che ci siano un gruppo di spostamenti che si ripete dipende dalla particolare scelta del segmento AB.
in generale cio' non si verifica...cioe' in generale la soluzione non sara' costituita da un insieme di spostamenti che si ripetono sempre uguali...


Non so che dirti ... io ho fatto un bel po' di prove e sembra come dico io ma come ho detto prima non riesco a dimostrarlo .... altrimenti avrei risolto!!! :D
ti posso dire che è possibile calcolare a priori quanti passi fare in ogni direzione (spostamento lungo un asse diviso la lunghezza del passo) , per esempio se il mio passo è 2 e il mio segmento AB è A(0,0) B(10 , 5.3) posso dire che lo spostamento su X è di 5 passi e su Y di 3, e non c'è dubbio che io debba fare questi passi:
il primo nella direzione XY
il secondo nella direzione X
poi ricomincio... XY,X,XY,X sino a B

ovviamente per un segmento lungo il doppio devo solo ripetere il blocco base di passi per un numero doppio di volte e lo stesso se il segmento è 3, 4, 5, 6... volte o viceversa 1/2, 1/3, 1/4.... ecc sino al minimo che corrisponde alla lunghezza del mio passo!!!

MI SEMBRA IMPOSSIBILE CHE NON ESISTA UNAREGOLA

ma non riesco a trovarla!!!

mi sarebbe anche utile che qualcuno mi dimostrasse il contrario in maniera definitiva!!! almeno abbandonerei questa strada!!

il mio povero encefalo stà fondendo da settimane!!!

johnjohn2
"codino75":
a meno che non ti accontenti di una soluzione approssimata...
ma in concreto, cosa e' che devi muovere?


Scusa... non mi ero spiegato bene.... ci sono tre motori che gestisco da porta parallela che muovono un pezzo da lavorare lungo tre assi .
sono motori passo-passo che effettuano movimenti discreti: fanno 200 passi/giro, che con opportune riduzioni spostano gli assi nel mio caso di 0.005 mm.
quindi la mia approssimazione dipende da fattori meccanici che possono cambiare da macchina a macchina... io la considero una costante a livello di algoritmo!

diciamo che mi accontento di seguire il segmento il più vicino possibile (meccanicamente non posso fare altro)!!!

codino75
"codino75":
il fatto che ci siano un gruppo di spostamenti che si ripete dipende dalla particolare scelta del segmento AB.
in generale cio' non si verifica...cioe' in generale la soluzione non sara' costituita da un insieme di spostamenti che si ripetono sempre uguali...


in effetti non sono sicuro che sia vero cio' che ho scritto...

cmq, io direi che, per tutti i segmenti di uguale inclinazione ho la stessa soluzione.
non potresti calcolare offline tali soluzioni, cioe' trovarti le soluzioni per dei segmenti con tutte le inclinazioni possibili, memorizzarle, e poi utilizzare quella che di volta in volta ti serve?

c'e' poi un discorso da fare ancora riguardo a quanto deve essere la differenza di inclinazione tra due soluzioni .

johnjohn2
"codino75":
[quote="codino75"]il fatto che ci siano un gruppo di spostamenti che si ripete dipende dalla particolare scelta del segmento AB.
in generale cio' non si verifica...cioe' in generale la soluzione non sara' costituita da un insieme di spostamenti che si ripetono sempre uguali...


in effetti non sono sicuro che sia vero cio' che ho scritto...

cmq, io direi che, per tutti i segmenti di uguale inclinazione ho la stessa soluzione.
non potresti calcolare offline tali soluzioni, cioe' trovarti le soluzioni per dei segmenti con tutte le inclinazioni possibili, memorizzarle, e poi utilizzare quella che di volta in volta ti serve?

c'e' poi un discorso da fare ancora riguardo a quanto deve essere la differenza di inclinazione tra due soluzioni .[/quote]

é una soluzione alla quale avevo pensato ma non è possibile perchè ho infinite inclinazioni e mi è concesso solo di arrivare ad un punto P distante da B non più del passo eseguibile.

codino75
siano
A(xa,ya)
B(xb,yb)

puoi dirmi di che ordine di grandezza sono:
yb-ya ? (cioe' yb meno ya)
xb-xa ?
e con quale precisione (cioe' quante cifre decimali ) vengono fornite xa,ya,xb,yb?

johnjohn2
non ho ben capito dove vuoi arrivare comunque:

1) la precisione è quella del minimo passo possibile dal sistema che non è predefinito, in teoria si può parlare di micron, nel mio caso sono 0.005 mm

2) sempre nel mio caso le cifre decimali sono 3

codino75
non so bene dove voglio arrivare , cmq mi sono dimenticato di chiederti 1 dato.
la lunghezza massima del segmento AB?

johnjohn2
non esiste lunghezza massima teorica, comunque 2000mmm è già esagerata!!!

codino75
io non so se esiste una regola matematica per trovare tali cammini...
forse ti conviene postare lo stesso quesito nella sezione 'generale'.
per conto mio cercavo di capire quanto era onerosa la scelta di fare tutto il 'lavoro sporco' off line...

ho calcolato che, se la lunghezza max e' di 2000mm e la precisione delle coordinate di B e' di 0,005mm avresti 400000 possibili inclinazioni differenti per il segmento...

Pulcepelosa
Scusa ma i segmenti sono solo lineari? o anche curvi?

Non puoi introdurre una variabile temporale?
Cioè calcoli il numero di passi totali da fare lungo la coordinata x e il numero di passi totali lungo la coordinata y.
A questo punto, in un tempo t la testa dovra spostarsi di totX passi lungo x e insieme di totY passi lungo y.

Esempio:
Lo spostamento da fare è 10 passi in alto e 100 a destra.
Preso un tempo arbitrario(che puo' essere calcolato in funzione della lunghezza effettiva del segmento), per esempio 5 secondi, 10/5=2passi al secondo verso l'alto,
100/5=20 passi ogni secondo a destra.

Per le curve o i cerchi è consigliato usare le funzioni seno e coseno.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.