Simulador interativoIntermediário

Simulador Mecanum: lateral, derrapagem e deriva

Conduza um robô holonômico lateralmente, tire a aderência e veja os encoders insistirem que funcionou; depois instale uma roda ao contrário.

Categoria
Robôs autônomos
Tempo
20–40 min
Plataforma
Navegador · Arduino · ESP32
Esquema técnico de Simulador Mecanum: lateral, derrapagem e derivaBASE_LINKVxVyωzFOUR WHEELS · THREE DEGREES OF FREEDOMROLLERS AT 45° MAKE AN X

01 / Comece aqui

Introdução

Uma roda Mecanum só aplica força no piso a 45 graus, o que permite o movimento lateral e faz a aderência desaparecer. O laboratório resolve o balanço de forças contra o limite de atrito: a derrapagem decorre da física, não é roteirizada. As leituras dos encoders são integradas separadamente do movimento real no piso, mostrando como a estimativa do robô se afasta da verdade sem que o hardware possa detectar isso.

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.

Controles

Todo controle repete a manobra inteira na entrada, portanto os caminhos acompanham um controle deslizante enquanto você o arrasta. Não há nada para iniciar.

Controle O que altera
Predefinição Cinco situações resolvidas: uma que funciona e quatro maneiras de ela parar de funcionar
Manobra O que o motorista pede — um quadrado com deslocamento lateral, um quadrado girando, uma corrida diagonal ou dirigir enquanto gira
Velocidade do joystick / Giro do joystick Quanto o joystick solicita em cada eixo
Referencial do joystick Orientado ao robô ou orientado ao campo com uma IMU
Acima do limite Escale todo o comando pela roda mais exigida ou recorte cada roda individualmente
Velocidade máxima da roda A velocidade livre dos motores na periferia — um teto rígido, com derrapagem ou não
Aderência do piso μ Concreto polido fica perto de 0,8; piso de academia empoeirado ou lubrificante derramado é 0,25
Ajuste das rodas Todas as quatro corretas ou a dianteira esquerda montada ao contrário

O painel esquerdo é o piso. A linha tracejada é a manobra comandada, a sólida é onde o robô realmente foi e a pontilhada é onde os próprios encoders acreditam que ele foi. O painel direito mostra as quatro velocidades periféricas das rodas em função do tempo, com o limite do motor marcado. Um traço apoiado nessa linha corresponde a uma roda que atingiu o limite de torque do motor; a derrapagem aparece no painel esquerdo, como a distância entre a linha sólida e a pontilhada.

Teoria

Uma roda Mecanum só pode aplicar força no piso ao longo dos eixos de seus roletes. Em qualquer outra direção, o rolete simplesmente gira e nada é transmitido. Esses eixos estão a 45° em relação à roda, portanto a força de uma roda no solo fica presa a uma única linha no piso e nenhuma quantidade de torque do motor a move.

Quatro dessas linhas, com mãos alternadas, somam qualquer coisa. Escreva a velocidade periférica da roda em função do giro do chassi ξ = (vx, vy, ω) e você obtém uma linha por roda:

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

Empilhe as quatro linhas em uma matriz A e todo o trem de acionamento é v = A·ξ. Três consequências, e o laboratório existe para tornar cada uma visível:

Quatro equações, três incógnitas. Um chassi rígido cujas rodas estão todas aderentes não pode produzir velocidades periféricas arbitrárias — a equação extra diz FL + FR = RL + RR, sempre. O resíduo dessa verificação é um detector de derrapagem gratuito que pode ser calculado apenas com encoders. Ele é acionado por derrapagem assimétrica — uma roda fora do chão, uma sobre uma área molhada, uma no canto errado — e é completamente cego quando todas as quatro derrapam juntas. Essa cegueira explica por que a odometria Mecanum se degrada silenciosamente.

A tração custa 1/√2. A força útil do motor atua ao longo da direção de rolamento, mas a força real no solo é √2 vezes essa, apontada ao longo do eixo do rolete — e o atrito limita todo o vetor. Portanto, o limite por roda é μN/√2 e o teto de aceleração do robô é:

