Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /membri/mk4duowiki/wiki/inc/parser/handler.php on line 1552
====== Junction Speed ====== //Autore: [[iosonopersia@gmail.com|Simone Persiani]]// ==== Introduzione ==== I progetti [[https://marlinfw.org|Marlin]] ed ''MK4duo'', a partire rispettivamente dalle versioni ''1.1.9'' e ''4.3.6'', hanno introdotto un nuovo algoritmo nel tentativo di superare l'ormai datato [[guide:junction_speed:jerk_limiting|Jerk Limiting]]. Tale gestione non ha mai convinto del tutto gli sviluppatori di [[https://marlinfw.org|Marlin]] e ha causato loro molti grattacapi nel corso degli anni. Nel tentativo di superare tale algoritmo si sono ispirati ai codici sorgente di [[http://reprap.org/wiki/Grbl#Grbl|Grbl]], un ben noto firmware per la gestione di macchine CNC, ottenendo e migliorando il [[guide:junction_speed:junction_deviation|Junction Deviation]] (il tutto nel pieno rispetto delle licenze associate a tale prodotto). Ricordiamo che [[https://marlinfw.org|Marlin]] stesso è nato nell'agosto del 2011 proprio come fork di [[http://reprap.org/wiki/Grbl#Grbl|Grbl]] e di [[http://reprap.org/wiki/List_of_Firmware#Sprinter|Sprinter]]. Tali algoritmi (l'uno alternativo all'altro) si rendono necessari nel momento in cui il ''planner'' (il modulo software che si occupa dell'ottimizzazione dei movimenti della macchina) si trova a dover scegliere con quale velocità far terminare un blocco e cominciare il successivo, ovvero la ''Junction Speed'' (velocità di giunzione tra spostamenti successivi). ==== Premessa ==== In un mondo ideale stamperemmo tutti alla velocità della luce e otterremmo i pezzi stampati in un istante. Ciò ovviamente non è possibile: le nostre macchine hanno dei motori che possono raggiungere solo determinate velocità massime, hanno dei telai in grado di assorbire solo una certa quantità di vibrazioni e di sopportare carichi di forze/tensioni limitati, hanno delle parti in movimento con massa sicuramente diversa da zero, ecc. Le vibrazioni che si vengono a creare quando stampiamo ad alte velocità impattano sulla qualità dell'oggetto stampato (vedi //effetto ghosting//). Si rende quindi necessario trovare una strategia efficiente per gestire le accelerazioni di ciascun asse in modo da trovare un buon compromesso tra qualità e tempi di stampa. Per la Legge Fondamentale della Dinamica (\vec{F}=m*\vec{a}) le forze esercitate dai motori sul telaio della stampante dipendono contemporaneamente sia dalle masse in movimento sia dalle accelerazioni che esse subiscono. Non è quindi possibile trovare un'accelerazione massima che sia corretta per ogni stampante, perché quest'ultima dipenderà dalle caratteristiche meccaniche di ciascuna macchina. In linea generale è corretto assumere che si possa aumentare la massima accelerazione di un asse nel caso in cui se ne siano alleggerite le parti in movimento, e viceversa. È quindi possibile definire nel firmware le accelerazioni massime per ciascun asse (compresi gli estrusori!) in base alla loro **inerzia** (nel linguaggio comune diremmo //lentezza// e/o //pesantezza//). Tali accelerazioni definiscono la rapidità con cui l'attuale velocità di un asse possa essere variata per raggiungere una velocità target. **In questo modo gli spostamenti pianificati dalla macchina possono essere modellati tenendo correttamente in considerazione anche le masse in movimento.** Il ''planner'' si occupa inoltre di concatenare gli spostamenti in modo che la velocità con cui termina un blocco sia la stessa di quella con cui comincia il blocco successivo (\vec{v^{i}}_{finale}=\vec{v^{i+1}}_{iniziale}), con lo scopo di rendere più "fluido" il passaggio da uno spostamento all'altro. La scelta della ''Junction Speed'' non è così scontata come potrebbe apparire ad una prima analisi ed è un fattore critico in grado di produrre effetti apprezzabili sui tempi di stampa. ==== Il jerk ==== Ogni spostamento è sempre associato ad una velocità: per raggiungerla è necessario effettuare una accelerazione//[decelerazione]//, a seconda che la velocità attuale sia minore//[maggiore]// rispetto al target. Supponiamo che la macchina abbia pianificato di dover eseguire due blocchi in successione: il blocco j a velocità \vec{v}_j ed il blocco k a velocità \vec{v}_k. La velocità di giunzione tra i due blocchi (incognita!) è \vec{v}_{junction}. Il blocco j è ora in esecuzione con velocità \vec{v}_j: gli rimane un tempo t_j per raggiungere \vec{v}_{junction}, ciò significa che si renderà necessaria una accelerazione \vec{a}_j = {\Delta \vec{v}}/{\Delta t} = {\vec{v}_{junction} - \vec{v}_j}/{t_j}. A questo punto il blocco k avrà a disposizione un tempo t_k per portarsi alla velocità \vec{v}_k, ciò significa che si renderà necessaria una accelerazione \vec{a}_k = {\Delta \vec{v}}/{\Delta t} = {\vec{v}_k - \vec{v}_{junction}}/{t_k}. In generale \vec{a}_j <> \vec{a}_k: ciò significa che il jerk (derivata dell'accelerazione nel tempo), assumerà un valore diverso da zero **solo** nell'intervallo di tempo durante la transizione da un'accelerazione all'altra, mentre sarà uguale a zero per il resto del tempo. Esso infatti è calcolato come \vec{jerk} = {\Delta \vec{a}} / {\Delta t} = {\vec{a}_k - \vec{a}_j}/{t_0}, laddove t_0 è un valore molto piccolo dell'ordine di pochi microsecondi. Il jerk è una variazione (aumento/diminuzione) di accelerazione che può produrre effetti indesiderati sulle stampe e questo sistema è in grado di mantenerlo a zero per la maggior parte del tempo. Se i motori stepper incaricati di eseguire movimenti con jerk non nullo hanno abbastanza coppia (//torque// in inglese), allora saranno in grado di effettuare tali transizioni senza perdita di step (ovvero senza ridurre la precisione e la qualità di stampa). In caso contrario sarà necessario ridurre la massima accelerazione per gli assi che presentano problemi. Esiste però una funzionalità che permette di mantenere **sempre** il jerk a zero. Per informazioni, riferirsi alla guida [[guide:s_curve_acceleration|S-Curve Acceleration]] ==== Algoritmi implementati ==== La guida sugli algoritmi attualmente implementati prosegue nelle rispettive pagine dedicate: * [[guide:junction_speed:jerk_limiting|Jerk Limiting]] (classico) * [[guide:junction_speed:junction_deviation|Junction Deviation]] (nuovo) //Autore: [[iosonopersia@gmail.com|Simone Persiani]]//