Simulatore interattivoIntermedio

Simulatore mecanum: traslazione, slittamento e deriva

Guida un robot olonomico lateralmente lungo un quadrato, togli l'aderenza e guarda gli encoder sostenere che ha funzionato. Poi monta una ruota al contrario.

Categoria
Robot autonomi
Tempo
20–40 min
Piattaforma
Browser · Arduino · ESP32
Schema tecnico: Simulatore mecanum: traslazione, slittamento e derivaBASE_LINKVxVyωzFOUR WHEELS · THREE DEGREES OF FREEDOMROLLERS AT 45° MAKE AN X

01 / Inizia qui

Introduzione

Una ruota mecanum può spingere solo a 45 gradi, permettendole di muoversi lateralmente e di perdere trazione. Il laboratorio risolve il vero bilanciamento delle forze rispetto all'attrito, così lo slittamento nasce dalla fisica anziché essere disegnato, e integra gli encoder separatamente dal pavimento, mostrando l'estimazione del robot allontanarsi dalla verità senza che nulla a bordo possa accorgersene.

Live lab / Holonomic motion

Mecanum drive simulator

Drive a square sideways without ever turning, then take the grip away and watch the encoders keep insisting it worked. Fit one wheel backwards and the same code drives a spiral.

Browser native
This lab drives a four-wheel mecanum robot through a manoeuvre and draws three paths: the one commanded, the one the floor actually saw, and the one the wheel encoders reported. Beside it, the four wheel rim speeds against time with the motor's free speed marked. Use the controls below to change the command, the floor and how the wheels are fitted.

Left: a top-down view of the floor. The dashed outline is the manoeuvre as commanded, the solid line is where the robot actually went, and the dotted line is where its own encoders believe it went. The robot is drawn at its final pose, with each wheel's roller hand hatched — on a correctly built base those hatches point at the centre and make an X. Right: the four wheel rim speeds against time, with the motor's free speed marked. A trace sitting flat on that line is a wheel that has run out of motor; slip shows up on the left instead, as the gap between the solid line and the dotted one.

  • Commanded manoeuvre
  • Where the robot went
  • Where the encoders say
  • Motor free speed
Try it

There is nothing to start — the whole manoeuvre is re-run as you drag any control. Step through the five presets to see the four ways a holonomic base stops doing what it was told.

The command
The robot and the floor

The robot drives the square sideways and comes home.

Missed home by
0 mm
Odometry drift
0 mm
Heading change
0.0°
Ground lost to slip
0 mm
Command clipped
0%
Encoder disagreement
0.000

Every action has a button above. If you prefer the keyboard, focus the plots and press P for the next preset, M for the next manoeuvre, O to switch between robot- and field-oriented, W to fit the front-left wheel backwards and back, R to reset and F for full screen; sliders respond to the arrow keys.

Controlli

Ogni controllo riapre l’intera manovra quando riceve un input, quindi i percorsi seguono il cursore mentre lo trascini. Non c’è nulla da avviare.

Controllo Cosa modifica
Preset Cinque situazioni risolte: una che funziona e quattro modi in cui smette di funzionare
Manovra Ciò che il driver richiede — un quadrato in traslazione, un quadrato con inversione, una corsa diagonale o la guida con rotazione
Velocità del comando / rotazione del comando Quanto viene spinto il comando
Sistema di riferimento del comando Orientato al robot oppure orientato al campo con un IMU
Oltre il limite Riscala tutto il comando in base alla ruota peggiore oppure limita ogni ruota separatamente
Velocità massima della ruota La velocità libera dei motori al mozzo — un limite rigido, con o senza slittamento
Attrito del pavimento μ Il calcestruzzo lucidato è circa 0.8; il pavimento di una palestra polveroso o un lubrificante versato è 0.25
Montaggio delle ruote Tutte e quattro corrette, oppure quella anteriore sinistra montata al contrario

Il pannello sinistro è il pavimento. La linea tratteggiata è la manovra come comandata, quella continua è dove il robot è realmente andato e quella punteggiata è dove i suoi encoder credono che sia andato. Il pannello destro mostra le quattro velocità al mozzo delle ruote nel tempo, con il limite del motore evidenziato. Una traccia piatta su quella linea è una ruota che ha esaurito la spinta del motore; lo slittamento compare invece nel pannello sinistro, come distanza tra la linea continua e quella punteggiata.