a_max = μ·g / √2

Com μ = 0,85, isso dá 5,9 m/s², contra 8,3 m/s² para o mesmo robô com rodas comuns. A massa se cancela nos dois casos, portanto lastro não muda nada — o contrário de um robô que empurra, onde o peso é toda a estratégia.

As diagonais também custam 1/√2. Um comando a 45° coloca vx + vy em duas rodas e zero nas outras duas, portanto o par ocupado satura enquanto o robô se move apenas a V_MAX / √2. Motores mais rápidos deslocam esse limite; nada o remove.

O desenvolvimento completo, incluindo a inversa da odometria, está em cinemática da roda Mecanum.

Algoritmo

Cada passo de 5 ms, nesta ordem. As duas integrações da pose no final são deliberadamente separadas — essa separação é a lição da odometria.

  1. Leia o joystick para obter o comando deste ponto da manobra.
  2. Gire para o referencial do robô se estiver orientado ao campo: vx' = vx·cos θ + vy·sin θ, vy' = −vx·sin θ + vy·cos θ. Orientado ao robô pula isso inteiramente.
  3. Cinemática inversa — v = A·ξ, usando a matriz em que o software embarcado acredita, que é sempre a correta. Uma roda montada errado não é algo que o software embarcado possa conhecer.
  4. Limite — escale o vetor inteiro pelo fator determinado pela maior demanda de roda ou recorte cada roda individualmente.
  5. Atraso das rodas — cada roda persegue seu alvo com uma resposta de primeira ordem de 0,1 s, porque um controlador de velocidade é bom, não instantâneo.
  6. O que as rodas exigem — cinemática direta por mínimos quadrados nas velocidades periféricas, usando a matriz do robô que realmente foi construído.
  7. Resolva as forças que fariam o chassi coincidir com o comando e aplique dois limites em ordem: o do motor (que sempre teve torque limitado) e o do piso (μN/√2 por roda).
  8. O excedente recusado pelo piso faz a roda girar. Esse excedente acelera a roda para longe da velocidade comandada, o que produz patinagem da roda, e é o único sintoma de derrapagem que um encoder pode relatar.
  9. Integre a verdade a partir das forças que foram realmente aplicadas.
  10. Integre a odometria a partir das velocidades periféricas, pela matriz do software embarcado — porque o encoder está preso à roda, não ao piso.

Nada ali procura derrapagem ou a insere. A derrapagem é o passo 7 recusando uma força, e a deriva que você vê é o passo 10 nunca descobrindo.

Experimentos guiados

Cada um isola uma única variável. Execute-os em ordem; eles se constroem.

1. A coisa pela qual você comprou rodas Mecanum

Carregue Um quadrado que fecha. O robô avança um metro, vai um metro para a direita, volta e segue para a esquerda, terminando a apenas 17 mm do ponto inicial, com a leitura de orientação nunca saindo de 0,0°. Agora mude a manobra para quadrado, girando nos cantos — o mesmo quadrado, conduzido como um robô de acionamento diferencial precisa ser. Ele também fecha, em 4 mm. Lembre-se de que os dois funcionam aqui.

O que observar: o quadrado com deslocamento lateral se translada em dois eixos e gasta nenhuma orientação para fazê-lo. Nenhum acionamento diferencial pode tentar isso.

2. Tire o piso de baixo

Arraste a aderência do piso de 0,85 para 0,25, mantendo o quadrado com deslocamento lateral. Depois faça o mesmo com o quadrado girando.

Manobra Orientação em μ = 0,85 Orientação em μ = 0,25
Quadrado por deslocamento lateral 0,0° 0,0°
Quadrado girando 0,2° dezenas de graus e, às vezes, uma inversão completa

O que observar: observe a orientação, não a distância. Os dois robôs derrapam e ambos falham ao voltar para casa; o que se desloca lateralmente erra enquanto ainda aponta exatamente para onde começou, porque nunca comandou rotação. O que gira perde a orientação e depois conduz o próximo trecho na direção errada, que é como uma pequena derrapagem se transforma em um grande erro. Cada rotação da base holonômica é uma nova chance de perder a referência, e o acionamento holonômico não apresenta esse problema.

