ELAI S.r.l.

La pinza segue punti vicini: perché il software chiede al gomito un salto?

Due soluzioni della cinematica inversa possono raggiungere lo stesso punto. Un esempio eseguito mostra perché scegliere ogni posa da sola può rompere la continuità.

La pinza segue punti vicini: perché il software chiede al gomito un salto?

Un percorso piccolo, un comando grande

Un software prepara una sequenza di punti per la pinza di un robot: ogni punto dista pochi millimetri dal precedente. Il calcolo conferma che ciascuno è raggiungibile. Eppure a metà della sequenza compare una richiesta di rotazione molto grande al gomito. Non è necessario che il bersaglio abbia fatto un salto o che il motore sia guasto. Può essere cambiata la soluzione scelta dal software. In questo articolo capiremo perché la posizione finale del dispositivo non identifica sempre una sola postura del braccio, e come mantenere una scelta coerente lungo il percorso.

Abstract. Analizziamo un braccio planare ideale con due giunti rotativi e segmenti lunghi 0,5 e 0,4 metri. Deriviamo le due soluzioni per raggiungere un punto, poi confrontiamo due regole di scelta su un arco di raggio 0,6 metri: minimizzare l’angolo assoluto della spalla a ogni punto, oppure scegliere la configurazione più vicina alla precedente. Nel calcolo eseguito, uno spostamento del bersaglio di circa 6 millimetri produce con la prima regola una variazione di circa 82,25° alla spalla e 194,36° al gomito; la seconda conserva il ramo e cambia soltanto la spalla di circa 0,573°. Sono differenze fra configurazioni richieste, non velocità misurate o movimenti istantanei di un robot reale.

Posizione e configurazione sono informazioni diverse

Fissiamo un piano con assi x e y e la spalla nell’origine. L₁ è la lunghezza del primo segmento, L₂ quella del secondo, entrambe in metri. q₁ è l’angolo del primo segmento rispetto all’asse x; q₂ è l’angolo relativo del secondo rispetto al primo. Gli angoli positivi sono antiorari e i calcoli usano radianti: 180° corrispondono a π radianti. La configurazione q = (q₁,q₂) descrive i due giunti. Il punto p = (x,y) descrive soltanto la posizione della punta. Non imponiamo l’orientamento della pinza: aggiungerlo cambierebbe il problema e potrebbe eliminare alcune soluzioni.

La cinematica diretta risponde a “dove arriva la punta se conosco gli angoli?”. Sommiamo le proiezioni dei due segmenti lungo x e y. Per il secondo usiamo q₁ + q₂, perché il suo orientamento nel piano comprende entrambe le rotazioni. Questa formula offre anche il controllo finale del calcolo inverso: qualunque configurazione ottenuta deve restituire il punto richiesto quando la sostituiamo qui. Non basta che un algoritmo dichiari di avere trovato una soluzione; possiamo verificarla geometricamente.

x = L₁ cos(q₁) + L₂ cos(q₁ + q₂) y = L₁ sin(q₁) + L₂ sin(q₁ + q₂)

Derivare i due rami senza nasconderli nel software

La cinematica inversa fa la domanda opposta: quali angoli raggiungono un punto dato? Prima cerchiamo q₂ usando la distanza r dalla spalla. Ruotare tutto il braccio attraverso q₁ non cambia r: cambia soltanto la direzione. Elevando al quadrato x e y e sommando, i termini misti diventano 2L₁L₂ cos(q₂), mentre cos² + sin² = 1 elimina gli altri angoli. Otteniamo una relazione con una sola incognita. La quantità C è adimensionale: dividiamo metri quadrati per metri quadrati.

r² = x² + y² = L₁² + L₂² + 2L₁L₂ cos(q₂) C = (r² − L₁² − L₂²)/(2L₁L₂) q₂⁺ = arccos(C); q₂⁻ = −arccos(C)

Se C è strettamente fra −1 e 1, il coseno ammette due angoli opposti, dunque due rami. Fuori da quell’intervallo non esiste soluzione reale. Ai bordi i rami coincidono geometricamente, con attenzione alle rappresentazioni equivalenti di ±π. Per le lunghezze scelte, il raggio raggiungibile va da |0,5−0,4| = 0,1 metri a 0,5+0,4 = 0,9 metri. Il nostro arco a 0,6 metri è interno a questa corona. Le due soluzioni non sono causate da rumore o approssimazione: appartengono già alla geometria ideale.

