Una presa mancata, anche se il numero sul motore è corretto
Una pinza deve tornare sopra un piccolo alloggiamento. L’operatore insegna una posizione, il robot la ripete più volte e sembra preciso. Poi cambia il percorso di avvicinamento: arriva dall’altro lato e la pinza si ferma leggermente spostata. Il numero letto sul motore è lo stesso. È necessariamente un errore della camera, della rete neurale o del programma di traiettoria? No: fra il punto in cui misuriamo il movimento e il punto che vogliamo posizionare può esserci una trasmissione con gioco. La sua risposta dipende anche da come siamo arrivati fin lì.
La domanda centrale è questa: quando la posizione del motore non basta per conoscere quella della pinza, quale informazione manca? Costruiremo un modello minimo di gioco, calcoleremo quanto un piccolo angolo diventa uno spostamento alla punta e mostreremo perché un correttore che ignora il passato incontra un limite inevitabile. L’esempio è una simulazione deterministica, con dimensioni scelte a scopo didattico: non misura un robot commerciale, non valuta la sicurezza di una cella e non dimostra prestazioni di un sistema EL-AI. Il suo valore è rendere visibile una causa di errore spesso nascosta da una misura apparentemente esatta.
Dove si trova il sensore cambia il significato della misura
Un encoder è un sensore che misura una posizione angolare. Se è montato sul motore, osserva il lato di ingresso della trasmissione; non osserva automaticamente il giunto mosso dalla trasmissione. Indichiamo con u l’angolo del motore già riportato al lato del giunto tramite il rapporto di riduzione nominale e con q l’angolo effettivo del giunto. Così possiamo confrontarli nelle stesse unità, senza mescolare giri del motore e gradi dell’uscita. Nel caso ideale rigido e senza gioco avremmo q = u. Nell’esempio che studiamo questa uguaglianza non è sempre vera.
Immaginiamo due superfici che trasmettono movimento quando si toccano, ma hanno un piccolo spazio libero fra loro. Muovendoci in una direzione, una superficie trascina l’altra. Invertendo, il lato motore attraversa prima lo spazio libero: l’uscita può restare ferma finché avviene il contatto opposto. Questa immagine introduce il meccanismo, non descrive ogni riduttore reale. Esistono anche deformazioni elastiche, attrito e dipendenza dal carico. Li escludiamo per isolare una sola domanda: quale memoria serve anche nel più semplice modello cinematico di gioco?
Una regola con memoria, non una semplice correzione fissa
Scegliamo un semigioco r = 0,1 gradi, quindi una larghezza totale 2r = 0,2 gradi. Quando il valore di ingresso è u, l’uscita ammissibile si trova fra u − r e u + r. Il modello mantiene l’uscita precedente se è ancora in questo intervallo. Se invece l’ingresso si allontana abbastanza, l’uscita viene trascinata sul bordo più vicino. La formula seguente risolve la domanda «dove va il giunto dopo il prossimo movimento?». È una proiezione del valore precedente sull’intervallo attuale: si cambia soltanto quanto occorre per rispettare il vincolo.
L’indice k conta i campioni della sequenza; non rappresenta secondi. u, q e r sono qui in gradi. min sceglie il più piccolo fra due numeri e max il più grande: insieme mantengono q entro i bordi. La presenza di q[k−1] è il dettaglio decisivo, perché conserva lo stato precedente. L’algoritmo richiede un solo valore di memoria e un numero costante di operazioni per campione, quindi O(n) operazioni per una sequenza di n ingressi. Il programma eseguito usa numeri in virgola mobile e verifica che la distanza angolare resti entro r, con una tolleranza numerica di 10⁻¹² gradi.
Questa è una descrizione quasi statica: assegna posizioni successive senza calcolare accelerazioni, coppie o urti fra superfici. Non stiamo integrando un’equazione dinamica né adottando un periodo di campionamento fisico. La documentazione ufficiale del blocco Backlash di Simulink descrive il comportamento con tre modi: disaccoppiato e accoppiato nelle due direzioni. La usiamo come riferimento per il significato del gioco; i calcoli e la sequenza qui presentati sono un esempio autonomo in Python, non risultati ottenuti eseguendo Simulink.
Seguire un’inversione, un passo alla volta
Partiamo da u = 1 grado e q = 0,9 gradi: il contatto è sul ramo crescente. Riduciamo u a 0,95. Il nuovo intervallo va da 0,85 a 1,05 e contiene ancora q = 0,9: l’uscita resta ferma. Lo stesso accade scendendo a 0,90, 0,85 e 0,80. Solo a u = 0,75 il bordo superiore diventa 0,85 e trascina q a 0,85. Non è un ritardo impostato in millisecondi. È movimento di ingresso necessario per attraversare il gioco; se il motore si ferma prima, anche l’attesa più lunga non completa da sola quel movimento nel modello.
| u (gradi) | q (gradi) |
|---|---|
| 1.00 | 0.90 |
| 0.95 | 0.90 |
| 0.90 | 0.90 |
| 0.85 | 0.90 |
| 0.80 | 0.90 |
| 0.75 | 0.85 |
| 0.70 | 0.80 |
La figura rende visibili due letture dello stesso fenomeno. A sinistra l’ingresso percorre da −1 a +1 grado e torna indietro, con incrementi di 0,01 gradi. I due rami non coincidono: questo ciclo è una forma di isteresi, cioè dipendenza dalla storia. A destra si ingrandisce la breve inversione della tabella. Guardiamo il tratto piatto dell’uscita mentre l’ingresso diminuisce. Non leggiamo la pendenza come velocità, perché l’asse orizzontale è un indice senza tempo assegnato. I grafici mostrano le posizioni del modello, non vibrazioni o misure di encoder reali.