Teoria

Una ruota mecanum può esercitare forza sul pavimento solo lungo gli assi dei rulli. In ogni altra direzione il rullo semplicemente gira e non viene trasmessa forza. Questi assi sono inclinati di 45° rispetto alla ruota, quindi la forza al suolo di una ruota è vincolata a una singola retta del pavimento e nessuna quantità di coppia motore la sposta.

Quattro di queste rette, a mano alternata, possono sommarsi a qualsiasi cosa. Scrivi la velocità al mozzo rispetto alla torsione del telaio ξ = (vx, vy, ω) e ottieni una riga per ruota:

vᵢ = vx + sᵢ·vy + (sᵢ·xᵢ − yᵢ)·ω        sᵢ = ±1, the roller hand

Impila le quattro righe in una matrice A e l’intera trazione è v = A·ξ. Ne seguono tre conseguenze, ed esiste il laboratorio per rendere visibile ciascuna:

Quattro equazioni, tre incognite. Un telaio rigido con tutte le ruote in presa non può produrre velocità al mozzo arbitrarie — l’equazione in più dice sempre FL + FR = RL + RR. Il residuo di questo controllo è un rilevatore di slittamento gratuito calcolabile dai soli encoder. Scatta con uno slittamento asimmetrico — una ruota sollevata, una ruota su una zona bagnata, una ruota nell’angolo sbagliato — ed è completamente cieco quando tutte e quattro slittano insieme, ed è per questo che l’odometria mecanum peggiora in silenzio.

La trazione costa 1/√2. La forza utile del motore decorre lungo la direzione di rotolamento, ma la forza al suolo reale è √2 volte quella, diretta lungo l’asse del rullo — e l’attrito limita l’intero vettore. Quindi il limite per ruota è μN/√2 e il limite di accelerazione del robot è:

a_max = μ·g / √2

Con μ = 0.85 sono 5.9 m/s² contro 8.3 m/s² per lo stesso robot con ruote normali. La massa si cancella da entrambe, quindi il zavorro non cambia nulla — l’opposto di un robot che spinge, dove il peso è l’intera strategia.

Anche le diagonali costano 1/√2. Un comando a 45° mette vx + vy su due ruote e zero sulle altre due, quindi la coppia impegnata satura mentre il robot si muove solo a V_MAX / √2. Motori più veloci spostano quel limite; nulla lo elimina.

La derivazione completa, compresa l’inverso dell’odometria, è in cinematica delle ruote mecanum.

Algoritmo

Ogni passo di 5 ms, in quest’ordine. Le due integrazioni della posa alla fine sono deliberatamente separate — quella separazione è la lezione sull’odometria.

  1. Leggi il comando per questo punto della manovra.
  2. Ruota nel sistema del robot se è orientato al campo: vx' = vx·cos θ + vy·sin θ, vy' = −vx·sin θ + vy·cos θ. Se è orientato al robot, salta questa operazione.
  3. Cinematica inversa — v = A·ξ, usando la matrice in cui crede il firmware, che è sempre quella corretta. Una ruota montata male non è qualcosa che il firmware possa conoscere.
  4. Limita — ridimensiona l’intero vettore in base alla ruota peggiore oppure limita ogni ruota separatamente.
  5. Ritardo delle ruote — ogni mozzo insegue il proprio obiettivo con una risposta del primo ordine di 0.1 s, perché un anello di velocità è valido, non istantaneo.
  6. Ciò che le ruote richiedono — cinematica diretta ai minimi quadrati sulle velocità al mozzo, usando la matrice del robot realmente costruito.
  7. Risolvi le forze che farebbero corrispondere il telaio, poi applica due limiti in ordine: quello del motore (c’era solo una quantità limitata di coppia) e quello del pavimento (μN/√2 per ruota).
  8. Tutto ciò che il pavimento rifiuta fa girare il mozzo. Quell’eccedenza accelera la ruota rispetto alla velocità comandata, ed è la rotazione libera della ruota: l’unico sintomo di slittamento che un encoder può mai segnalare.
  9. Integra la verità dalle forze effettivamente applicate.
  10. Integra l’odometria dalle velocità al mozzo, attraverso la matrice del firmware — perché l’encoder è fissato alla ruota, non al pavimento.

