Il problema si nasconde tra due controlli riusciti
Un robot deve spostare un utensile da un lato all’altro di una dima. Il programma verifica una sequenza di pose e non trova collisioni. Durante il movimento, però, l’utensile attraversa lo spazio occupato da un perno. Non c’è contraddizione: abbiamo controllato punti isolati, mentre il robot percorre anche tutto ciò che li separa. La domanda pratica è precisa: quando i controlli discreti permettono davvero di concludere che il percorso intermedio è libero?
Abstract. Riduciamo il problema a un utensile circolare che si muove in un piano vicino a un ostacolo circolare. Calcoliamo una collisione che sei controlli non rilevano, deriviamo la distanza minima continua e costruiamo una condizione sufficiente basata sul margine e sul passo di campionamento. Distinguiamo tre esiti: collisione osservata, percorso geometricamente certificato nel modello e risultato inconcludente. Il modello è didattico: non rappresenta l’intero braccio, l’incertezza dei sensori o il comportamento di un robot reale. Serve a capire quale informazione manca quando un controllore dichiara soltanto “tutte le pose provate sono valide”.
Dal volume dell’utensile alla distanza del suo centro
Tutte le coordinate sono in metri. Il centro dell’utensile va da a = (0, 0) a b = (1, 0) lungo una retta; il perno ha centro c = (0,5; 0). Il raggio dell’utensile è 0,02 m e quello dell’ostacolo 0,04 m. Due dischi si toccano o si sovrappongono quando la distanza tra i centri è minore o uguale alla somma dei raggi, R = 0,06 m. Possiamo quindi sostituire l’utensile con un punto e allargare l’ostacolo di 0,02 m. È una trasformazione esatta per questi due dischi, non per qualsiasi geometria robotica.
Definiamo la clearance g(p) = ||p − c|| − R. La norma ||·|| è la distanza euclidea: in due dimensioni si calcola con il teorema di Pitagora. g positiva significa separazione, zero contatto, negativa sovrapposizione. Adottiamo una regola conservativa nel modello: anche il contatto è considerato collisione. La clearance ha unità di lunghezza e non è una probabilità. Non descrive forza d’urto, velocità o conseguenze del contatto.
Sei pose libere, una collisione certa nel modello
Dividiamo il metro di percorso in cinque segmenti uguali. I sei controlli sono a x = 0; 0,2; 0,4; 0,6; 0,8; 1. Le posizioni più vicine al centro dell’ostacolo sono 0,4 e 0,6: distano 0,1 m, quindi hanno clearance 0,04 m. Tutti i controlli passano. Ma il centro del percorso, x = 0,5, coincide con il centro dell’ostacolo: la clearance è −0,06 m. L’intervallo di collisione lungo l’asse è [0,44; 0,56], interamente compreso tra due campioni.
Un dettaglio sorprendente aiuta a interpretare i test: dividendo in quattro segmenti avremmo controllato anche x = 0,5 e trovato la collisione. Passare da cinque a sei controlli, cambiandone la griglia, può quindi perdere un evento prima rilevato. Non significa che una risoluzione più fine sia inutile: significa che due griglie non annidate non hanno una relazione monotona tra gli esiti. Un raffinamento che conserva i vecchi campioni e ne aggiunge altri conserva invece ogni collisione già osservata.
Calcolare il punto più vicino lungo tutto il segmento
Per questo problema non siamo obbligati a campionare. Scriviamo ogni punto del segmento come p(u) = a + u d, dove d = b − a e u varia da zero a uno. u è senza unità: indica quale frazione del percorso abbiamo compiuto. Per trovare il punto più vicino a c minimizziamo il quadrato della distanza, ||a + ud − c||². Usare il quadrato evita la radice senza cambiare il punto minimo. Derivando rispetto a u otteniamo 2d·(a + ud − c); porlo uguale a zero dà la proiezione sulla retta.
Il prodotto scalare d·d è la lunghezza del segmento al quadrato. La limitazione di u₀ all’intervallo [0,1] è essenziale: se la proiezione cade oltre un estremo, il punto più vicino del segmento è quell’estremo. Quando a = b il denominatore è zero; in quel caso controlliamo direttamente il singolo punto. Nell’esempio centrale u* = 0,5 e g_min = −0,06 m. L’algoritmo esegue un numero costante di operazioni per una coppia segmento-ostacolo; con M ostacoli controllati direttamente il costo cresce come O(M).
Quando il margine rende sufficienti i campioni
Il calcolo esatto è comodo per un segmento e un disco, ma non sempre è disponibile per geometrie complesse. Possiamo allora chiedere ai campioni qualcosa di più di un semplice sì/no: quanto spazio libero hanno intorno? La distanza da un ostacolo non può diminuire più dello spostamento del punto. Se ci muoviamo di un centimetro, la distanza può diminuire al massimo di un centimetro. Questa proprietà segue dalla disuguaglianza triangolare e viene chiamata continuità Lipschitz con costante uno.
p e q sono due posizioni, misurate nello stesso riferimento e con le stesse unità. La sottrazione del raggio R non altera la disuguaglianza perché R è costante. Se il massimo intervallo tra campioni lungo il segmento è Δs, ogni punto del percorso è distante al massimo Δs/2 da uno dei due campioni vicini. Chiamiamo m il più piccolo margine misurato nei campioni. In qualunque punto non controllato il margine non può essere minore di m − Δs/2. Questo è il ponte tra informazione discreta e conclusione continua.
La seconda riga è una condizione sufficiente, non necessaria. Se passa, abbiamo una dimostrazione geometrica entro le ipotesi. Se non passa, non abbiamo dimostrato una collisione: abbiamo soltanto esaurito ciò che quei campioni permettono di affermare. Un software che restituisce soltanto vero/falso rischia di nascondere questa differenza. Per il nostro controllo distinguiamo una collisione osservata, un limite inferiore strettamente positivo e un intervallo ancora inconcludente. Quest’ultimo può essere suddiviso e riesaminato, conservando i punti già controllati.
Un percorso libero può richiedere più lavoro per essere dimostrato
Spostiamo il segmento alla quota y = 0,08 m. Ora la distanza minima del centro è 0,08 m e la clearance continua è 0,02 m. Con cinque segmenti, i campioni più vicini sono ancora a x = 0,4 e 0,6: misurano circa 0,06806 m di clearance. Sembra un margine ampio, ma Δs/2 = 0,1 m, quindi il limite inferiore è circa −0,03194 m. Il controllo esatto sa che il percorso è libero; il certificato ricavato da quella griglia non può ancora provarlo.
Con ventisei segmenti di lunghezza 1/26 m controlliamo anche il centro. Il margine minimo campionato è 0,02 m e metà passo è circa 0,01923 m. Il limite inferiore diventa 0,000769 m, positivo: il certificato passa. Non abbiamo scoperto che il percorso è diventato più libero; abbiamo raccolto informazione sufficiente a dimostrare una proprietà che già aveva. Questa distinzione evita di interpretare il costo del controllo come una misura del rischio fisico.
| Quota y (m) | Segmenti | Minimo campionato (m) | Minimo esatto (m) | Limite inferiore (m) |
|---|---|---|---|---|
| 0 | 4 | −0.060000 | −0.060000 | −0.185000 |
| 0 | 5 | 0.040000 | −0.060000 | −0.060000 |
| 0.08 | 5 | 0.068062 | 0.020000 | −0.031938 |
| 0.08 | 26 | 0.020000 | 0.020000 | 0.000769 |

