Simulador de robô seguidor de linha no navegador
Construa um robô seguidor de linha virtual, visualize seus sensores e ajuste um controlador PID com um simulador de robótica interativo baseado no navegador.
- Categoria
- Arduino
- Tempo
- 45–90 min
- Plataforma
- Navegador · Arduino
01 / Comece aqui
Introdução
Um robô seguidor de linha transforma leituras de sensores em correções de direção. Este projeto permite desenhar uma pista, alterar a geometria do robô e dos sensores e observar um controlador PID determinístico responder em tempo real. Use-o para conectar a teoria de controle ao comportamento que você veria em um robô Arduino em uma pista física.
Live lab / Deterministic 60 Hz model
Line follower simulator
Run the starter track, tune the controller, or pause and draw a course of your own.
Bright nodes are sensors currently detecting the track. The lavender heading line shows steering output. Drawing pauses the robot automatically.
- Elapsed
- 0.0 s
- Distance
- 0 units
- Line error
- 0.000
- Steering
- 0.000
- Track contact
- 100%
Keyboard: focus the course, then use Space to run/pause, N to step, R to reset, D to draw, and F for full screen.
Controles
Use as predefinições de pista para estabelecer uma linha de base, ou pause a execução e desenhe diretamente no percurso. Os controles de velocidade do robô determinam quanto o chassi avança por atualização. A quantidade e o espaçamento dos sensores alteram o campo de visão. Os controles de ganho P, I e D mudam a resposta de direção; Passo avança uma atualização determinística enquanto a execução está pausada.
Comece com velocidade moderada, cinco sensores e os ganhos padrão. Altere uma variável por vez e compare as métricas de erro, tempo de volta e tempo na pista.
Teoria
A barra de sensores amostra a refletância na frente do robô. Cada sensor ativo contribui com sua posição relativa com sinal para uma média ponderada. O centro da barra corresponde a erro zero; leituras à esquerda ou à direita do centro produzem erro negativo ou positivo.
O controlador combina três termos:
$$u(t) = K_p e(t) + K_i \int e(t)dt + K_d \frac{de(t)}{dt}$$
A correção $u(t)$ acelera uma roda e desacelera a outra. O controle proporcional reage ao desvio atual, o integral corrige o viés persistente e o derivativo amortece mudanças rápidas.
Algoritmo
- Amostre todos os sensores em intervalos fixos.
- Calcule uma posição ponderada da linha e normalize-a em torno do centro.
- Reutilize a última direção observada da linha quando todos os sensores perderem a pista.
- Atualize os termos integral e derivativo usando o mesmo passo de tempo fixo.
- Limite a correção, calcule os comandos dos motores esquerdo e direito e integre a pose do robô.
Ajuste o ganho proporcional até o robô acompanhar curvas suaves, aumente o ganho derivativo até a oscilação se estabilizar e introduza apenas ganho integral suficiente para remover um erro constante e reproduzível.
Código-fonte
O simulador no navegador e um microcontrolador usam a mesma forma de controle. Um laço compacto no estilo do Arduino parece assim:
float integral = 0.0f;
float previousError = 0.0f;
void controlStep(float dt) {
float error = readWeightedLinePosition();
integral = constrain(integral + error * dt, -2.0f, 2.0f);
float derivative = (error - previousError) / dt;
float correction = kp * error + ki * integral + kd * derivative;
setMotorSpeeds(baseSpeed - correction, baseSpeed + correction);
previousError = error;
}
Mantenha o intervalo real de controle estável. Um atraso variável altera os termos derivativo e integral mesmo quando os ganhos não mudam.
Premissas e diferenças do hardware
Este é um modelo didático, não uma réplica do hardware. A pista é uma máscara binária plana e de alto contraste, sem variação de luz ambiente, portanto a barra de sensores vê preto e branco perfeitos — em fita real, iluminação da sala, brilho da superfície e altura dos sensores alteram as leituras e você precisa calibrar seguindo os passos das notas de fiação. A temporização é ideal: o controlador roda em intervalos fixos, sem variação do intervalo de execução causada por delay(), enquanto um laço físico de Arduino varia conforme outras tarefas, e essa variação altera a resposta do PID. O chassi é cinemático: as rodas nunca derrapam, os motores respondem instantaneamente e a bateria nunca perde tensão. Considere os ganhos encontrados aqui um ponto de partida próximo e reajuste no robô real depois da calibração.
Diagrama do circuito
Conecte as saídas dos sensores a entradas compatíveis com sinais analógicos, compartilhe o terra entre todos os módulos e acione os motores por uma ponte H, nunca diretamente pelos pinos do controlador.
Verifique a tensão nominal da alimentação dos motores e adicione desacoplamento local próximo ao controlador e ao driver. Nunca encaminhe a corrente dos motores pelo regulador lógico da placa de desenvolvimento.
Experimentos guiados
Cada um isola uma variável — o que é especialmente difícil no hardware real, onde tudo muda de uma vez.
1. Encontre o ganho crítico e depois divida-o por dois
Defina os ganhos integral e derivativo como zero e aumente o ganho proporcional até o robô oscilar de forma constante em um trecho reto — serpenteando com amplitude constante, em vez de crescer ou diminuir. Divida esse valor por dois.
Agora você tem um Kp inicial derivado de uma medição, e não de um palpite, e ele estará próximo.
Aumente o ganho derivativo a partir daí até a oscilação ser amortecida.
2. Prove que os ganhos dependem da velocidade
Ajuste o robô até que ele acompanhe corretamente a uma velocidade base baixa. Agora aumente a velocidade pela metade e execute os mesmos ganhos sem mudar mais nada.
Ele vai oscilar, cortar cantos ou perder a linha. Nada mudou no controlador — mas a mesma correção de direção agora produz uma mudança maior de orientação por unidade de pista, portanto o ganho efetivo aumentou com a velocidade. Todo ajuste é um ajuste em uma velocidade específica, e é por isso que um robô de competição reduz a velocidade nos cantos em vez de usar o mesmo ganho em todo o percurso.
3. Veja a quantidade de sensores mudar o que é possível
Execute a mesma pista e os mesmos ganhos com três, cinco e oito sensores.
| Sensores | Sinal de posição | Efeito no ajuste |
|---|---|---|
| 3 | Grosseiro, essencialmente três regiões | Acompanha, mas não pode ser ajustado com precisão — o erro é quantizado |
| 5 | Suficientemente suave para direção proporcional | O ponto ideal usual |
| 8 | Fino | Permite ganhos maiores e maior velocidade antes de oscilar |
O resultado interessante é que mais sensores elevam o teto em vez de melhorar o piso. Em baixa velocidade, três sensores são suficientes. A resolução extra só começa a compensar nas velocidades em que o sinal de erro grosseiro se torna o fator limitante.
4. Quebre-o de propósito em um canto agudo
Aumente a velocidade até o robô perder a linha no canto mais fechado. Observe o que ele faz em seguida. Depois pense no que o robô real deveria fazer: seguir em frente é a pior opção, porque a linha estava se curvando para longe.
É esse o raciocínio por trás de manter o último erro quando a linha é perdida, em vez de zerá-lo — zero significa “centralizado”, o que comanda velocidade máxima em linha reta. Manter o último erro faz o robô continuar virando na direção em que já estava, que é para onde a linha foi.
O que observar
| Sintoma no gráfico | Causa | Correção |
|---|---|---|
| Serpenteio constante em retas | Kp alto demais ou Kd baixo demais |
Divida Kp e depois aumente Kd |
| Serpenteio que cresce | Kp acima do ganho crítico |
Reduza-o |
| Cortes amplos e lentos nos cantos | Velocidade alta demais para o avanço dos sensores | Diminua a velocidade ou mova a matriz para a frente |
| Esforço de controle irregular | Kd agindo sobre uma posição ruidosa |
Filtre ou reduza Kd |
| Acompanha sempre um pouco fora do centro | Calibração desigual por sensor | Normalize cada canal em relação à sua própria faixa |
| Perde a linha e segue em frente | Erro zerado ao perder a linha | Mantenha o último erro |
Aplicação em hardware
| Neste laboratório | Um robô real |
|---|---|
| Laço perfeitamente periódico | Varia, a menos que você meça dt; um delay() anula completamente o Kd |
| Calibração ideal | Precisa ser refeita a cada execução, na superfície real |
| Pista binária de alto contraste | Fita brilhante, poeira e infravermelho ambiente reduzem o contraste |
| Sem derrapagem das rodas | Derrapagem em alta velocidade e duas zonas mortas de motor diferentes |
| Motores respondem instantaneamente | As duas rodas começam a girar em ciclos de trabalho diferentes |
| Bateria constante | A tensão cai, portanto o mesmo ciclo de trabalho produz menos velocidade conforme a execução avança |
Os ganhos encontrados aqui são transferidos como um ponto de partida próximo, e o procedimento de ajuste é totalmente transferido. Espere reajustar na sua própria fita — e espere que a maior melhoria individual no hardware venha não dos ganhos, mas da frequência do controlador, pois uma primeira construção costuma rodar a 20–50 Hz e pode chegar a várias centenas de Hz apenas removendo chamadas bloqueantes. A construção completa está em construir um robô seguidor de linha.
Lista de verificação de hardware
Componentes
- Arduino Uno ou controlador compatível
- Três a nove sensores de refletância IR
- Dois motorredutores CC e rodas
- Driver de motor com ponte H dupla
- Bateria, chassi e rodízio
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 o robô oscila ao redor da linha?
A oscilação normalmente significa que o ganho proporcional está alto demais, o amortecimento derivativo está baixo demais ou o robô está se movendo mais rápido do que a taxa de atualização dos sensores consegue sustentar. Reduza a velocidade primeiro e depois ajuste P e D. Em um robô físico, um delay() longo no controlador é uma causa oculta frequente: o tempo morto que ele acrescenta torna o termo derivativo ineficaz, por mais alto que você o defina.
Quantos sensores um robô seguidor de linha deve usar?
Cinco sensores são um bom ponto de partida — revelam a direção e a magnitude do erro e mantêm o cálculo da posição ponderada da linha fácil de inspecionar. Três sensores funcionam em velocidades baixas, enquanto robôs de competição costumam usar oito para obter uma resolução de posição mais fina em alta velocidade.
Por que meu robô seguidor de linha perde a linha em curvas fechadas?
O chassi está se movendo mais rápido do que a barra de sensores consegue resolver a curva, portanto a linha deixa a matriz antes de o controlador reagir. Reduza a velocidade, alargue a barra de sensores ou aumente a taxa de atualização. Um bom controlador também reutiliza a última direção conhecida da linha quando todos os sensores perdem a pista, para virar de volta em direção à linha em vez de seguir reto para fora.
Devo usar sensores IR analógicos ou digitais para seguir linha?
Sensores de refletância analógicos informam um valor contínuo, o que permite calcular uma posição ponderada da linha de forma suave e dirigir proporcionalmente. Sensores digitais só informam ligado ou desligado depois de um limiar interno, o que é mais simples, mas fornece uma informação de posição mais grosseira. Este simulador modela a abordagem analógica com posição ponderada da linha.
Como calibro a matriz de sensores IR?
Antes de uma execução, passe os sensores pela linha e pelo fundo e registre a leitura mínima e máxima de cada sensor; depois normalize as leituras ao vivo em relação a essa faixa. A calibração importa porque a altura dos sensores, a refletividade da superfície e a luz ambiente alteram os valores brutos, e uma matriz sem calibração enviesará a posição ponderada da linha.
Quais são bons valores iniciais de PID para um robô seguidor de linha com Arduino?
Trate os ganhos publicados como ponto de partida, não como resposta para copiar e colar: a resposta dos motores, a altura dos sensores, a tensão da bateria, a refletividade da superfície e a temporização do controlador mudam os ganhos de que um robô físico precisa. Comece apenas com o proporcional, aumente-o até o robô acompanhar curvas suaves com uma leve oscilação e então aumente o ganho derivativo para remover a oscilação; use um ganho integral muito pequeno somente se restar um erro constante e reproduzível.
Leitura complementar
Referências
Fontes confiáveis para ir além do modelo educacional limitado deste simulador.