Simulador interativoIntermediário

Simulador de seguimento de caminho: pure pursuit e Stanley

Compare pure pursuit e Stanley com atraso real do esterço. Arraste a distância de antecipação e veja a trajetória recalculada, incluindo o custo do GPS a 1 Hz.

Categoria
Robôs autônomos
Tempo
20–40 min
Plataforma
Navegador · Arduino · Raspberry Pi
Esquema técnico de Simulador de seguimento de caminho: pure pursuit e StanleyLOOKAHEADGOAL POINTCOMMANDED PATH

01 / Comece aqui

Introdução

Um planejador fornece um caminho; nada nele diz o que as rodas devem fazer. Este laboratório é o degrau que falta. Pure pursuit e Stanley conduzem o mesmo trajeto de pontos de referência com uma resposta de esterço de primeira ordem e atraso de medição, porque um modelo sem atraso faz o ajuste errado parecer ideal. Arraste um ponto de referência ou a distância de antecipação e toda a execução será recalculada.

Live lab / Path following

Path following simulator

Pure pursuit and Stanley steering the same course, with the lag a real robot has. Drag the lookahead and the whole run replots — too short oscillates, too long cuts corners, and the best value moves with speed.

Browser native
A top-down path-following lab. A robot follows a course of waypoints using the selected controller, and the route it actually drove is drawn against the route it was asked to drive. Use the controls below to run it and the keyboard hint to move the waypoints.
A plot of how far the robot was from the path, against distance along the path. Corners appear as spikes; a lookahead that is too short appears as jitter everywhere.

The dashed line with dots is the course you asked for; the solid line is where the robot went. The faint line is the whole run at the current settings, computed the moment you change one. Below, cross-track error along the path — dotted verticals are corners. Drag a waypoint to rebuild the course.

  • Commanded path
  • Driven
  • Full run preview
  • GPS fix
Simulation

Ready. The faint line is the whole run at these settings — press Start to drive it.

RMS error
—
Worst error
—
Corner cut
—
Steering effort
—
Progress
0%
Lap time
—

Keyboard: focus the course, then Space to run/pause, N to step, R to reset, C for a new course, F for full screen. Press 1–8 to pick a waypoint and the arrow keys to move it.

Controles

Controlador alterna entre pure pursuit e Stanley. Distância de antecipação é o único ajuste do pure pursuit e fica desativada para Stanley, que não usa essa distância — isso já é o ponto.

Velocidade e a distância de antecipação interagem, e é isso que vale a pena experimentar: defina 1 m/s e encontre a melhor distância de antecipação; depois defina 3 m/s e encontre-a novamente.

Fonte de posição troca a odometria perfeita por uma correção de 1 Hz com ruído na escala de metros, mantida entre atualizações. O erro é sempre pontuado contra a posição verdadeira, portanto a penalidade é real, não oculta.

Arraste qualquer ponto de referência, ou pressione 1–8 para selecionar um e movê-lo com as setas. Toda a execução é recalculada enquanto você arrasta.

Teoria

Ambos os controladores respondem à mesma pergunta — dado onde estou e onde está o caminho, qual ângulo de direção? — mas respondem de formas completamente diferentes.

Pure pursuit é geometria. Encontre o ponto no caminho à frente, a uma distância de antecipação L, e conduza o arco circular que passa por ele:

κ = 2y / L_d²          δ = atan(2 b sin α / L_d)

com y sendo o deslocamento lateral do ponto-alvo no referencial do robô e b a distância entre eixos. Há um parâmetro, e ele é uma distância, não um ganho — portanto ele é transferível entre robôs.

Stanley é controle. Tome o eixo dianteiro como referência e some dois termos:

δ = θ_e + atan(k · e / v)

Erro de orientação mais uma arcotangente do erro transversal. Dividir pela velocidade é o que permite que um único ganho funcione em uma faixa de velocidades. k é um verdadeiro ganho de controle e não é transferível.

