[[guide:junction_speed:start]]

Questa è una vecchia versione del documento!


Jerk Limiting vs Junction Deviation

I progetti Marlin ed MK4duo, a partire rispettivamente dalle versioni 1.1.9 e 4.3.6, hanno introdotto una nuova funzionalità nel tentativo di superare l'ormai datata gestione del jerk degli assi. Tale gestione non ha mai convinto del tutto gli sviluppatori di Marlin e ha causato loro molti grattacapi nel corso degli anni. Nel tentativo di superare tale algoritmo si sono ispirati ai codici sorgente di Grbl, un ben noto firmware per la gestione di macchine CNC, prendendo spunto dall'algoritmo della Junction Deviation (il tutto nel pieno rispetto delle licenze associate a tale prodotto). Ricordiamo che Marlin stesso è nato nell'agosto del 2011 proprio come fork di Grbl e di 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 velocità di giunzione dei due blocchi.

Per maggiori informazioni sui blocchi e sul loro funzionamento, far riferimento alla guida Beziér Curve Acceleration

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à dalla struttura meccanica di ciascuna macchina. In linea generale è corretto assumere che la massima accelerazione possa essere aumentata nel caso in cui si siano alleggerite le parti in movimento (il carrello dell'hotend e/o il piatto di stampa, a seconda della meccanica), e viceversa.

É quindi possibile definire nel firmware le accelerazioni massime per ciascun asse, compresi gli estrusori. Tali accelerazioni definiscono la rapidità con cui l'attuale velocità di un asse può essere aumentata/diminuita per raggiungere una velocità prefissata. I movimenti pianificati dalla macchina vengono quindi modellati rispettando le accelerazioni massime per ogni asse definite dall'utente.

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_{finale}^{i}}=\vec{v_{iniziale}^{i+1}}$), con lo scopo di rendere più "fluido" il passaggio da uno spostamento all'altro. La scelta di questa velocità non è così scontata come potrebbe apparire ad una prima analisi ed è un fattore critico in grado di produrre effetti apprezzabili sui tempi di stampa.

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} = \frac{\vec{\Delta v}}{\Delta t} = \frac{\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} = \frac{\vec{\Delta v}}{\Delta t} = \frac{\vec{v_k} - \vec{v_{junction}}}{t_k}$. In generale $\vec{a_j} \neq \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} = \frac{\vec{\Delta a}}{\Delta t} = \frac{\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.

Esiste una funzionalità che permette di mantenere sempre il jerk a zero. Per informazioni, riferirsi alla guida Beziér Curve Acceleration

Uno dei problemi di questo sistema è che le accelerazioni e le decelerazioni richiedono tempo: un tempo relativamente piccolo che, moltiplicato per i milioni di movimenti richiesti per una stampa, può aumentare anche di molto i tempi di stampa.

Si è deciso quindi di evitare il più possibile tali fasi di accelerazione introducendo dei parametri modificabili dall'utente che qui chiameremo "max_jerk". In realtà tali valori si chiamano così perché incidono sul valore del jerk ma non possono essere considerati dei veri e propri jerk. Essi infatti dimensionalmente sono rappresentati da variazioni di velocità e sono quindi misurati in mm/s.

Riprendendo l'esempio di prima, avremo una variazione di velocità pari a $\vec{\Delta v} = \vec{v_k} - \vec{v_j}$:

  1. se almeno una tra le componenti XYZ di $\vec{\Delta v}$ supera il relativo "max_jerk" impostato, il firmware realizzerà il passaggio da $\vec{v_j}$ a $\vec{v_k}$ tramite accelerazioni. Stabilirà il valore incognito di $\vec{v_{junction}}$ in modo tale che le variazioni di velocità lungo i tre assi non superino quelle impostate tramite max_jerk. In realtà l'algoritmo è nei fatti un po' più complesso di così: deve infatti tener conto anche di altri fattori tra i quali eventuali cambi di direzione degli assi (un qualunque asse deve rallentare fino a fermarsi prima di poter invertire la direzione del proprio moto);
  2. altrimenti il passaggio da una velocità all'altra sarà istantaneo e non si perderà tempo per le accelerazioni/decelerazioni intermedie.

Il "max_jerk" è quindi la minima variazione di velocità che richiede un'accelerazione: se $\vec{v_j}$ e $\vec{v_k}$ fossero abbastanza simili tra loro, il passaggio dall'una all'altra sarebbe istantaneo. Questo trucchetto permette di ridurre leggermente i tempi di stampa ma va impostato correttamente: più i valori di "max_jerk" vengono aumentati, maggiori saranno gli spostamenti (statisticamente) che verranno gestiti con il cambio di velocità istantaneo (e maggiori saranno quindi le vibrazioni prodotte).

Riassumendo, i "max_jerk" devono essere impostati tenendo a mente che abbassando tali valori si riducono le vibrazioni e i rumori prodotti dai motori ma si allungano conseguentemente i tempi di stampa, e viceversa.

L'algoritmo Jerk Limiting ragiona su ciascun asse separatamente, senza perciò tener in considerazione l'effettiva traiettoria di movimenti pianificati.

i due fattori sono la deviation e la acceleration. La più semplice da immaginare è la seconda: trattasi della massima accelerazione centripeta che la meccanica può sostenere. Durante i cambi di direzione il nuovo algoritmo cerca di mantenere costante la velocità: l'accelerazione centripeta è allora uguale a $\dots\frac{(v^2)}{r}$, dove r è il raggio di curvatura. v e soprattutto r possono cambiare durante la stampa, andando ad incidere sul valore di acc. centr. . Newton ci disse che $F=ma$, perciò la forza che è necessario imprimere al carrello di stampa durante un cambio di direzione è proporzionale sia alla ma

test: $$ F_{centripeta} = m * a_{centripeta}$$