Resta da scegliere q₁ per ciascun ramo. Indichiamo con φ la direzione del punto, calcolata con atan2(y,x). A differenza di una semplice arctangente del rapporto y/x, atan2 considera i segni di entrambe le coordinate e distingue i quadranti. Quando q₁ = 0, il vettore che arriva alla punta ha componenti L₁ + L₂ cos(q₂) e L₂ sin(q₂). Il suo angolo β è un’altra atan2. Per allinearlo alla direzione richiesta, ruotiamo il primo giunto di φ − β. Ogni q₂ porta quindi con sé un diverso q₁.

φ = atan2(y, x) β(q₂) = atan2[L₂ sin(q₂), L₁ + L₂ cos(q₂)] q₁ = φ − β(q₂)

Nel punto x = 0,6 metri e y = 0, C vale −0,125. Il programma trova q₂ = ±97,18076°. Le corrispondenti spalle sono ∓41,40962°. Sostituendo entrambe le configurazioni nella cinematica diretta ritorniamo a (0,6;0) entro la tolleranza numerica controllata. Sono configurazioni diverse dello stesso modello, con lo stesso punto finale. I due disegni nel grafico aiutano a vederlo: la punta coincide, ma il gomito si trova su lati diversi dell’asse x. Non chiamiamo una postura migliore senza avere ancora definito il criterio.

Ramoq1 (°)q2 (°)x (m)y (m)
+-41.4096297.180760.60
−41.40962-97.180760.60

Una regola ragionevole per una posa può fallire su una sequenza

Costruiamo 31 punti su un piccolo arco: φ va da −0,15 a +0,15 radianti, con passo 0,01. Ogni punto è (0,6 cosφ, 0,6 sinφ). La distanza fra vicini è 2 × 0,6 sin(0,01/2), circa 0,005999975 metri. Non assegniamo istanti temporali: è un percorso geometrico campionato, non una traiettoria con velocità. Impostiamo limiti sintetici: spalla fra −170° e +170°, gomito fra −150° e +150°. Entrambi i rami rispettano questi limiti in tutti i 31 punti; il codice lo verifica, insieme alla posizione ricostruita.

La prima regola sceglie a ogni punto il q₁ con valore assoluto minore. Potrebbe rappresentare il desiderio di tenere la spalla vicina allo zero. Non usa la configurazione precedente. Per φ negativo preferisce il ramo con q₂ negativo; per φ positivo preferisce quello con q₂ positivo. All’origine delle direzioni i due costi pareggiano, e il nostro codice sceglie il primo candidato. Vicino a quel pareggio il minimo cambia ramo: il costo scelto resta basso, mentre la configurazione scelta cambia molto. Questo è un salto della soluzione selezionata, non un salto del punto desiderato.

Nel passaggio dal punto 14 al 15, contando da zero, la spalla richiesta cambia di 82,24629° e il gomito di 194,36151°. La punta richiesta si sposta di circa 6 mm. Il software non ha ordinato un movimento matematicamente istantaneo: ha prodotto due riferimenti successivi molto distanti. Un controllore reale potrebbe rallentare, rifiutare la richiesta o interpolare, con conseguenze da valutare. Il nostro risultato è più circoscritto e verificabile: la continuità del percorso cartesiano non basta a garantire la continuità delle configurazioni restituite da una scelta indipendente.

Potremmo risolvere il problema semplicemente infittendo i punti? Verifichiamolo invece di supporlo. Consideriamo due bersagli con direzioni −ε e +ε. Con ε = 0,005 radianti sono separati da circa 6 mm; riducendo ε a 0,0005, la separazione scende a circa 0,6 mm. Eppure la regola indipendente continua a scegliere rami opposti: il gomito cambia ancora di 194,36°. La differenza alla spalla si avvicina a 82,82° anziché tendere a zero. Il calcolo di sensibilità aggiunto al pacchetto conferma questi numeri: il difetto della scelta non scompare riducendo il passo geometrico.