O laboratório acrescenta o que as derivações de livros didáticos deixam de fora: 0,4 s de atraso total, como uma resposta de esterço de primeira ordem de 0,25 s mais atraso de medição e computação de 0,15 s. Sem ele, pure pursuit melhora monotonicamente à medida que a distância de antecipação diminui e toda a questão do ajuste desaparece.

Algoritmo

A cada passo, para ambos os controladores:

  1. Projete sobre o caminho, procurando uma janela ao redor do comprimento de arco alcançado mais recentemente, em vez de todo o caminho. Uma busca global escolhe o segmento mais próximo, portanto um trajeto que passa sobre si mesmo faz o progresso do robô saltar para um canto que ele passou há um minuto.
  2. Resolva um empate em um vértice para o segmento de saída. Depois de uma esquina, os dois segmentos adjacentes se projetam no mesmo ponto à mesma distância; manter o segmento de entrada entrega ao controlador um erro de orientação e um deslocamento lateral próximos de zero enquanto ele segue em frente e sai do caminho, sem que o controlador perceba.
  3. Calcule o ângulo de direção pela regra do próprio controlador e limite-o ao limite mecânico.
  4. Aplique o atraso e integre o modelo de bicicleta.
  5. Pontue contra a posição verdadeira, nunca contra a estimativa.

O passo 2 não é uma otimização. Foi a diferença entre Stanley funcionar e Stanley deixar o trajeto sem perceber o problema em exatamente 78% de todas as execuções.

Código-fonte

Pure pursuit, completo, na forma que assume em um robô real:

float lastS = 0;   // arc length last reached — state, and it only moves forward

float pursue(float x, float y, float heading, float speed) {
  // The lookahead is scheduled on speed, with a hard floor: at a standstill a
  // proportional schedule asks for zero, which is a division by zero in disguise.
  float lookahead = constrain(0.7f * speed + 0.4f, 0.4f, 3.0f);

  float s = projectOntoPath(x, y, lastS);      // windowed around lastS
  lastS = max(lastS, s);
  Point goal = pointAtArcLength(lastS + lookahead);

  float dx = goal.x - x, dy = goal.y - y;
  float lateral = -sinf(heading) * dx + cosf(heading) * dy;
  float ld = max(0.3f, hypotf(dx, dy));        // clamp, or curvature blows up

  float curvature = 2.0f * lateral / (ld * ld);
  return curvature;                            // omega = v * curvature
}

As três linhas que importam são o limite mínimo do agendamento, a monotonicidade de lastS e o limite de ld. Todo o resto é a fórmula.

Premissas e diferenças do hardware

O laboratório dá ao robô um mapa perfeito do caminho, uma distância entre eixos perfeitamente conhecida, nenhuma derrapagem nas rodas e um atraso modelado de forma limpa como um sistema de primeira ordem. Um robô real não tem nada disso.

Derrapagem das rodas torna a estimativa de posição errada de uma forma que nenhum controlador consegue detectar. Folga da caixa de engrenagens adiciona perda de curso a cada reversão do esterço, o que se comporta como atraso adicional e aumenta a distância de antecipação ótima. E um acionamento diferencial não tem ângulo de direção algum — tem uma taxa de rotação comandada, portanto ω = v κ substitui o atan e a distância entre eixos só importa para determinar até que ponto ele consegue virar.

O que sobrevive a tudo isso é a forma: um ótimo interno que cresce com a velocidade e um erro nesse ótimo que também cresce com a velocidade.

Diagrama do circuito

O controlador é a parte barata; o restante do robô, do qual ele precisa, é a parte cara.

Posição. Encoders em quadratura em ambas as rodas e odometria de acionamento diferencial integrando-os, na taxa do laço. Em ambientes internos isso basta para algumas dezenas de metros.

Orientação. Um giroscópio para o curto prazo, um magnetômetro para a referência absoluta, ou ambos. O erro de orientação é o termo que recebe mais peso nos dois controladores, e é o primeiro que a odometria perde.

Uma correção absoluta, ao ar livre. Um módulo GPS fundido à estimativa, em vez de segui-lo diretamente — a diferença é 0,09 m de erro RMS contra 1,25 m.