As distâncias neste experimento mudam entre execuções com configurações diferentes, e essa é a resposta honesta, e não um defeito: um robô derrapando nas quatro rodas forma um sistema de adesão-deslizamento e não termina duas vezes no mesmo lugar. A orientação não tem esse problema.

3. Veja os encoders mentirem

Carregue O mesmo quadrado, piso gorduroso e observe as duas linhas no painel esquerdo. A linha pontilhada da odometria desenha um quadrado arrumado; a linha sólida não. O robô termina a 225 mm do ponto de partida, enquanto seus próprios encoders o colocam a 133 mm da posição real, depois de 1,27 m de solo passar sob as rodas sem mover o robô.

Agora observe a leitura Discrepância entre encoders. Ela permanece em 0,000 o tempo todo.

O que observar: a verificação de resíduo gratuita — FL + FR deve ser igual a RL + RR em qualquer chassi rígido — detecta uma roda derrapando e é completamente cega às quatro derrapando juntas. Essa cegueira é exatamente a razão pela qual a odometria Mecanum falha silenciosamente. Coloque uma IMU nele, ou rodas mortas, e pare de confiar nos encoders do acionamento para determinar a posição.

4. O teto de √2

Carregue Corrida diagonal. A velocidade do joystick é 0,60 m/s e a velocidade máxima da roda também, portanto o comando deveria ser alcançável. Não é: o comando é recortado durante 91% da execução e o robô chega a no máximo 0,424 m/s — que é 0,60/√2 até a terceira casa decimal, alcançado exatamente.

O que observar: no painel direito, dois traços ficam em zero enquanto dois estão presos no limite. Um comando a 45° coloca vx + vy em duas rodas e nada nas outras duas, portanto o par ocupado satura em V_MAX / √2. Aumente a velocidade máxima da roda e o limite se move junto — 71% nunca muda.

5. Escale ou recorte

Mude a manobra para dirigir enquanto gira, aumente o giro do joystick para 240 °/s e alterne Acima do limite entre as duas configurações. O caminho muda de forma.

O que observar: o escalonamento entrega velocidade em cada eixo e mantém a direção. O recorte mantém a velocidade para frente e descarta 27% da rotação — o robô gira 127° durante a execução, em vez de 92°; portanto, ele se curva de maneira diferente da solicitada. Depois volte à corrida diagonal e experimente o mesmo interruptor: nada acontece, porque as rodas ociosas já estavam dentro do limite. É assim que esse defeito sobrevive aos testes.

6. Instale uma roda ao contrário

Carregue Uma roda instalada ao contrário ou pressione W nos gráficos. Nada no código mudou.

Todas as quatro corretas Dianteira esquerda espelhada
Erro ao voltar para casa 17 mm mais de um metro
Variação de orientação 0,0° dezenas de graus
Solo perdido por derrapagem 15 mm vários metros
Discrepância entre encoders 0,000 ≈ 0,28

O que observar: o robô não está mais fazendo nada parecido com o que foi solicitado e, desta vez, a leitura de resíduo dispara — grande e constante, não intermitente. Observe qual coluna tem números exatos e qual não tem: com uma roda lutando contra as outras três, o robô está derrapando continuamente, portanto sua pose final é caótica. O resíduo é o número que sobrevive, e é exatamente por isso que ele merece uma linha de telemetria. Esse é o único sintoma que você pode ler em um robô real sem IMU e sem referência externa. Olhe também para o robô desenhado: a hachura do canto espelhado aponta para o lado errado e as quatro linhas dos roletes não formam mais um X.

7. Orientado ao campo, em uma tecla

Carregue Orientado ao campo enquanto gira e pressione O para voltar ao orientado ao robô e O novamente para retornar.

O que observar: orientado ao robô, um joystick para frente mantido enquanto se gira desenha uma roseta: o robô percorre 2,34 m de caminho e termina a 0,30 m de onde começou — 13% de seu esforço foi para lugar nenhum. Orientado ao campo, o mesmo joystick percorre 2,03 m e termina a 2,03 m de distância: uma linha reta, 100%, com o corpo girando ao longo de todo o percurso. Seis linhas de trigonometria separam os dois casos, e essa é a diferença entre um robô que uma pessoa consegue dirigir e um que ninguém consegue.

