[[guide:junction_speed:junction_deviation]]

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisione Revisione precedente
Prossima revisione
Revisione precedente
guide:junction_speed:junction_deviation [01/06/2018 13:03]
Simone Persiani ↷ Pagina spostata e rinominata da guidegfd a guide:junction_speed:junction_deviation
guide:junction_speed:junction_deviation [01/07/2018 22:00] (versione attuale)
Simone Persiani
Linea 1: Linea 1:
-==== Algoritmo "​Junction Deviation"​ ==== +====== Algoritmo "​Junction Deviation"​ ======
-=== Strategia === +
-L'​algoritmo ''​Jerk Limiting''​ ragiona su ciascun asse separatamente,​ senza perciò tener in considerazione l'​effettiva traiettoria generata dai movimenti pianificati nel ''​planner''​. Il risultato è che nelle curve, che sono sempre composte da una moltitudine di segmenti più o meno "​corti",​ il ''​planner''​ cerca di assicurare che ciascun asse non subisca variazioni troppo alte di velocità limitando separatamente le componenti <​m>​\vec{v}_X</​m>,​ <​m>​\vec{v}_Y</​m>​ e <​m>​\vec{v}_Z</​m>,​ finendo spesso per limitare eccessivamente la velocità totale (data dalla loro somma vettoriale: <​m>​\vec{v} = \vec{v}_X + \vec{v}_Y +\vec{v}_Z</​m>​).+
  
-L'​algoritmo ''​Junction Deviation''​ fornisce invece al ''​planner''​ una visione d'​insieme migliore sulla coda di movimenti da eseguire, permettendogli di scegliere <​m>​\vec{v}_{junction}<​/m> tenendo conto solamente di fattori relativi alla traiettoria degli spostamenti. Il risultato è un algoritmo più semplice ed efficace, in grado di evitare rallentamenti eccessivi e quindi di velocizzare la percorrenza di tratti curvilinei. Alcuni utenti di ''​Marlin'',​ i primi ad aver testato tale algoritmo, hanno riferito di aver notato una diminuzione di circa il 20% sui tempi di stampa.+//Autore: [[iosonopersia@gmail.com|Simone Persiani]]//​
  
-=== L'​algoritmo ===+==== Strategia ==== 
 +L'​algoritmo ​[[guide:​junction_speed:​jerk_limiting|Jerk Limiting]] opera su ciascun asse separatamente,​ senza cioè tener in considerazione l'​effettiva traiettoria seguita dagli spostamenti che si succedono nel corso di una stampa. La [[guide:​junction_speed:​start|Junction Speed]] in questo modo non viene influenzata da un fattore fondamentale:​ l'​angolo <​m>​\Theta</​m>​ tra uno spostamento ed il successivo, ovvero la //"​curvatura"//​ della traiettoria. Si può facilmente intuire l'​importanza di tale angolo: più l'​angolo è grande meno sarà necessario rallentare, e viceversa. Il modello fisico implementato dal [[guide:​junction_speed:​jerk_limiting|Jerk Limiting]] è quindi inaccurato e porta, generalmente,​ ad eccessivi rallentamenti (che aumentano inutilmente i tempi di stampa). 
 + 
 +L'​algoritmo ''​Junction Deviation''​ si propone invece di scegliere <​m>​\vec{v}_{junction}</​m>​ tenendo conto anche dell'​angolo <​m>​\Theta</​m>​. Il risultato è un algoritmo più semplice ed efficace, in grado di velocizzare la percorrenza di tratti curvilinei. Questo nuovo modello fisico permette di ottenere le <​m>​\vec{v}_{junction}</​m>​ corrette in ogni occasione, adattandosi alle più diverse situazioni. 
 + 
 +==== L'​algoritmo ====
 <WRAP center round todo 100%> <WRAP center round todo 100%>
 **NOTA DELL'​AUTORE:​** **NOTA DELL'​AUTORE:​**
