Un braccio robotico. Un modello. Dallo spazio dei giunti al cartesiano.
L’UR5 — un braccio industriale a 6 giunti rotoidali — modellato end-to-end come DAE multibody. La cinematica inversa in forma chiusa alimenta un controllore PD per giunto con feedforward di gravità che mantiene un percorso cartesiano dell’end-effector in simulazione. Cinematica, inerzia e controllo, tutti su un’unica replica digitale viva.
Ogni sottosistema, su un unico canvas.
Niente è semplificato con placeholder — la catena cinematica, l’inerzia dei link e il controllo portano tutti la propria fisica.
Sei giunti rotoidali
I parametri DH standard dell’UR5 concatenano sei giunti rotoidali dalla base al polso. L’inerzia del rotore (Jr) è disponibile come parametro opzionale ma è tenuta a 0 per la catena 6R — Jr > 0 innesca una patologia di riduzione d’indice in MTK che blocca le catene con N ≥ 5 giunti (ADR-0072).
Link a inerzia completa
Le masse dei link e le inerzie principali diagonali provengono dall’URDF pubblico dell’UR5. I termini di inerzia fuori diagonale sono trascurati; il DAE multibody cattura le forze inerziali dominanti senza l’accoppiamento tensoriale completo.
IK in forma chiusa
Un risolutore analitico a polso disaccoppiato chiude il ciclo di cinematica inversa in un solo ramo. L’errore di andata-ritorno (FK ∘ IK) è di ~1e-16 rad — alla precisione di macchina in virgola mobile.
Controllo PD + feedforward di gravità
PD per giunto più feedforward di gravità: in_tau → −q. La legge di controllo di ogni giunto è indipendente, con guadagni tarati sulla frequenza naturale del braccio.
Osservatore FK dell’end-effector
La cinematica diretta propaga gli angoli dei giunti a una posizione cartesiana dell’end-effector che viene confrontata con il percorso di riferimento, fornendo il segnale di errore di tracking.
Composizione DAE multibody
Le primitive Revolute, FixedTranslation, FixedRotation e Link del kit multibody pure-DJL compongono la catena DH. Il motore le traduce in un DAE simbolico.
Costruito dalla catena DH, non da matrici assemblate a mano.
Il modello UR5 è assemblato dallo stesso kit multibody pure-DJL che alimenta il quadricottero Djinborn — primitive Revolute, FixedTranslation, FixedRotation e Link collegate secondo i parametri DH standard. Cinematica e forze inerziali emergono dalla composizione; non ci sono Jacobiane o matrici di massa scritte a mano. La politica di inizializzazione del motore è impostata su NoInit (ADR-0071) in modo che l’IK analitica possa precondizionare gli angoli dei giunti prima dell’avvio dell’integratore DAE — un requisito perché il risolutore in forma chiusa a polso disaccoppiato operi correttamente nel ciclo.
Kit multibody pure-DJL (Revolute/FixedTranslation/FixedRotation/Link) — nessuna modifica a Rust o Julia. — ADR-0067
IK a polso disaccoppiato in forma chiusa, un ramo, pose non singolari. — ADR-0072
La politica del motore NoInit permette all’IK analitica di precondizionare lo stato del DAE. — ADR-0071
Quattro gate. Numeri reali.
Simulazione verificata contro quattro gate sul branch feat/multibody-ur5-arm. Ambito: pose non singolari, un solo ramo IK. Nessun robot fisico — questi sono risultati di simulazione del gemello digitale.
Gate
- G-B1: mantenimento posa con compensazione di gravità: PASS
- G-B2: errore di tracking dei giunti: PASS
- G-B3a: andata-ritorno IK (FK∘IK): PASS
- G-B3b: tracking cartesiano (picco): PASS
- G-B3b: tracking cartesiano (regime): PASS
Risultato
- G-B1: mantenimento posa con compensazione di gravità: angoli dei giunti stabili, nessuna deriva
- G-B2: errore di tracking dei giunti: <0,0013 rad per giunto
- G-B3a: andata-ritorno IK (FK∘IK): ~1e-16 rad (precisione di macchina)
- G-B3b: tracking cartesiano (picco): 0,485 cm
- G-B3b: tracking cartesiano (regime): 0,41 cm
Il bug che sembrava una lacuna fisica.
Alla prima esecuzione della catena 6R, il DAE risultava sottodeterminato — il risolutore non riusciva a chiudere. La prima ipotesi fu l’inerzia del rotore mancante (una correzione facile: aggiungere Jr per giunto). Il modello girava, ma il tracking restava scadente. La causa reale era un frame terminale sospeso: il connettore Frame di uscita del sesto giunto non aveva un corpo a valle contro cui reagire, quindi le equazioni di vincolo erano degeneri. Identificare questa — e non l’inerzia — come causa radice ha richiesto di leggere la struttura del residuo invece di tentare a caso. La correzione è stata una riga. Raccontare onestamente la diagnosi errata fa parte del verbale: il rigore ingegneristico significa seguire il residuo, non la prima storia plausibile.