ELAI S.r.l.

Il robot conta bene i giri: perché sbaglia la posizione?

Odometria differenziale spiegata con archi esatti, errore di Eulero e un raggio ruota sbagliato: esperimento riproducibile, senza misure su robot reali.

Il robot conta bene i giri: perché sbaglia la posizione?

Contare il movimento non basta a conoscere dove siamo

Un robot mobile porta componenti lungo un corridoio industriale. Gli encoder, i dispositivi che contano la rotazione delle ruote, sembrano funzionare: nessun impulso manca. Il software però colloca il mezzo fuori dal percorso atteso. La domanda non è se aggiungere subito una rete neurale: prima dobbiamo capire come i giri diventino distanze, le distanze diventino rotazioni del telaio e queste rotazioni si accumulino nella mappa. L’articolo distingue due problemi che richiedono rimedi diversi: approssimare male un movimento corretto e integrare perfettamente un movimento stimato con parametri sbagliati.

Abstract. Deriviamo l’odometria di un robot a due ruote motrici nel piano, senza slittamento e con velocità delle ruote costanti entro ogni intervallo. Con carreggiata 0,5 m e spostamenti sinistro 1 m, destro 1,02 m, un intervallo produce orientamento 0,04 rad e posizione circa(1,009731;0,020197)m. Confrontiamo l’arco esatto con Eulero e ne misuriamo la convergenza numerica. Poi costruiamo un caso diverso: entrambe le ruote percorrono davvero 10 m, ma il raggio destro usato dal software è maggiore del 2%. La stima esatta finisce circa due metri lontana dalla posizione vera. È una simulazione deterministica, non un benchmark hardware o una prova di sicurezza.

Il modello: ruote, telaio e ipotesi

Chiamiamo b la distanza fra i due punti di rotolamento, non la metà della carreggiata. Il riferimento del telaio è al centro fra le ruote: asse x in avanti, asse y a sinistra, angolo positivo antiorario. Le distanze Δl e Δr sono positive quando le rispettive ruote avanzano. La posa globale è(x, y,φ), con metri per le coordinate e radianti per l’orientamento. Non modelliamo accelerazioni, deformazioni del pneumatico, pendenze o carichi. L’ipotesi di rotolamento senza slittamento è ciò che rende possibile ricavare il movimento del telaio dalla sola rotazione delle ruote.

La sezione 13.4 di Modern Robotics di Kevin Lynch e Frank Park descrive il passaggio dagli incrementi delle ruote al movimento del telaio e l’integrazione mediante esponenziale di matrice. Ne abbiamo letto la spiegazione tecnica. Qui svolgiamo un caso differenziale con formule scalari e dati nostri, mantenendo esplicita la convenzione su b: usare una formula scritta per semicarreggiata con una distanza completa introdurrebbe un errore di fattore due. Non eseguiamo il loro software né una stima su un robot EL-AI.

Dalla ruota all’arco

Se il raggio della ruota è r e l’encoder misura un incremento angolare Δθ, la distanza ricavata è rΔθ. Un impulso perfettamente contato non certifica il raggio effettivo. Nel modello differenziale la media delle due distanze dà lo spostamento del punto centrale lungo l’arco; la differenza delle distanze, divisa per b, dà la rotazione. Quando la ruota destra percorre di più, il mezzo gira verso sinistra, coerentemente con il segno positivo scelto. Questa relazione è geometrica e non richiede una funzione appresa dai dati.

Δl=r_lΔθ_l; Δr=r_rΔθ_r Δs=(Δl+Δr)/2; Δφ=(Δr−Δl)/b b=0.5m, Δl=1m, Δr=1.02m → Δs=1.01m, Δφ=0.04rad

Integrare la curva, non la sua tangente

Resta da trasformare lunghezza d’arco e rotazione in uno spostamento cartesiano. Se entrambe le ruote mantengono velocità costante nell’intervallo, il centro descrive un arco circolare di raggio R=Δs/Δφ, quando Δφ è diverso da zero. Nel riferimento iniziale del telaio, la componente in avanti vale RsinΔφ e quella laterale R(1−cosΔφ). Questa è la domanda risolta dalla formula seguente: dove finisce il punto centrale dopo aver girato mentre avanza? Non assumiamo che tutto l’avanzamento avvenga prima della rotazione.

