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
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.
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
- 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.
- Leia o joystick para obter o comando deste ponto da manobra.
- 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. - 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. - Limite — escale o vetor inteiro pelo fator determinado pela maior demanda de roda ou recorte cada roda individualmente.
- 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.
- 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.
- 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).
- 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.
- Integre a verdade a partir das forças que foram realmente aplicadas.
- 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.