Para a teoria completa, consulte pure pursuit e erro transversal; para construir, o rover GPS com pontos de referência começa em ambientes internos com encoders e só sai para o ar livre depois que o controlador de seguimento funcionar.

Lista de verificação de hardware

Componentes

  • Uma base cujos comandos de ângulo de direção ou de velocidade das rodas você possa controlar diretamente
  • Uma estimativa de posição — no mínimo encoders, fundidos com GPS ao ar livre
  • Uma referência de orientação que não derive ao longo de uma missão
  • Um laço rápido o suficiente para que seu próprio atraso seja menor que a distância de antecipaçã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 uma distância de antecipação menor nem sempre acompanha melhor?

Em um modelo sem atraso, uma distância de antecipação menor acompanha melhor, e é exatamente por isso que muitas derivações de livros didáticos são enganosas. Robôs reais levam tempo para atingir o ângulo de direção comandado e agem sobre uma pose que já tem dezenas de milissegundos. Este laboratório modela uma constante de tempo de resposta de 0,25 segundo e 0,15 segundo de atraso de medição. Com esse atraso presente, a curva de erro adquire forma de U: uma distância de antecipação curta comanda uma correção que chega depois de o robô já ter passado do erro, de modo que o comando seguinte corrige demais. Um controlador mais rápido que seu próprio atuador oscila.

Como escolho a distância de antecipação para meu robô?

Meça seu atraso total de controle, multiplique pela velocidade e comece entre uma e duas vezes essa distância. Neste laboratório o atraso é de 0,4 segundo, e os ótimos medidos vão de 0,9 metro a 1 m/s até 1,4 metro a 3 m/s — entre 1,2 e 2,3 vezes a distância percorrida durante o atraso. Observe que o ótimo cresce com a velocidade, mas em uma proporção menor; portanto, um tempo fixo de deslocamento é próximo, mas não correto. Implemente-o como uma pequena relação linear em função da velocidade, com um mínimo fixo, porque na parada essa relação daria zero.

Qual é melhor, pure pursuit ou Stanley?

Eles falham de maneiras diferentes, e essa é a resposta útil. Nesse trajeto a 2 m/s, pure pursuit corta os cantos e termina 0,8 por cento mais curto que o comprimento de caminho comandado; Stanley não sai da linha, abre um arco maior e percorre 2,2 por cento a mais. Stanley mantém uma linha mais apertada onde importa, mas gasta 18,5 radianos de movimento de esterço contra 4,3 do pure pursuit — quatro vezes mais movimento do atuador, corrente e raspagem dos pneus. Use pure pursuit quando o caminho for apenas uma sugestão e Stanley quando ele for uma restrição.

Por que o erro é medido contra a posição verdadeira, e não contra a estimativa?

Porque um robô que pensa estar no caminho relata erro zero por construção. Troque a fonte de posição para GPS e o controlador começa a dirigir com uma leitura ruidosa e com um segundo de atraso, enquanto o laboratório continua pontuando contra a pose que o modelo realmente integrou. Essa é a única razão pela qual a penalidade do GPS aparece como número: 0,09 m de erro RMS torna-se 1,25 m, e o esforço de esterço mais que quadruplica.

O que mostra a linha tênue?

A execução completa com as configurações atuais, calculada no momento em que você altera uma configuração. Cada movimento de um controle recalcula todo o trajeto sem renderizar em cerca de vinte milissegundos, portanto arrastar a distância de antecipação mostra a trajetória que ela produz, em vez de apenas uma promessa sobre ela. A linha grossa é o robô animado nessa mesma execução quando você pressiona Iniciar.

Por que o robô nunca para de virar no canto muito agudo?

Ambos os controladores têm um raio mínimo de curva definido pela distância entre eixos e pelo ângulo máximo de esterço, e um canto mais agudo que isso não pode ser seguido, qualquer que seja o ajuste. As soluções de verdade são anteriores: suavize o caminho com um arredondamento ou um arco, ou diminua a velocidade na curva, que é para isso que serve um perfil de movimento. Nenhum controlador de direção pode fazer o veículo percorrer uma trajetória que sua geometria não permite.

Leitura complementar

Referências

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