Simulador interativoIntermediário

Simulador de caminhos de cobertura para robôs aspiradores

Compare a cobertura aleatória, a espiral e a varredura boustrophedon em um laboratório no navegador que mede cada estratégia contra uma varredura perfeita.

Categoria
Robôs autônomos
Tempo
20–40 min
Plataforma
Navegador · Arduino · Raspberry Pi
Esquema técnico de Simulador de caminhos de cobertura para robôs aspiradoresBRUSHSERPENTINE COVERAGE PATH

01 / Comece aqui

Introdução

Cobrir um piso não é o mesmo que chegar a algum lugar. Um planejador de caminho encontra uma rota até um objetivo; um planejador de cobertura precisa tocar em todos os quadrados alcançáveis. A medida honesta é a distância percorrida por metro quadrado limpo. Este laboratório compara cobertura aleatória, espiral em expansão e varredura serpenteante planejada na mesma sala com o melhor resultado teórico.

Live lab / Coverage path planning

Coverage path planning simulator

Three ways to cover a floor — random bounce, expanding spiral, and a planned boustrophedon sweep — measured against the one number that matters: the distance a perfect robot would need.

Browser native
A top-down coverage lab. A robot sweeps a room containing four pieces of furniture using the selected strategy, shading each patch of floor as its brush passes over it. Use the controls below to run it, and the keyboard hint to move the furniture.
A plot of floor covered against distance travelled. The straight dashed line is a perfect systematic sweep; the curved dashed line is the theoretical result for random sweeping, one minus e to the minus d over optimal; the solid line is the run happening above.

Shaded floor is covered. The thin line is where the robot has driven, the circle is its brush. Below, the same run plotted as coverage against distance — the dashed straight line is a perfect sweep, the dashed curve is the theory for random sweeping. Drag furniture to rebuild the room.

  • Covered floor
  • Furniture (drag it)
  • Path driven
  • Perfect sweep
Simulation

Ready. Press Start to sweep the room, or Step to advance one move.

Covered
0%
Distance
0.00× optimal
Half the floor
—
90% covered
—
99% covered
—
Bumps
0

Keyboard: focus the room, then Space to run/pause, N to step, R to reset, M for a new room, F for full screen. Press 1–4 to pick a piece of furniture and the arrow keys to move it.

Controles

Estratégia alterna entre as três. A sala é reconstruída e a execução reinicia imediatamente, porque um resultado de cobertura só faz sentido quando comparado à sala em que foi medido.

Arraste qualquer móvel com o ponteiro ou pressione 1–4 para selecionar um e movê-lo com as setas. A execução reinicia enquanto você arrasta. Coloque uma mesa no meio do piso e veja a distância da varredura planejada aumentar enquanto sua cobertura diminui.

Nova sala espalha os móveis novamente. Velocidade de execução troca suavidade por paciência — a estratégia aleatória precisa de vários milhares de movimentos para terminar, então comece na velocidade rápida.

Teoria

Um planejador de caminho responde como eu chego lá. Um planejador de cobertura responde como eu toco em tudo isso, e os dois quase não têm nada em comum.

A única régua honesta é a distância que um robô perfeito precisaria percorrer. Com um piso de área A e uma escova de largura w, varrer cada quadrado uma vez e nunca repetir leva:

d_optimal = A / w

Tudo o que o laboratório relata é um múltiplo desse número. Uma estratégia em 1,2× gasta 20% do tempo de operação passando por piso que já fez; uma em 8× gasta sete oitavos dele.

A cobertura aleatória tem uma expressão fechada, e ela não é animadora. Um robô sem mapa cobre piso novo na proporção do que ainda está descoberto, portanto a área não coberta decai exponencialmente:

covered(d) ≈ 1 − e^(−d / d_optimal)

Essa é a curva tracejada no gráfico. Leia três pontos: 63% do piso após uma distância ideal, 90% após 2,3 e 99% após 4,6. O último décimo da sala custa o dobro dos três primeiros quartos — o problema do coletor de cupons, usando uma escova.

A cobertura sistemática é linear, portanto termina em 1× mais a sobrecarga que o espaçamento das faixas e as curvas causam. Neste laboratório, essa sobrecarga é de cerca de 35%.

As execuções medidas ficam próximas da teoria e, quando se afastam, se afastam na direção esperada: um passeio aleatório real revisita o piso próximo em vez de se teletransportar, portanto fica um pouco pior do que a curva de amostragem independente sugere.

Algoritmo