La stessa lettura può nascondere due posizioni
Arriviamo ora a u = 0 da valori sufficientemente negativi: q vale −0,1 gradi. Arriviamo allo stesso u da valori sufficientemente positivi: q vale +0,1 gradi. La separazione è 0,2 gradi pur leggendo lo stesso numero all’ingresso. Il sensore del motore può essere perfettamente coerente e il giunto trovarsi comunque in due stati diversi. Una prova ripetuta sempre dalla stessa direzione può quindi apparire eccellente e non rivelare l’errore quando cambia l’avvicinamento. Non è una contraddizione: ripetere un percorso e raggiungere una posizione indipendentemente dal percorso sono domande sperimentali diverse.
Da un decimo di grado ai millimetri della pinza
Per capire se 0,2 gradi siano pochi o molti, colleghiamo al giunto un segmento rigido lungo L = 0,5 metri. La punta si muove su una circonferenza e la sua posizione nel piano è p(q) = [L cos(q), L sin(q)]. Qui le funzioni trigonometriche richiedono q in radianti: un angolo in gradi si moltiplica per π/180. Confrontiamo le due posizioni q = −r e q = +r. Hanno la stessa coordinata orizzontale, mentre le coordinate verticali sono opposte. La loro distanza risulta quindi due volte L sin(r), senza bisogno di un’approssimazione.
La prima distanza separa due arrivi con storia diversa, mentre la seconda misura l’errore di ciascuno rispetto alla punta ideale p(0). Non vanno confuse: dire che l’errore è 1,745 millimetri senza specificare il confronto raddoppierebbe quasi l’errore rispetto al nominale. Per piccoli angoli, sin(r) è vicino a r e il primo valore è circa 2Lr, ma il programma conserva la formula trigonometrica. Il risultato non è una tolleranza dichiarata per un robot: è la conseguenza geometrica dei nostri 0,5 metri e 0,1 gradi ipotetici.
Variando soltanto il semigioco a 0,05, 0,10 e 0,20 gradi, la separazione calcolata fra i due arrivi è rispettivamente circa 0,873, 1,745 e 3,491 millimetri. Questo controllo di sensibilità mostra quale parametro guida il risultato nell’esempio. Un utensile più lungo amplifica lo stesso errore angolare, perché L compare come fattore moltiplicativo. In un manipolatore con più giunti entrano invece geometria e postura: non possiamo moltiplicare semplicemente questo numero per il numero di assi. Servirebbe propagare gli errori attraverso la cinematica completa, conservando le loro direzioni e dipendenze.
Perché più dati non bastano a un modello senza memoria
Supponiamo di addestrare un predittore che riceve soltanto u e deve restituire q. Nel nostro insieme didattico, a u = 0 associamo con uguale frequenza q = −r e q = +r. Quale unico numero dovrebbe imparare? Se minimizza l’errore quadratico medio, la scelta ottima è la media, cioè zero. Possiamo dimostrarlo senza addestrare alcuna rete. Chiamiamo a la previsione in quel punto: la media dei due errori al quadrato è la formula seguente. L’esempio isola un’ambiguità dell’ingresso, non un difetto dell’ottimizzatore o una scarsità di parametri.
I termini misti +2ar e −2ar si cancellano. Rimangono a² e r²: il primo si annulla scegliendo a = 0, il secondo resta. RMSE è la radice dell’errore quadratico medio e torna quindi a misurarsi in gradi. Aggiungere esempi identici permette di stimare meglio la media ma non rivela quale delle due storie abbia prodotto la prossima osservazione. Anche con dati senza rumore rimane un errore condizionale di 0,1 gradi. È un limite sotto l’ipotesi di due rami equiprobabili e ingresso soltanto u, non un limite universale delle reti neurali o della robotica.
Se il dataset contiene soltanto arrivi dal lato crescente, una correzione costante q = u − r risulta perfetta per quel ramo. Applicarla al ramo opposto produce un errore angolare di 2r. Qui è facile ottenere un test ingannevole: dividere casualmente ripetizioni dello stesso avvicinamento fra addestramento e verifica non introduce la storia mancante. Per valutare una correzione occorre includere sequenze con inversioni complete e parziali, specificare l’inizializzazione e verificare percorsi diversi. Questa è una proposta di protocollo, non il resoconto di un addestramento che abbiamo effettuato: in questo articolo abbiamo eseguito soltanto il simulatore e i calcoli.
Nemmeno l’ultima direzione identifica sempre lo stato
Potremmo aggiungere un segno: il motore sta aumentando o diminuendo? Aiuta sui rami pienamente accoppiati, ma non risolve ogni inversione parziale. Eseguiamo due storie, entrambe inizializzate con q = 0. La prima ha ingressi [0, 1, 0,85, 0,90] e termina con q = 0,90. La seconda ha [0, −1, −0,50, 0,90] e termina con q = 0,80. In entrambi i casi l’ultimo ingresso è 0,90 e l’ultimo movimento è crescente. Le uscite sono diverse perché il primo percorso conserva il valore raggiunto prima della breve inversione, mentre il secondo raggiunge il bordo del ramo crescente.
Nel modello noto basta propagare lo stato q precedente: non serve una rete grande per risolvere un problema già descritto da una regola esatta. Quando invece il comportamento reale è sconosciuto, un modello con stato o una sequenza di osservazioni può essere un’ipotesi utile da verificare. Non basta chiamarlo «ricorrente» per garantire identificazione o stabilità. Se la storia iniziale è sconosciuta, anche il nostro simulatore deve partire da un’incertezza sull’uscita o da una procedura che renda noto lo stato. La memoria non crea informazione che non è mai stata osservata o inizializzata.
Compensare è possibile, ma soltanto entro le ipotesi
Sul ramo crescente vale q = u − r; per ottenere un bersaglio q* basta quindi scegliere u = q* + r. Sul ramo decrescente vale invece q = u + r e scegliamo u = q* − r. Per q* = 0,5 gradi il programma verifica due comandi: 0,6 arrivando dal basso e 0,4 arrivando dall’alto. Entrambi producono q = 0,5 nel modello, dopo avvicinamenti che stabiliscono il contatto corretto. Il risultato non significa che basti aggiungere alternativamente un decimo di grado a qualsiasi comando: fuori dai rami accoppiati bisogna conoscere lo stato e attraversare il gioco.
Una compensazione inversa può chiedere un salto di ingresso quando cambia ramo. Il nostro calcolo quasi statico non pone limiti a velocità, accelerazione, corrente o urti: un comando matematicamente valido non diventa per questo una traiettoria fisicamente ammissibile. Prima di trasferirlo a un sistema reale occorre integrarvi vincoli e dinamica della trasmissione. Anche il valore r può cambiare con carico, usura o condizioni operative. Un valore stimato male lascia un residuo; un modello che descrive solo gioco non corregge automaticamente elasticità, attrito o errori geometrici.
Confrontare soluzioni che osservano cose diverse
Un avvicinamento sempre dalla stessa direzione riduce l’ambiguità del ramo nel modello, ma modifica il percorso e può aumentare il tempo di ciclo o essere incompatibile con gli ostacoli. Un encoder all’uscita osserva più direttamente q e distingue i due stati che l’encoder del motore confonde, ma introduce costi, montaggio e un problema di controllo da valutare. Una misura esterna della punta osserva il risultato complessivo, includendo altri errori geometrici, ma ha propri rumore, occlusioni e ritardo. Nessuna di queste scelte annulla per definizione tutti gli errori: cambia quale informazione diventa disponibile.
Per una futura sperimentazione proporremmo misure sincronizzate di ingresso e uscita, andate e ritorni su più ampiezze, inversioni parziali e ripetizioni con carichi dichiarati. Il primo confronto sarebbe fra modello senza memoria, modello di gioco con stato e residui non spiegati. Un’eventuale componente appresa andrebbe valutata su sequenze diverse da quelle usate per stimarla, senza spezzare una stessa sequenza nascondendo l’inizializzazione. Questo protocollo non è stato eseguito su hardware. La robotica industriale e collaborativa è una direzione che EL-AI intende esplorare; l’analisi non attesta riduttori, robot, installazioni o risultati sperimentali già realizzati dall’azienda.
Riprodurre il ragionamento, senza confonderlo con una prova fisica
L’archivio allegato include il simulatore, i risultati e il programma delle figure. La funzione play legge gli ingressi nell’ordine dato e aggiorna q con la proiezione descritta; cambiarne l’ordine cambia il problema. run costruisce il ciclo, l’inversione, i due arrivi allo stesso ingresso, il controesempio sull’ultima direzione e i due comandi compensati. Le asserzioni controllano vincoli ed esiti, mentre il frammento seguente stampa i risultati centrali. Non c’è un seme casuale perché non c’è campionamento casuale. Sono salvate le versioni usate: Python 3.14.0 e Matplotlib 3.11.2.
La risposta alla presa mancata
La pinza può non tornare nello stesso punto perché una lettura a monte della trasmissione non identifica sempre lo stato a valle. Il gioco conserva parte della storia del movimento. Nel nostro esempio due arrivi con identico u = 0 separano le punte di circa 1,745 millimetri; una previsione che vede soltanto u non può distinguere i rami. La soluzione concettuale è rendere osservabile o ricostruibile quello stato, poi valutare una correzione compatibile con la dinamica reale. Prima di chiedere a un modello AI di essere più preciso, conviene quindi verificare se i suoi ingressi contengono l’informazione necessaria per esserlo.
Riferimento tecnico e materiali
MathWorks — Backlash: Model behavior of system with play (documentation R2026b).
from experiment import run, play
r = run()
print(r['same_input'])
print(r['same_last_direction'])
print(r['branch_compensation'])
print(r['balanced_memoryless_rmse_deg'])
Codice, dati e istruzioni · JSON. Calcoli didattici eseguiti con Python 3.14.0; figure con Matplotlib 3.11.2. Analisi con assistenza AI, senza dichiarare peer review o revisione umana. Copertina originale ImageGen, illustrativa: non documenta persone, sedi o installazioni EL-AI. Fonti consultate il 9 ottobre 2026.