Niente in questa sequenza cerca lo slittamento o lo inserisce. Lo slittamento è il passo 7 che rifiuta una forza, e la deriva che vedi è il passo 10 che non lo scopre mai.

Esperimenti guidati

Ognuno isola una sola variabile. Esegui in ordine; si costruiscono.

1. La cosa per cui hai comprato le ruote mecanum

Carica Un quadrato che si chiude. Il robot avanza un metro, gira a destra di un metro, torna indietro e a sinistra, poi rientra a 17 mm da dove è partito con l’indicazione dell’orientamento sempre ferma a 0.0°. Ora passa la manovra a quadrato, con inversioni agli angoli — lo stesso quadrato, guidato come deve fare un robot a trazione differenziale. Si chiude anche questo, a 4 mm. Ricorda che qui funzionano entrambe le soluzioni.

Cosa osservare: il quadrato in traslazione si sposta su due assi e consuma niente orientamento per farlo. Nessuna trazione differenziale può tentare la stessa cosa.

2. Togli il pavimento

Trascina l’attrito del pavimento da 0.85 a 0.25, mantenendo il quadrato in traslazione. Poi fai lo stesso con il quadrato con inversioni.

Manovra Orientamento con μ = 0.85 Orientamento con μ = 0.25
Quadrato in traslazione 0.0° 0.0°
Quadrato con inversioni 0.2° decine di gradi, e a volte una completa inversione

Cosa osservare: guarda l’orientamento, non la distanza. Entrambi i robot scivolano e mancano entrambi casa; quello in traslazione manca mentre punta ancora esattamente dove è partito, perché non ha mai comandato una rotazione. Quello con inversioni perde l’orientamento e poi percorre il tratto successivo nella direzione sbagliata: è così che un piccolo slittamento diventa un grande errore. Ogni rotazione è una nuova occasione di perdere il tracciato, e la base olonomica semplicemente non le accetta.

Le distanze in questo esperimento cambiano tra un’esecuzione e l’altra con impostazioni diverse, ed è la risposta onesta anziché un errore: un robot che scivola su tutte e quattro le ruote è un sistema stick-slip e non si ferma due volte nello stesso punto. L’orientamento non ha questo problema.

3. Guarda gli encoder mentire

Carica Stesso quadrato, pavimento untuoso e guarda le due linee nel pannello sinistro. La linea punteggiata dell’odometria disegna un quadrato ordinato; quella continua no. Il robot finisce a 225 mm da casa mentre i suoi encoder lo collocano 133 mm altrove, dopo che 1.27 m di terreno sono passati sotto le ruote senza muovere affatto il robot.

Ora guarda l’indicatore Discordanza tra encoder. Resta a 0.000 per tutto il tempo.

Cosa osservare: il controllo residuo gratuito — FL + FR dovrebbe essere uguale a RL + RR su qualsiasi telaio rigido — intercetta una ruota che scivola ed è completamente cieco a quattro ruote che scivolano insieme. Questa cecità è esattamente il motivo per cui l’odometria mecanum fallisce in silenzio. Monta un IMU oppure ruote passive e smetti di fidarti degli encoder della trazione per la posizione.

4. Il limite √2

Carica Corsa diagonale. La velocità del comando è 0.60 m/s e così anche la velocità massima della ruota, quindi il comando dovrebbe essere realizzabile. Non lo è: il comando viene limitato per il 91% dell’esecuzione e il robot raggiunge al massimo 0.424 m/s — che è 0.60/√2 a tre decimali, raggiunto esattamente.

Cosa osservare: nel pannello destro, due tracciati restano piatti a zero mentre due sono bloccati al limite. Un comando a 45° mette vx + vy su due ruote e niente sulle altre due, quindi la coppia impegnata satura a V_MAX / √2. Aumenta la velocità massima della ruota e il limite si sposta con essa — il 71% non cambia mai.

5. Ridimensionare o limitare

Passa la manovra a guida con rotazione, spingi la rotazione del comando a 240 °/s e cambia Oltre il limite tra le due impostazioni. Il percorso cambia forma.