u=Δs·sin(Δφ)/Δφ v=Δs·[1−cos(Δφ)]/Δφ x_next=x+cosφ·u−sinφ·v y_next=y+sinφ·u+cosφ·v φ_next=φ+Δφ

u e v sono metri nel riferimento iniziale del telaio. La matrice con cosφ e sinφ ruota quel vettore nel riferimento della mappa; soltanto dopo aggiungiamo x e y. La seconda rotazione è necessaria: avanzare di un metro quando il robot guarda a nord non equivale ad avanzare di un metro lungo l’asse x della mappa. L’orientamento aggiornato usa invece la somma degli angoli. Nell’esperimento conserviamo φ senza limitarlo a un intervallo: seno e coseno accettano anche angoli oltre un giro; un’applicazione può scegliere una convenzione di normalizzazione purché sia coerente.

Quando Δφ tende a zero, sinΔφ/Δφ tende a 1 e(1−cosΔφ)/Δφ tende a 0: ritroviamo il moto rettilineo u=Δs, v=0. Non significa dividere davvero per zero. Il programma usa quel limite sotto una soglia 10⁻¹²rad, sufficiente per i valori dell’esperimento. Per piccoli angoli una realizzazione numerica più robusta può usare funzioni sinc o sviluppi in serie, perché sottrarre due numeri quasi uguali in 1−cosΔφ perde precisione. Non abbiamo confrontato librerie o hardware: la derivazione esatta e la sua valutazione floating point sono piani distinti.

Nell’intervallo numerico precedente, partendo dall’origine con φ=0, otteniamo x=1,009730688 m, y=0,020197307 m, φ=0,04 rad. Un’approssimazione che mettesse tutto Δs lungo l’orientamento iniziale produrrebbe invece(1,01;0)m e aggiornerebbe poi l’angolo. È il passo di Eulero esplicito: usa la tangente iniziale per rappresentare una curva. Non è sbagliato come metodo numerico; è un’approssimazione il cui errore dipende dall’ampiezza del passo. Confondere le due posizioni significa nascondere circa due centimetri laterali in un solo intervallo del nostro caso costruito.

Un errore numerico che possiamo far diminuire

Manteniamo ora fisso un movimento complessivo Δl=10 m,Δr=10,2 m e dividiamolo in N intervalli uguali. Non stiamo aumentando la frequenza di un encoder fisico: suddividiamo dati sintetici con velocità costanti note. L’arco esatto termina in(9,832813143;1,993209901)m, orientamento 0,4 rad, indipendentemente dalla suddivisione entro le tolleranze numeriche. Eulero si avvicina alla stessa posizione quando N cresce. L’errore confrontato è la distanza euclidea fra le due posizioni finali in metri, non il solo errore laterale e non una probabilità di collisione.

NErrore Eulero (m)
12.011038172
100.200660483
1000.020065607
10000.002006560

Nella tabella un fattore dieci in più di intervalli riduce l’errore circa di dieci: è coerente con la convergenza globale di primo ordine di Eulero nel problema regolare considerato. La tabella non dimostra quel comportamento per ogni guida possibile. Se le ruote cambiano velocità dentro un intervallo, l’arco a velocità costante può essere anch’esso un’approssimazione: gli incrementi totali non descrivono sempre l’ordine temporale dei movimenti. Abbiamo fin qui eliminato soltanto l’errore del metodo sul moto dichiarato. Il prossimo caso lascia il metodo esatto e cambia la qualità dell’informazione in ingresso.

Un errore di calibrazione che l’integratore non può correggere

Nel secondo scenario il moto vero è rettilineo: entrambe le ruote hanno raggio reale 0,1 m e ciascun encoder misura complessivamente 100 rad, quindi ciascuna ruota percorre 10 m. Il software usa correttamente 0,1 m a sinistra ma 0,102 m a destra, un errore del 2% nel parametro. Converte così gli stessi giri in 10 e 10,2 m. Sono esattamente i dati del caso curvo precedente, ma ora la curva non è il moto vero: è ciò che l’odometria crede. Non cambiamo modello in silenzio: sono due scenari diversi che condividono la stessa sequenza numerica fornita all’integratore.