La ragione si può leggere nelle formule, senza affidarsi soltanto al grafico. Poniamo γ = arccos(C) e β₀ = β(γ), entrambi positivi nell’esempio. Il ramo scelto prima dello zero ha q₂ = −γ e q₁ = −ε + β₀; dopo lo zero ha q₂ = +γ e q₁ = +ε − β₀. La differenza in valore assoluto vale 2γ al gomito e 2β₀ − 2ε alla spalla. Quando ε si avvicina a zero, entrambe restano finite e diverse da zero. È questa proprietà del criterio, non la dimensione dei campioni, che dobbiamo correggere. La scelta esatta nel punto di pareggio sposta soltanto il lato sul quale compare il cambio.

Usare la memoria della configurazione precedente

La seconda regola conserva una memoria minima: q precedente. All’inizio scegliamo esplicitamente il ramo con q₂ negativo. A ogni nuovo punto confrontiamo la distanza dei candidati da quella configurazione e prendiamo il più vicino. Nel nostro piccolo intervallo il ramo precedente dista soltanto 0,01 radianti alla spalla, mentre passare all’altro richiede cambiare entrambi gli angoli. La regola rimane quindi sullo stesso ramo. Il risultato si vede anche senza il programma: sul raggio costante C resta invariato, quindi q₂ e β sono costanti; q₁ varia esattamente quanto φ.

q[k] = argmin(q ∈ IK(p[k])) ||q − q[k−1]||² Δq₁ = Δφ = 0.01 rad ≈ 0.572958° Δq₂ = 0
A sinistra, due configurazioni raggiungono (0,6;0); la linea punteggiata mostra il piccolo arco del bersaglio. A destra, la scelta indipendente cambia ramo attorno a φ = 0, mentre la scelta vicina alla precedente conserva gli angoli lungo un ramo. Assi in metri, radianti e gradi dichiarati; figure da calcoli sintetici. Aprire per ingrandire.
A sinistra, due configurazioni raggiungono (0,6;0); la linea punteggiata mostra il piccolo arco del bersaglio. A destra, la scelta indipendente cambia ramo attorno a φ = 0, mentre la scelta vicina alla precedente conserva gli angoli lungo un ramo. Assi in metri, radianti e gradi dichiarati; figure da calcoli sintetici. Aprire per ingrandire.

Nel grafico a destra, osserviamo soprattutto le linee verdi del gomito: il riferimento scelto indipendentemente passa da negativo a positivo, mentre quello con memoria resta negativo. Le linee della spalla mostrano una conseguenza collegata, non un secondo esperimento. Le linee uniscono campioni per facilitarne la lettura e non descrivono un’interpolazione fisica verificata. L’asse orizzontale è la direzione del bersaglio, non il tempo: dalla pendenza non possiamo ricavare velocità o accelerazioni senza una legge temporale.

La distanza fra angoli richiede una convenzione

La norma nella regola è la distanza euclidea fra i due angoli, in radianti, con peso uguale. Il suo valore non è la rotazione di un unico asse né una misura di energia. Nel nostro modello i giunti hanno intervalli limitati e confrontiamo direttamente i valori entro quegli intervalli. Per un asse realmente continuo, invece, 179° e −179° potrebbero rappresentare posizioni separate da soli 2° lungo un giro consentito. Sottrarle ingenuamente darebbe 358°. La metrica va quindi costruita sul tipo di giunto e sui limiti effettivi, non soltanto sulla rappresentazione numerica degli angoli.

Il salto del nostro gomito non è un semplice attraversamento del bordo ±180° di una rappresentazione. Le soluzioni sono attorno a ±97°, e il giunto ha limiti ±150°. Il percorso alternativo che gira attraverso 180° non è consentito. C’è una differenza fisica di configurazione, non soltanto un problema di stampa dell’angolo. Per passare continuamente dal ramo negativo al positivo, q₂ dovrebbe attraversare zero; in quel punto il braccio sarebbe completamente esteso e r varrebbe 0,9 metri. Non potrebbe restare sul nostro arco a 0,6 metri durante tale passaggio. Nel modello, i due rami sono separati lungo l’arco.

Quando servono il percorso completo e altri vincoli