O que observar

Reunindo os sete pontos:

  • Para frente não tem penalidade; lateral e diagonal têm. Cada roda contribui totalmente para o movimento para frente. Uma diagonal usa metade delas.
  • Duas penalidades de raiz de dois, dos mesmos 45°. Velocidade na diagonal e tração em todas as direções. Nenhuma é eliminada com motores maiores.
  • A massa se cancela. O teto de aceleração é μg/√2, qualquer que seja o peso do robô, o contrário de um robô que empurra.
  • Holonômico vence diferencial quando o piso é ruim, porque o erro nasce nas rotações da base holonômica.
  • A odometria é o preço. Não é um problema de ajuste nem de encoder melhor — a roda derrapando é como o trem de acionamento funciona.

Aplicação em hardware

Neste laboratório Em um robô real
Um controle de aderência Um piso e um número que você descobre empurrando o robô com uma balança de bagagem
As rodas atingem a velocidade comandada com atraso de 0,1 s Somente se você construiu um controlador de velocidade. Em malha aberta, as proporções derivam com a bateria
Integração de odometria perfeita e instantânea 50–100 Hz, com quantização do encoder e um transbordo de micros() esperando por você
Motores idênticos 3–8% diferentes de fábrica e ainda mais diferentes quando aquecidos
Um μ limpo para todo o piso Poeira, uma emenda no vinílico, um cabo — a aderência local varia mais do que você espera
O ajuste das rodas é uma lista suspensa O ajuste das rodas é quatro parafusos e a verificação do X, e você vai errar uma vez

O laboratório vale os vinte minutos principalmente pelo experimento 6. Instalar uma roda ao contrário não custa nada aqui e custa meio dia na bancada, e é a falha que você tem mais chance de cometer.

Código-fonte

Todo o trem de acionamento está nestas duas funções. A geometria existe em exatamente um lugar.

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]);
}

O desenvolvimento dessas quatro linhas e a explicação de por que o resíduo funciona estão em cinemática da roda Mecanum. Para que wheelLoop[i].target signifique algo, implemente o controle de velocidade das rodas com realimentação. Para construir a coisa, veja o robô omnidirecional Mecanum.

Lista de verificação de hardware

Componentes

  • Quatro rodas Mecanum, duas de cada mão — nunca quatro iguais
  • Quatro motorredutores, um por roda, cada um reversível de forma independente
  • Quatro encoders em quadratura, se você quiser que as rodas mantenham suas proporções
  • Um piso plano, duro e limpo, sem negociação

Explore o grafo

Onde este simulador é usado

Os projetos, caminhos de aprendizagem e tutoriais que se apoiam neste laboratório.

Continue construindo

Baixar recursos

Use estas referências da página enquanto trabalha no projeto. Pacotes de projeto para download serão adicionados somente depois que seu código-fonte e sua versão forem publicados.

Dúvidas comuns

Perguntas frequentes

Por que meu robô Mecanum gira quando peço que ele se desloque lateralmente?

Quase sempre uma roda está no canto errado. Um conjunto Mecanum tem duas rodas com mão esquerda e duas com mão direita, e essa orientação precisa alternar ao redor do chassi. Coloque uma no lugar errado e seu vetor de força atravessa o deslocamento lateral em vez de somar-se a ele; portanto, um comando lateral vira uma curva lenta com rotação. Para frente ainda parece bom, e é isso que torna o problema tão confuso. Carregue a predefinição com uma roda montada ao contrário: um quadrado que fechava a 17 mm termina a mais de um metro de distância e com dezenas de graus de rotação, sem nenhuma mudança de código. O número em que se pode confiar ali é a discrepância entre encoders, que vai de 0,000 para cerca de 0,28 — um robô derrapando em todas as rodas forma um sistema de adesão-deslizamento, portanto exatamente onde ele para não é uma previsão, nem na bancada nem aqui. A verificação de cinco segundos em um robô real: fique acima dele, olhe diretamente para baixo e acompanhe os roletes que você vê no topo de cada roda — essas quatro linhas devem apontar para o centro e formar um X.