Cobertura aleatória. Siga em frente. Quando uma microchave de contato for acionada, escolha um novo rumo ao acaso e verifique se o caminho está livre. É tudo isso, e precisa de um bit de medição e nenhuma memória.

Espiral e depois reposicionamento. Vire por um ângulo inversamente proporcional à distância percorrida desde o centro, o que traça uma espiral em expansão. Quando uma microchave de contato for acionada, avance em linha reta por uma distância fixa e comece uma nova espiral. Excelente em piso aberto — uma espiral quase não tem sobreposição — e completamente inútil em uma sala cheia de móveis, onde cada espiral é interrompida após poucas voltas.

Varredura serpenteante planejada. Três etapas, e a segunda é aquela que as pessoas costumam pular:

  1. Inflar. Aumente cada obstáculo pelo raio do robô mais uma margem de segurança. O que sobra é a região onde o centro do robô pode passar.
  2. Recortar. Percorra o mapa inflado em faixas separadas por uma largura de escova. Cada faixa se torna um ou mais trechos livres.
  3. Unir. Visite os trechos em ordem serpenteante e faça a rota entre trechos consecutivos com o caminho mais curto pelo espaço livre, para que o robô dirija ao redor do sofá, não para dentro dele.

A etapa 3 é onde vem a sobrecarga de distância, e é por isso que uma sala cheia de móveis penaliza mais um planejador do que uma sala vazia.

Código-fonte

A estratégia aleatória é a que vale ter primeiro em um robô real, porque funciona com a medição que você já tem:

// Random-bounce coverage. Two bump switches, no map, no encoders.
const uint8_t BUMP_L = 2, BUMP_R = 3;
const uint16_t CRUISE = 170;      // PWM
unsigned long turnUntil = 0;
int turnDir = 1;

void loop() {
  bool left  = digitalRead(BUMP_L) == LOW;   // switches are active-low with pull-ups
  bool right = digitalRead(BUMP_R) == LOW;

  if (millis() < turnUntil) {                 // still executing a bounce
    drive(turnDir * CRUISE, -turnDir * CRUISE);
    return;
  }

  if (left || right) {
    // Back off first — turning while wedged against a chair leg does nothing.
    reverseFor(320);
    // A random turn between 90 and 270 degrees. The randomness is what stops the
    // robot tracing the same closed loop around the room forever.
    turnDir = right ? -1 : 1;
    turnUntil = millis() + random(420, 1250);
    return;
  }

  drive(CRUISE, CRUISE);
}

O ângulo de desvio precisa ser aleatório. Uma reflexão fixa transforma a sala em uma mesa de bilhar, e uma bola de bilhar em uma mesa retangular percorre um caminho fechado que perde a maior parte da superfície para sempre.

A varredura planejada precisa das etapas inflar–recortar–unir apresentadas acima e de odometria suficientemente boa para manter uma faixa reta, o que exige uma categoria diferente de robô. Prototipe-a aqui, onde a posição é exata por construção, antes de decidir se seu hardware consegue executá-la.

Premissas e diferenças do hardware

O laboratório dá ao robô odometria perfeita, um mapa perfeitamente conhecido, giros instantâneos no lugar e uma escova que cobre um círculo limpo. Uma máquina real não tem nenhum desses recursos.

Derrapagem das rodas e deriva do giroscópio separam as faixas depois de cerca de dez delas, e é por isso que robôs comerciais se relocalizam usando paredes, referências do teto ou um farol. Os giros levam tempo que este laboratório não cobra em distância. E a escova não cobre um círculo — cobre um retângulo atrás do robô; portanto, dar ré sobre piso já coberto não limpa nada.

A diferença entre as estratégias sobrevive a tudo isso. Se um planejador superar a cobertura aleatória em 3× aqui, talvez a supere em 2× no hardware real; a ordem não muda.

Diagrama do circuito

O sensoriamento se divide claramente em três funções, e somente a primeira é obrigatória.

Contato. Duas microchaves de contato em um para-choque frontal com mola, conectadas em ativo baixo a pinos capazes de gerar interrupção, com os pull-ups internos ativados. Esse é o sensoriamento que torna possível a cobertura aleatória e é a última coisa a falhar.

Queda. Sensores de refletância voltados para baixo nos cantos da frente, lidos a cada passagem pelo controlador. Uma execução de cobertura visita todos os lugares, inclusive o topo das escadas — a aritmética de quanto o robô percorre depois da borda antes de poder parar é resolvida aqui.