Cosa osservare: il ridimensionamento rinuncia alla velocità su ogni asse e conserva la direzione. Il limite per singola ruota conserva la velocità in avanti e perde il 27% della rotazione — il robot compie 127° durante l’esecuzione invece di 92° — quindi si curva diversamente da come gli è stato chiesto. Poi torna alla corsa diagonale e prova lo stesso interruttore: non succede nulla, perché le ruote inattive erano già dentro il limite. Ecco come questo errore sopravvive ai test.

6. Monta una ruota al contrario

Carica Una ruota montata al contrario, oppure premi W sui grafici. Nulla nel codice è cambiato.

Tutte e quattro corrette Anteriore sinistra specchiata
Distanza da casa 17 mm oltre un metro
Variazione di orientamento 0.0° decine di gradi
Terreno perso per slittamento 15 mm diversi metri
Discordanza tra encoder 0.000 ≈ 0.28

Cosa osservare: il robot non sta più facendo niente di simile a ciò che gli è stato detto e questa volta l’indicatore del residuo scatta — grande e stabile anziché a raffica. Nota quale colonna ha numeri esatti e quale no: con una ruota che combatte le altre tre il robot scivola continuamente, quindi la sua posa finale è caotica. Il residuo è il numero che sopravvive, ed è esattamente il motivo per cui vale la pena metterlo su una linea di telemetria. È l’unico sintomo che puoi leggere su un robot reale senza IMU e senza riferimento esterno. Guarda anche il robot disegnato: la tratteggiatura dell’angolo specchiato punta nella direzione sbagliata e le quattro linee dei rulli non formano più una X.

7. Orientato al campo, con un tasto

Carica Orientato al campo con rotazione, poi premi O per tornare all’orientamento al robot e O di nuovo per rientrare.

Cosa osservare: nell’orientamento al robot, un comando avanti mantenuto premuto durante la rotazione disegna un tracciato a rosetta: il robot percorre 2.34 m di percorso e finisce a 0.30 m da dove è partito — il 13% del suo sforzo è andato chissà dove. Nell’orientamento al campo, lo stesso comando percorre 2.03 m e finisce a 2.03 m di distanza: una retta perfetta, 100%, con il corpo che ruota per tutta la lunghezza. Sei righe di trigonometria separano i due casi, ed è la differenza tra un robot guidabile da una persona e uno che nessuno può guidare.

Cosa osservare

Riunendo i sette punti:

  • L’avanti è gratis; il laterale e il diagonale no. Ogni ruota contribuisce pienamente al movimento in avanti. Una diagonale ne usa metà.
  • Due penalità della radice di due, dallo stesso 45°. Velocità su una diagonale e trazione in ogni direzione. Nessuna delle due si compra con motori più grandi.
  • La massa si cancella. Il limite di accelerazione è μg/√2 qualunque sia il peso del robot, l’opposto di un robot che spinge.
  • La trazione olonomica batte quella differenziale quando il pavimento è cattivo, perché le rotazioni sono la fonte dell’errore.
  • L’odometria è il prezzo. Non è un problema di regolazione né di encoder migliori — il fatto che la ruota scivola è il modo in cui la trazione funziona.

Portarlo sull’hardware

In questo laboratorio Su un robot reale
Un cursore di aderenza Un pavimento e un numero che scopri spingendo il robot con una bilancia da valigia
Le ruote raggiungono la velocità comandata con un ritardo di 0.1 s Solo se hai costruito un anello di velocità. Aperto, i rapporti derivano con la batteria
Integrazione odometrica perfetta e istantanea 50–100 Hz, con quantizzazione degli encoder e un rollover di micros() che ti aspetta
Motori identici Il 3–8% di differenza appena usciti dalla scatola, e ancora di più da caldi
Un μ pulito per tutto il pavimento Polvere, una giunzione nel vinile, un cavo — l’aderenza locale varia più di quanto aspetti
Il montaggio delle ruote è un menu a tendina Il montaggio delle ruote è quattro bulloni e il controllo della X, e sbaglierai una volta