Por que meu robô Mecanum é mais lento na diagonal?

Porque um comando a 45 graus pede tudo a duas rodas e nada às outras duas. Defina a manobra como corrida diagonal e observe o gráfico de velocidade das rodas: dois traços ficam em zero enquanto dois estão no limite. Portanto, sua velocidade diagonal máxima é a velocidade máxima da roda dividida pela raiz de dois, cerca de 71% da velocidade em linha reta, e motores mais rápidos apenas deslocam esse limite. Isso é geometria, não um problema de ajuste.

Por que a odometria Mecanum é tão ruim?

Porque o encoder é preso à roda, e a roda não é o piso. Em uma base Mecanum, os roletes derrapam por projeto — é assim que o movimento lateral funciona — portanto cada milímetro que o piso recusa entra no encoder como deslocamento que o robô nunca fez. Carregue a predefinição gordurosa e faça o quadrado com deslocamento lateral: o robô termina a 225 mm do ponto de partida, sua própria estimativa por integração está 133 mm fora da posição real e 1,27 m de solo passaram sob as rodas sem mover o robô. Nada a bordo pode dizer isso. Pior, a verificação de resíduo que detecta uma roda derrapando fica silenciosa quando todas as quatro derrapam juntas, portanto o erro se acumula em completo silêncio. É por isso que construções Mecanum sérias adicionam uma IMU para orientação e rodas mortas sem alimentação para determinar a posição.

Devo escalar todo o comando ou recortar cada roda?

Escale o comando. Recortar cada motor com constrain() preserva a magnitude do comando e descarta a direção. Defina a manobra para dirigir enquanto gira, solicite no joystick 240 graus por segundo de rotação e mude o limitador: o escalonamento mantém a orientação comandada e desacelera todos os eixos juntos, enquanto o recorte mantém a velocidade para frente e descarta silenciosamente mais de um quarto da rotação. A armadilha é que, em uma diagonal pura, os dois limitadores produzem números idênticos, porque as rodas ociosas já estão dentro do limite — então o defeito passa no teste que todo mundo faz e aparece depois como um robô que se inclina para fora das curvas.

Um robô mais pesado tem melhor tração em rodas Mecanum?

Não para aceleração. Mais massa compra proporcionalmente mais atrito e proporcionalmente mais inércia, e eles se cancelam exatamente: o teto de aceleração é μ vezes g dividido pela raiz de dois, independentemente do peso do robô. Isso é o contrário de um robô de sumô, no qual o peso é toda a estratégia, porque ali a carga que está sendo empurrada é externa. Lastro em uma base Mecanum não compra nada além de uma resposta de motor mais lenta e uma bateria mais fraca.

É isso que um robô Mecanum real faz?

A cinemática é exata — a mesma matriz de quatro linhas que qualquer implementação real usa — e a odometria é sua inversa por mínimos quadrados. A dinâmica resolve um balanço de forças real a cada passo, com dois limites em ordem, o do motor e o do piso, e a derrapagem é o excedente recusado, e não algo roteirizado. O que ela não modela é o contato rolete a rolete conforme cada rolete entra e sai do chão, a pequena ondulação vertical que isso causa ou a transferência de peso sob aceleração. Portanto, ela acerta as respostas de engenharia — as penalidades da raiz de dois, para onde a odometria vai, o que uma roda invertida faz — e funciona um pouco mais suavemente que um robô real em um piso real. Uma ressalva honesta: quando todas as rodas estão derrapando, o modelo é um sistema de Coulomb com adesão-deslizamento, e a pose final exata deixa de ser um número repetível, embora o laboratório em si seja perfeitamente determinístico. A distância de derrapagem, o resíduo do encoder e todos os casos com aderência são sólidos; uma execução totalmente derrapando informa o tamanho do problema, não onde o robô vai parar.

Leitura complementar

Referências

Fontes confiáveis para ir além do modelo educacional limitado deste simulador.