Posição. Encoders em quadratura nas duas rodas e um giroscópio se você quiser faixas que permaneçam paralelas. Somente a estratégia planejada precisa disso, e essa necessidade é a principal razão pela qual as outras duas existem.

Para realizar as estratégias de cobertura em um projeto, veja o robô de cobertura de sala; para a camada reativa subjacente a todas elas, o simulador de desvio de obstáculos cobre limiares de parada e varredura.

Lista de verificação de hardware

Componentes

  • Uma base de acionamento diferencial cuja largura de escova você possa medir
  • Microchave de contato que permanece funcional quando o robô encosta nos móveis
  • Encoders, se o robô for planejar em vez de se deslocar ao acaso
  • Um sensor de queda, porque a cobertura alcança o topo das escadas

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 os robôs aspiradores baratos se movem aleatoriamente?

Porque a cobertura aleatória não precisa de mapa, encoders nem localização — toda a estratégia é seguir em frente e dar uma virada aleatória quando uma microchave de contato for acionada. Isso cabe em um microcontrolador de oito bits com duas microchaves de contato. O laboratório mostra o custo: a primeira metade do piso é coberta tão rápido quanto uma varredura planejada, mas 90 por cento exigem cerca de três vezes a distância ideal e 99 por cento exigem seis vezes ou mais. O robô chega lá no fim, e é por isso que a estratégia sobrevive — apenas gasta uma hora fazendo vinte minutos de trabalho.

Por que a cobertura é tão lenta no final e tão rápida no começo?

Porque um robô que varre sem mapa cobre piso novo na proporção do piso que ainda falta cobrir. No começo, quase tudo que ele percorre é novo; no fim, quase tudo é uma repetição. Isso dá a aproximação exponencial clássica, cobertura de aproximadamente um menos e elevado à potência de menos d dividido pela distância ótima, que o laboratório desenha como uma curva de referência tracejada. É a mesma matemática do problema do coletor de cupons e significa que o último décimo de uma sala custa mais que os três primeiros quartos.

Se a varredura sistemática é tão melhor, por que o laboratório a interrompe em 90 por cento?

Porque um planejador precisa manter o corpo do robô longe de tudo, então planeja um caminho que permanece a uma margem de cada parede e de cada perna de mesa — e nunca cobre aquilo que não consegue alcançar. Neste laboratório, 130 dos 133 quadrados que a varredura planejada perde estão a até duas células de uma parede ou de um móvel. É exatamente por isso que robôs aspiradores reais têm uma escova lateral que avança além do chassi e por isso fazem uma passagem separada pelas paredes. A cobertura aleatória eventualmente alcança essas bordas, apenas por sorte.

O que a varredura planejada precisa e a aleatória não?

Ela precisa saber onde está. Uma rota serpenteante só é viável se o robô conseguir seguir uma linha reta, virar um ângulo conhecido e dar um passo lateral de uma largura de escova — isso é odometria, e a odometria deriva. O laboratório planeja em um mapa perfeito com um robô perfeito, portanto trate os 1,35 vezes o resultado ótimo como o limite inferior do que uma máquina real alcança, e não como um objetivo. Adicione derrapagem das rodas e deriva do giroscópio, e as faixas deixam de ser paralelas depois de cerca de dez delas.

Qual deve ser a largura das faixas?

Uma largura de escova, menos uma sobreposição escolhida deliberadamente. Espaçar as faixas exatamente uma largura deixa uma região sem limpeza entre elas com qualquer pequeno erro de direção, e nenhuma passagem posterior encontrará essa região. Com 10 a 20 por cento de sobreposição, as faixas se fecham ao custo da mesma porcentagem em distância. O laboratório espaça as faixas pelo maior número inteiro de células que a escova cobre, e é por isso que a distância resulta em 1,35 vezes o resultado ótimo, e não 1,0 — a sobrecarga é real e todo robô de cobertura paga alguma versão dela.

Isso se aplica a algo além de aspiradores?

É o mesmo problema para um robô cortador de grama, um limpador de piscina, um esfregão, um pulverizador de culturas e um drone de levantamento. Todos têm uma largura de trabalho, uma região para cobrir e um orçamento de energia que torna a distância a quantidade a minimizar. As estratégias diferem principalmente em se a máquina pode pagar pelo sensoriamento necessário para saber onde está — um drone de levantamento tem GPS e sempre planeja; um limpador de piscina não tem nada e se desloca aleatoriamente.

Leitura complementar

Referências

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