Il laboratorio vale i suoi venti minuti soprattutto per l’esperimento 6. Montare una ruota al contrario non costa nulla qui e mezza giornata sul banco, ed è il guasto che hai più probabilità di costruire.

Codice sorgente

L’intera trazione è questa coppia di funzioni. La geometria vive in un unico punto.

const float LX = 0.075f;      // half the wheelbase, m (wheel centre to wheel centre / 2)
const float LY = 0.085f;      // half the track, m
const float K  = LX + LY;
const float R  = 0.0485f;     // wheel radius, m
const float V_MAX = 0.60f;    // rim speed the motors can actually hold, m/s

// Inverse kinematics + saturation. vx forward, vy LEFT, omega counter-clockwise.
void driveMecanum(float vx, float vy, float omega) {
  float w[4] = {
    vx - vy - K * omega,      // front left
    vx + vy + K * omega,      // front right
    vx + vy - K * omega,      // rear left
    vx - vy + K * omega,      // rear right
  };

  float peak = 0;
  for (int i = 0; i < 4; i++) peak = max(peak, fabsf(w[i]));
  if (peak > V_MAX) {                    // SCALE, never clip
    float s = V_MAX / peak;
    for (int i = 0; i < 4; i++) w[i] *= s;
  }

  for (int i = 0; i < 4; i++) wheelLoop[i].target = w[i];   // hand to the velocity loops
}

// Forward kinematics for odometry, and the free diagnostic.
float updateOdometry(const float rim[4], float dt) {
  float vx    = ( rim[0] + rim[1] + rim[2] + rim[3]) * 0.25f;
  float vy    = (-rim[0] + rim[1] + rim[2] - rim[3]) * 0.25f;
  float omega = (-rim[0] + rim[1] - rim[2] + rim[3]) * 0.25f / K;

  theta += omega * dt;
  poseX += (vx * cosf(theta) - vy * sinf(theta)) * dt;
  poseY += (vx * sinf(theta) + vy * cosf(theta)) * dt;

  // Four equations, three unknowns. On any rigid, gripping chassis this is zero.
  // Large and steady => a wheel is in the wrong corner. Bursty => something slipped.
  return (rim[0] + rim[1]) - (rim[2] + rim[3]);
}

La derivazione di quelle quattro righe, e il motivo per cui il residuo funziona, è in cinematica delle ruote mecanum. Dare un significato a wheelLoop[i].target è il controllo a ciclo chiuso della velocità delle ruote. Costruire il dispositivo è il robot mecanum omnidirezionale.

Checklist hardware

Componenti

  • Quattro ruote mecanum, due per ogni verso — mai quattro uguali
  • Quattro motoriduttori, uno per ruota, ciascuno regolabile indipendentemente in entrambe le direzioni
  • Quattro encoder in quadratura, se vuoi mantenere i rapporti tra le ruote
  • Pavimento piatto, duro e pulito, una condizione non negoziabile

Esplora il grafo

Dove si usa questo simulatore

I progetti, i percorsi di apprendimento e i tutorial che si basano su questo laboratorio.

Continua a costruire

Scarica le risorse

Usa questi riferimenti nella pagina mentre lavori al progetto. I pacchetti di progetto scaricabili verranno aggiunti solo dopo la pubblicazione del loro codice sorgente e della loro versione.

Domande comuni

Domande frequenti

Perché il mio robot mecanum ruota quando gli chiedo di traslare?

Quasi sempre una ruota è nell'angolo sbagliato. Un kit mecanum ha due ruote sinistre e due destre e la loro mano deve alternarsi attorno al telaio. Mettine una nel posto sbagliato e il suo vettore forza punta attraverso la traslazione invece che in essa, così un comando laterale diventa una curva lenta con una rotazione. L'avanti sembra ancora corretto, ed è questo che rende la cosa così confusa. Carica il preset con una ruota montata al contrario: un quadrato che si chiudeva a 17 mm finisce a più di un metro di distanza e ruotato di decine di gradi, senza alcuna modifica al codice. Il numero di cui fidarti lì è la discordanza tra gli encoder, che passa da 0.000 a circa 0.28 — un robot che scivola su tutte le ruote è un sistema stick-slip, quindi il punto esatto in cui si ferma non è una previsione, né in laboratorio né sul banco. Il controllo di cinque secondi su un robot reale: stai in piedi sopra, guarda dritto in basso e segui i rulli visibili sulla parte superiore di ogni ruota — quelle quattro linee dovrebbero puntare al centro e disegnare una X.