Il criterio più vicino alla precedente è locale: guarda il nuovo punto, non il futuro. In un altro problema potrebbe conservare un ramo che più avanti incontra un limite o un ostacolo, mentre una scelta iniziale diversa consentirebbe l’intero compito. Una possibile alternativa rappresenta ogni candidato di ogni punto come un nodo e collega candidati consecutivi con archi fattibili. Cercare un cammino nel grafo permette di ragionare sulla sequenza. Ma un arco non è fattibile soltanto perché i suoi estremi sono raggiungibili: occorre verificare ciò che succede fra essi, con il modello adeguato.

Nel nostro esempio due candidati per punto rendono il confronto locale di ordine costante a ogni passo: per N punti, O(N). Un grafo con B candidati per punto può richiedere fino a O(NB²) confronti fra livelli consecutivi, prima di contare il costo delle verifiche geometriche. Non abbiamo implementato o misurato quel pianificatore, quindi questa è un’analisi strutturale, non un benchmark. Con orientamento imposto, ostacoli, velocità, accelerazioni e coppie, il problema si amplia. La soluzione del nostro arco non dimostra sicurezza, assenza di collisioni o fattibilità dinamica su una macchina industriale.

Riprodurre e distinguere il calcolo dalla prova fisica

Il pacchetto contiene experiment.py, plot.py e tutti i 31 campioni nel JSON dei risultati. ik calcola i due candidati con arccos e atan2; fk ricostruisce la posizione. Gli assert verificano errore cartesiano sotto 10⁻¹² metri e limiti articolari per i punti assegnati. Il programma confronta le due regole sulla stessa sequenza e cerca il massimo passo fra configurazioni. Il valore 10⁻¹² è una tolleranza del controllo numerico sul modello, non l’accuratezza di un robot. Non usiamo casualità, quindi non serve un seed. Il frammento seguente va eseguito nella cartella del pacchetto estratto.

Per generalizzare il software occorrerebbero altri controlli: bersagli fuori portata, limiti esatti, rappresentazioni equivalenti, rami che si fondono e tolleranze vicino a C = ±1. Tagliare sempre C nell’intervallo [−1,1] nasconderebbe un bersaglio davvero irraggiungibile; una gestione delle tolleranze dovrebbe distinguere errore numerico e impossibilità geometrica. Il codice allegato è deliberatamente circoscritto ai dati dichiarati. Per una prova fisica andrebbero aggiunti parametri reali, calibrazione, controllo temporale e verifica del percorso. Qui nessun braccio è stato mosso e nessuna prestazione hardware è stata misurata.

Che cosa risponde questo esempio

La punta può seguire punti vicini mentre le configurazioni richieste saltano, perché il problema inverso ammette più soluzioni e il criterio applicato a ogni punto può cambiare ramo. Per il piccolo arco analizzato, tenere memoria della configurazione precedente evita il cambio e conserva una variazione articolare coerente. Il risultato guida una domanda utile quando un’applicazione AI propone obiettivi al robot: quale continuità e quali vincoli vengono mantenuti dopo la proposta? La robotica industriale e collaborativa è una direzione che EL-AI intende esplorare. Questo studio didattico chiarisce un requisito progettuale, senza attribuirle robot, installazioni o sperimentazioni già eseguite.

Fonte e contributo

Fonte primaria consultata: Kris Hauser, Robotic Systems, capitolo 6 “Inverse Kinematics”, sezioni sul problema inverso, scelta fra soluzioni e derivazione analitica del manipolatore 2R. Letti passaggi e algoritmo, non soltanto la presentazione iniziale; pagina didattica consultata il 10 ottobre 2026, senza attribuire una data di pubblicazione non verificata. Le lunghezze, l’arco, le regole di scelta e il confronto numerico sono costruiti per questo articolo. È una derivazione e analisi didattica con assistenza AI, non ricerca originale sottoposta a peer review o un nuovo benchmark robotico.

Kris Hauser — Robotic Systems, Chapter 6: Inverse Kinematics.

import json
from experiment import ik, fk
import math
for q in ik(.6, 0):
    print('angles deg', [math.degrees(v) for v in q])
    print('position m', fk(q))
r = json.loads(open('results.json', encoding='utf8').read())
print('largest transition', r['largest_naive_transition'])

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