Integrando esattamente con 100 suddivisioni, la posizione stimata è(9,832813143;1,993209901)m, mentre quella vera è(10;0)m e l’orientamento vero resta zero. La distanza fra le due posizioni è 2,000209278 m. L’errore non scompare moltiplicando il numero degli intervalli: l’integratore sta calcolando correttamente le conseguenze di una differenza fra ruote che in realtà non esiste. La rotazione apparente 0,4 rad cambia continuamente la direzione dell’avanzamento stimato e accumula la componente laterale. È diverso da aggiungere semplicemente il 2% alla lunghezza del percorso.

Sinistra: scenario di calibrazione, retta vera e stima curva da raggio destro errato del2%; assi in metri con scala geometrica uguale. Destra: errore numerico di Eulero rispetto all’arco dichiarato corretto, su assi logaritmici. Sono due confronti distinti e sintetici: ridurre il secondo errore non elimina il primo.
Sinistra: scenario di calibrazione, retta vera e stima curva da raggio destro errato del 2%; assi in metri con scala geometrica uguale. Destra: errore numerico di Eulero rispetto all’arco dichiarato corretto, su assi logaritmici. Sono due confronti distinti e sintetici: ridurre il secondo errore non elimina il primo.

Che cosa gli encoder non osservano

Se una ruota gira sul posto slittando, gli impulsi possono essere identici a quelli di una ruota che avanza davvero. Gli encoder da soli non distinguono le due situazioni senza altre ipotesi. Anche b o il raggio effettivo possono variare con il contatto e la configurazione meccanica. Non abbiamo simulato questi fenomeni, quindi i due metri dell’esempio non sono una previsione di errore per ogni mezzo con ruote. Sono una dimostrazione del fatto che precisione del contatore, correttezza dei parametri e qualità della posizione sono proprietà diverse. Chiamare un encoder accurato non basta a chiamare accurata una localizzazione.

Una camera, un riferimento ambientale o un altro sensore può aggiungere informazione sul movimento effettivo. Questo non rende automaticamente infallibile la fusione: introduce calibrazioni, sincronizzazione, rumore e possibili errori condivisi. In questo articolo non eseguiamo un filtro di Kalman, una localizzazione visuale o un sistema SLAM, acronimo che indica localizzazione e costruzione simultanea della mappa. Non attribuiamo loro prestazioni ipotetiche. L’odometria resta un ingresso utile da confrontare con evidenze esterne, non una misura assoluta della posa indipendente dal modello.

Riproducibilità e passaggio a un sistema industriale

Il programma allegato implementa un aggiornamento di posa per intervallo, con lavoro e memoria costanti se non si conserva la traiettoria. Per disegnare il percorso salviamo tutti i punti, quindi la memoria diventa O(N). Non c’è casualità né seed; Python 3.14.0 e Matplotlib 3.11.2 sono registrati. Le asserzioni controllano il moto rettilineo, l’equivalenza degli archi sotto suddivisione e i confronti numerici. Il frammento mostrato ricalcola le pose con 1,10,100 intervalli: permette di vedere direttamente il metodo esatto invariato e quello approssimato che converge, senza usare screenshot come fonte dei risultati.

Una prova su un mezzo reale dovrebbe separare la calibrazione dei parametri dalla verifica su percorsi non usati per calibrarli, registrando terreno, carico, velocità, raggi, carreggiata, encoder e riferimento esterno con le rispettive incertezze. È un protocollo proposto, non una prova eseguita. Nessun risultato della simulazione dimostra sicurezza, conformità o idoneità a operare vicino a persone. Per EL-AI la robotica industriale e collaborativa è una direzione da esplorare, come indicato dall’utente: il testo non documenta un prodotto mobile già sviluppato, un cliente o un’installazione.

Il robot può dunque contare bene i giri e sbagliare la posizione perché il conteggio è solo il primo anello. L’arco esatto risolve un problema di integrazione sotto ipotesi precise; non corregge parametri errati o movimento non osservabile dagli encoder. Abbiamo visto entrambi gli effetti con lo stesso insieme di numeri, ma con verità fisiche dichiarate diverse. Prima di chiedere all’AI di compensare una deriva, questo percorso consente di formulare la domanda corretta: quale parte dell’errore viene dall’approssimazione e quale dall’informazione che il sistema non possiede?

Kevin M. Lynch, Frank C. Park. Modern Robotics, section 13.4 Odometry. Technical transcript read 17 October 2026; independent scalar simulation, no robot measurements..

from experiment import integrate
for n in [1,10,100]:
    print(n,integrate(n,exact=True)[0],integrate(n,exact=False)[0])

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 17 ottobre 2026.