Perché il mio robot mecanum è più lento in diagonale?

Perché un comando a 45 gradi chiede tutto a due ruote e niente alle altre due. Imposta la manovra su corsa diagonale e guarda il grafico delle velocità delle ruote: due tracciati restano piatti a zero mentre due sono bloccati al limite. La massima velocità diagonale è quindi la massima velocità di una ruota divisa per la radice di due, circa il 71% della velocità in linea retta, e motori più veloci spostano quel limite senza eliminarlo. È geometria, non un problema di regolazione.

Perché l'odometria mecanum è così cattiva?

Perché l'encoder è fissato alla ruota e la ruota non è il pavimento. Su una base mecanum i rulli scivolano per progetto — è così che funziona il movimento laterale — quindi ogni millimetro che il pavimento rifiuta finisce nell'encoder come percorso che il robot non ha mai fatto. Carica il preset untuoso e guida il quadrato in traslazione: il robot finisce a 225 mm da casa, la sua stima odometrica è sbagliata di 133 mm e 1.27 m di terreno sono passati sotto le ruote senza muovere il robot. Nulla a bordo può accorgersene. Peggio, il controllo residuo che intercetta una ruota che slitta tace quando slittano tutte e quattro, quindi l'errore si accumula in completo silenzio. Ecco perché le realizzazioni mecanum serie aggiungono un IMU per l'orientamento e ruote passive per la posizione.

Devo scalare tutto il comando o limitare ogni ruota?

Scala. Limitare ogni motore con un constrain() conserva la velocità e butta via la direzione. Imposta la manovra su guida con rotazione, spinge la rotazione del comando fino a 240 gradi al secondo e cambia il limitatore: il ridimensionamento mantiene l'orientamento comandato e rallenta insieme ogni asse, il limite per singola ruota mantiene la velocità in avanti e rinuncia silenziosamente a più di un quarto della rotazione. La trappola è che su una diagonale pura i due limitatori producono numeri identici, perché le ruote inattive sono già dentro il limite — l'errore supera quindi il test che tutti eseguono e compare più tardi come un robot che esce di traverso dagli angoli.

Un robot più pesante ha più trazione sulle ruote mecanum?

Non per l'accelerazione. Più massa compra proporzionalmente più attrito e proporzionalmente più inerzia, e si annullano esattamente: il limite di accelerazione è mu per g diviso per la radice di due indipendentemente da quanto pesi il robot. È l'opposto di un robot sumo, dove il peso è l'intera strategia, perché lì il carico spinto è esterno. Il zavorro su una base mecanum non compra nulla, solo una risposta dei motori più lenta e una batteria più scarica.

È così che funziona un vero robot mecanum?

La cinematica è esatta — la stessa matrice a quattro righe che usa qualsiasi implementazione reale, e l'odometria è il suo inverso ai minimi quadrati. La dinamica risolve a ogni passo un vero bilanciamento di forze con due limiti in ordine, quello del motore e quello del pavimento, e lo slittamento è l'eccedenza rifiutata anziché qualcosa di programmato. Ciò che non modella è il contatto rullo per rullo mentre ogni rullo entra ed esce dal terreno, la piccola ondulazione verticale che causa o il trasferimento di carico sotto accelerazione. Quindi ottiene correttamente le risposte ingegneristiche — le penalità della radice di due, dove va l'odometria, cosa fa una ruota montata al contrario — e funziona un po' più fluida di un robot reale su un pavimento reale. Una precisazione onesta: quando tutte le ruote scorrono, il modello è un sistema stick-slip di Coulomb e la posa finale esatta smette di essere un numero ripetibile anche se il laboratorio stesso è perfettamente deterministico. La distanza di slittamento, il residuo degli encoder e ogni caso di presa solida sono affidabili; un'esecuzione completamente scivolante dice solo la dimensione del problema, non dove si fermerà il robot.

Per approfondire

Fonti

Fonti autorevoli per andare oltre il modello didattico, volutamente limitato, di questo simulatore.