Dal disegno al robot: quali ipotesi non possiamo saltare
Il nostro punto rappresenta un utensile in traslazione rettilinea. In un manipolatore articolato, interpolare gli angoli dei giunti non produce in generale una retta del centro utensile. Inoltre può urtare un altro collegamento del braccio mentre l’utensile passa libero. Per trasferire il ragionamento bisogna controllare la geometria di tutti i corpi e la vera interpolazione del pianificatore. Un limite Lipschitz nello spazio dei giunti richiede di collegare variazioni angolari a spostamenti dei punti fisici: non possiamo riutilizzare automaticamente la costante uno, né sottrarre radianti a metri.
Anche la geometria è una stima. Se il modello libero ha clearance 0,02 m e disponiamo di un limite verificato di 0,005 m sull’errore relativo di posizione, possiamo riservare quel margine e ottenere 0,015 m nel modello robusto. Il numero 0,005 qui è soltanto un’ipotesi: senza un limite giustificato non è una garanzia. Errori di forma, flessione, ritardi e ostacoli mobili richiedono ulteriori termini o un modello diverso. Una simulazione geometrica non dimostra la sicurezza di una cella collaborativa e non sostituisce prove o requisiti applicabili all’impianto reale.
Un’interfaccia utile deve saper dire “non ancora dimostrato”
OMPL distingue il controllo di validità di uno stato dal controllo del movimento tra stati. La sua documentazione segnala che una discretizzazione troppo grossolana può saltare stati non validi, mentre una troppo fine aumenta il lavoro; quando è disponibile un controllo continuo propone un validatore di movimento adatto. È esattamente la distinzione concettuale illustrata qui. Non abbiamo eseguito OMPL né confrontato pianificatori: il codice allegato isola soltanto la geometria e verifica formule, campionamenti e casi limite.
La risposta iniziale è sì: un robot può attraversare un ostacolo tra pose tutte valide. Per escluderlo nel modello occorre controllare l’intero movimento oppure collegare il passo dei campioni a un limite giustificato sulla variazione della clearance. Quando quel limite non basta, la risposta corretta è “inconcludente”, non “libero”. La lezione non è controllare sempre più punti indiscriminatamente, ma sapere quale proprietà ogni controllo sta dimostrando e sotto quali ipotesi. È una distinzione utile per l’interesse futuro di EL-AI nella robotica industriale e collaborativa, senza implicare che questi calcoli siano stati validati su suoi robot.
Il frammento riproduce i margini campionati e il criterio sufficiente. L’archivio completo include la proiezione esatta, segmento nullo, proiezione fuori dagli estremi, contatto tangente, 39 combinazioni di quota e griglia, e le curve della figura. Tutto è deterministico: nessun seed, dato di cliente o misura hardware. La tolleranza numerica 10^−12 m evita che un arrotondamento trasformi il contatto in una distanza positiva; non è un margine fisico per un robot.
import math
obstacle = (0.5, 0.0)
radius = 0.06
def clearance(x, y):
return math.dist((x,y), obstacle)-radius
for n in (4,5,26):
for y in (0.0,0.08):
smallest = min(clearance(i/n,y) for i in range(n+1))
lower_bound = smallest-1/(2*n)
print(n, y, round(smallest,6), lower_bound>1e-12)
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 30 settembre 2026.