-Attualmente la migliore spiegazione si trova qui: [[https://​onehossshay.wordpress.com/​2011/​09/​24/​improving_grbl_cornering_algorithm/​|Improving Grbl cornering algorithm]]. È disponibile solo in lingua inglese ​e in alcuni passaggi è un po' sbrigativa e confusa, per lo meno agli occhi dell'​autore di questa guida. Per questo motivo, se dovesse servire, potrei dedicarmi alla sua riscrittura in lingua italiana.+Attualmente la migliore spiegazione ​dell'​algoritmo ​si trova qui: [[https://​onehossshay.wordpress.com/​2011/​09/​24/​improving_grbl_cornering_algorithm/​|Improving Grbl cornering algorithm]]. È disponibile solo in lingua inglese. Per questo motivo, se dovesse servire, potrei dedicarmi alla sua riscrittura in lingua italiana. Nel frattempo, se ne consiglia fortemente la lettura.
 </​WRAP>​ </​WRAP>​
  
-=== Configurazione dei parametri === +==== Configurazione dei parametri ​==== 
-Per attivare questa funzionalità è necessario assicurarsi di aver abilitato l'​opzione ''​JUNCTION_DEVIATION''​. ​I parametri attualmente disponibili sono i seguenti:+Per attivare questa funzionalità è necessario assicurarsi di aver abilitato l'​opzione ''​JUNCTION_DEVIATION''​. ​Il parametro dell'​algoritmo è il seguente:
 <​code>​ <​code>​
-#define JUNCTION_DEVIATION ​// per abilitare il Junction Deviation e disabilitare il Jerk Limiting +#define JUNCTION_DEVIATION 
-#define JUNCTION_DEVIATION_MM 0.05 // valore decimale ​maggiore o uguale a 0 +#define JUNCTION_DEVIATION_MM 0.05 // valore decimale ​compreso tra 0.01 e 0.3 (estremi inclusi)
-#define JUNCTION_ACCELERATION 1000 +
-//#define JUNCTION_DEVIATION_INCLUDE_E+
 </​code>​ </​code>​
  
-  * Per comprendere l'​opzione ''​JUNCTION_DEVIATION_MM''​ è strettamente necessario aver capito a fondo il funzionamento dell'​algoritmo. Si faccia riferimento alla guida di cui sopra è stato fornito il link. Si sappia che è un valore espresso in mm e che un range sicuro di possibili valori va da 0mm a 0,5mm. Ovviamente questi valori vanno testati sulla propria macchina procedendo per tentativi+=== JUNCTION_DEVIATION_MM === 
-  * ''​JUNCTION_ACCELERATION''​ è il più semplice da immaginare: trattasi della massima accelerazione centripeta che la meccanica può sostenereDurante i cambi di direzione il nuovo algoritmo cerca di mantenere costante la velocità: ​l'accelerazione centripeta è <m>a_{centripeta} = {v^2}/{r}</​m>, ​dove r è il raggio di curvatura<​m>​\vec{v}</​m>​ e soprattutto <​m>​r</​m>​ possono cambiare da un movimento ​all'altrodeterminando ​di volta in volta un diverso valore ​di <m>a_{centripeta}</​m>​. ​''​JUNCTION_ACCELERATION'' ​permette quindi di limitare <​m>​a_{centripeta}</​m>;​ +Per comprendere l'​opzione ''​JUNCTION_DEVIATION_MM''​ è strettamente necessario aver capito a fondo il funzionamento dell'​algoritmo. Si faccia riferimento alla guida di cui sopra è stato fornito il link. Si sappia che è un valore espresso in mm e che un range sicuro di possibili valori va da 0.01mm ​a 0,3mm. Ovviamente questi valori vanno testati sulla propria macchina procedendo per tentativi. Si tenga presente che questo parametro rappresenta l'errore di approssimazione del modello fisico utilizzato dall'algoritmoPorlo a 0.01mm significa utilizzare un modello accurato quasi al 100%, con l'inconveniente che in questo modo le <m>v_{junction}</​m> ​saranno molto limitate. Nella pratica conviene cercare di aumentare progressivamente questo valore in modo da aumentare la velocità nei cambi di direzionefacendo attenzione a scegliere una quantità che non porti la stampante a produrre troppo rumore o troppe vibrazioniAumentare questo valore significa infatti fornire più flessibilità ​all'algoritmoche potrà così decidere ​di percorrere i cambi di direzione con "​accelerazioni centripete"​ più alte. 
-  ​Per fare in modo che per la valutazione dell'​angolo di curvatura venga tenuto in conto anche l'avanzamento/​ritrazione del filamento, è necessario abilitare l'opzione ''​JUNCTION_DEVIATION_INCLUDE_E''​. ​Questa opzione ​è <wrap em>​assolutamente sperimentale</​wrap>​! Siccome abilitando tale opzione l'​angolo verrebbe calcolato in uno spazio quadridimensionale XYZE, nemmeno gli sviluppatori ​del ''​Junction Deviation''​ sono in grado di predirne con sicurezza gli effetti! L'​opzione ​è presente perché il ''​planner'' ​ha a disposizione anche i dati relativi all'​estrusore:​ siccome lo sforzo che sarebbe servito per aggiungere tale possibilità era davvero minimo, pur non riuscendo ad immaginarne gli effetti o l'utilità, gli sviluppatori hanno pensato di lasciare tale funzione e di permettere agli utenti di sperimentarla sulle loro macchine per verificare se ciò possa produrre miglioramenti apprezzabili o meno.+<WRAP center round info 100%> 
 +''​JUNCTION_DEVIATION_MM''​ **è un parametro salvato ​in EEPROM e può essere modificato ​anche senza ricompilare il firmware:** basta utilizzare il comando ​''​M205 J<?>''​. ​Al termine delle modifiche, se si è soddisfatti ​del valore impostato ​è possibile salvarlo permanentemente tramite comando ​''​M500'' ​(richiede ​l'attivazione del supporto alla EEPROM). 
 +</​WRAP>​
  
-=== L'​analogia dell'​automobile === +=== DEFAULT_MAX_ACCELERATION === 
-Se volessimo utilizzare un'​analogia per far comprendere meglio il significato dei primi due parametri, faremmo sicuramente riferimento ad un'automobile ​che si appresta ad affrontare una curva stretta. +<wrap em>​Attenzione!</​wrap>​ Prima ancora di cominciare a sperimentare con i valori di ''​JUNCTION_DEVIATION_MM'',​ è assolutamente consigliabile ricontrollare i seguenti parametri:​ 
- +<​code>​ 
-In questa analogia, tratta dalla guida sopra citata, ''​JUNCTION_DEVIATION_MM''​ rappresenta la larghezza della strada rispetto a quella dell'​automobile:​ impostarlo a zero significa che la strada sarà della stessa larghezza della vettura, la quale sarà costretta (come se fosse su di un binario) a rallentare molto per affrontare la curva senza uscire dalla carreggiata. Viceversa, aumentare tale valore renderà la strada più larga e permetterà all'​automobile di scegliere una traiettoria più veloce (con la differenza che nel caso della stampante la traiettoria rimarrà ovviamente la stessa ma sarà percorsa a velocità maggiore).+#define DEFAULT_MAX_ACCELERATION {3000,​3000,​100,​3000,​3000,​3000,​3000,​3000,​3000} 
 +// Nell'​ordine:​ max. accel. dell'​asse X, Y, Z, E0, E1, E2, E3, E4 ed E5 
 +</​code>​ 
 +Il ''​Junction Deviation'',​ infatti, si preoccupa di limitare le accelerazioni su ciascun asse in base ai limiti qui impostati. Si rivela fondamentale,​ quindi, aver impostato questi valori nel modo corretto. Essi devono rispecchiare l'​inerzia di ciascun asse. 
 +<WRAP center round info 100%> 
 +''​DEFAULT_MAX_ACCELERATION''​ **è un parametro salvato in EEPROM e può essere modificato anche senza ricompilare il firmware:** basta utilizzare il comando ''​M201 X<?> Y<?> Z<?>''​. Al termine delle modifiche, se si è soddisfatti del valore impostato è possibile salvarlo permanentemente tramite comando ''​M500''​ (richiede l'​attivazione del supporto alla EEPROM). 
 +</​WRAP>​ 
 +==== L'​analogia dell'​automobile ​da corsa ==== 
 +Se volessimo utilizzare un'​analogia per far comprendere meglio il significato dei primi due parametri, faremmo sicuramente riferimento ad un'auto da Formula 1 che si appresta ad affrontare una curva.
  
-''​JUNCTION_ACCELERATION'' ​rappresenterebbe invece il "​grip"​ (l'​aderenza) delle gomme con l'asfaltose l'​aderenza è scarsa, la velocità ​di percorrenza della curva deve essere limitata di molto per evitare di scivolare fuori traiettoria. Viceversa, ​un valore ​alto significa che l'​automobile è in grado di sopportare accelerazioni centripete ​più alte quindi può premere ​più bruscamente i pedali del gas e del freno.+In questa analogia, liberamente ispirata dalla guida sopra citata, ​''​JUNCTION_DEVIATION_MM'' ​rappresenta la larghezza della pista rispetto a quella dell'autoimpostarlo a zero significa imporre che la pista sia della stessa larghezza della vettura, la quale sarà costretta (come se fosse su di un binario) a rallentare moltissimo ​per affrontare la curva correttamente. Viceversa, ​aumentare tale valore ​renderà la strada ​più larga permetterà al bolide di scegliere una traiettoria ​più veloce (con la sola differenza che nel caso della stampante la traiettoria rimarrà ovviamente la stessa ma sarà percorsa a velocità maggiore).
  
-I due parametri vanno quindi ​impostati ​tenendo conto del loro significato fisico/​geometrico. L'​utente è libero di sperimentare per trovare i valori limite della propria stampante ma il consiglio è quello di non allontanarsi troppo dai valori ​di default, a meno che non si sappia esattamente cosa si stia facendo.+Questo parametro va quindi ​impostato ​tenendo conto del suo significato fisico/​geometrico. L'​utente è libero di sperimentare per trovare i valori limite della propria stampante ma il consiglio è quello di non allontanarsi troppo dai quelli ​di default, a meno che non si sappia esattamente cosa si stia facendo.
  
 +//Autore: [[iosonopersia@gmail.com|Simone Persiani]]//​