Tutorial · Intermediário · 25 min
Erro transversal à trajetória: como avaliar o seguimento
Compare o erro transversal à trajetória entre Stanley e Pure pursuit, medi-lo com dados de referência e avaliar RMS, pior caso e ângulo de direção.
Um número com sinal
O erro transversal à trajetória é a distância perpendicular do robô à trajetória, com um sinal. Ele é positivo à esquerda do sentido de movimento e negativo à direita. Essa é toda a definição, e a única métrica honesta disponível para avaliar um controlador de seguimento de trajetória.
O sinal importa mais do que parece. Uma distância sem sinal informa apenas que o robô está 20 cm fora da trajetória; uma distância com sinal informa de qual lado ele está, informação necessária para qualquer controlador e que torna o gráfico do erro legível — um viés aparece como deslocamento, uma oscilação aparece como uma senoide e um canto aparece como um pico em uma direção conhecida.
Meça sem se enganar
Existem três armadilhas, na ordem em que as pessoas costumam cair nelas.
Não meça contra a estimativa. Se o robô acredita estar na trajetória, o erro que ele próprio informa é zero por construção. O erro transversal à trajetória deve ser avaliado contra a verdade de campo — uma trena, uma estação total, um sistema de captura de movimento ou, em simulação, a pose verdadeira obtida pela integração do modelo. No simulador de seguimento de trajetória, o controlador recebe uma posição possivelmente ruidosa, mas o erro é sempre calculado a partir da verdade de campo; essa é a única razão pela qual a penalidade do GPS aparece como um número.
Tome o sinal do referencial da trajetória, não de um teste de produto vetorial. A implementação natural é determinar de que lado do segmento atual o robô está. Esse sinal muda de forma descontínua quando a projeção cruza um ponto de passagem e, com qualquer atraso dos atuadores, o comando oscila em toda a amplitude enquanto as rodas mal se movem — comportamento que parece exatamente o de um controlador quebrado. Projete o robô na trajetória e use a componente lateral no próprio referencial dela:
float h = pathHeadingAt(s); // tangent direction there
float e = -(x - px) * sinf(h) + (y - py) * cosf(h); // + is left of travel
Procure perto de onde você estava, não em todo lugar. Uma busca global pelo ponto mais próximo em uma trajetória que dobra sobre si mesma pode acabar selecionando um segmento percorrido um minuto antes. Mantenha o último comprimento de arco e procure em uma janela ao redor dele — alguns metros para trás e o suficiente à frente para cobrir a distância de antecipação.
Há uma quarta armadilha, mais sutil, que já me custou um controlador funcional: em um canto, os dois segmentos adjacentes são projetados no mesmo vértice à mesma distância. Se você mantiver o segmento de entrada, o erro de orientação e o deslocamento lateral ficarão aproximadamente em zero; um controlador que usa essas duas grandezas para comandar a direção então sai da trajetória sem perceber. Resolva o empate a favor do segmento de saída.
RMS, pior caso e localização do erro
Informe três números, porque cada um oculta algo que os outros mostram.
- O erro RMS é a média representativa. É a métrica usada no ajuste.
- O pior caso é o que determina se o robô cabe no corredor. Um RMS de 0,12 m com pico de 0,50 m representa uma máquina diferente de um RMS de 0,12 m com pico de 0,15 m.
- O erro em relação à distância medida ao longo da trajetória mostra onde ele ocorre. Esse gráfico indica se você tem um problema de ajuste ou de geometria.
O terceiro número é o motivo de o simulador desenhá-lo. Uma distância de antecipação curta produz oscilações ao longo de toda a trajetória; uma longa fica limpa nas retas e só apresenta picos nos cantos. O RMS pode ser idêntico.
Dois controladores, duas formas de falha
O Pure pursuit mira um ponto à frente e percorre o arco que passa por ele. Stanley — o controlador que venceu o DARPA Grand Challenge de 2005 — usa o eixo dianteiro como referência e comanda a direção pela soma de dois termos:
δ = θ_e + atan(k · e / v)
O primeiro termo alinha o robô com a direção da trajetória. O segundo transforma o erro transversal à trajetória em um ângulo de direção, e a divisão pela velocidade faz o mesmo ganho se comportar da mesma forma a 1 m/s e a 10 m/s.
Medido na mesma trajetória a 2 m/s:
| RMS | Pior caso | Comprimento da trajetória percorrida | Ângulo total de direção | |
|---|---|---|---|---|
| Pure pursuit | 0,12 m | 0,50 m | 0,8% menor | 4,3 rad |
| Stanley | 0,17 m | 0,87 m | 2,2% maior | 18,5 rad |
O sinal da terceira coluna resume toda a história. O Pure pursuit corta a parte interna da curva e chega ao destino antes; Stanley permanece na trajetória, ultrapassa o canto e retorna — percorre, portanto, mais distância do que a trajetória recebida.
O ângulo total de direção é o número que as pessoas esquecem. Quatro vezes mais movimento do atuador significa quatro vezes mais desgaste no servo, quatro vezes mais corrente e, em um acionamento diferencial, quatro vezes mais escorregamento das rodas. Stanley não é gratuito.
Escolhendo
Pure pursuit quando a trajetória é apenas uma sugestão. Varreduras de cobertura, missões com pontos de passagem e qualquer ambiente externo em que cortar meio metro na curva não importa. Ele tem um único parâmetro geométrico, degrada bem e ocupa cerca de doze linhas.
Stanley quando a trajetória é uma restrição. Uma faixa, uma fileira de plantas ou um corredor com paredes. Ele mantém a linha e não corta, ao custo de um maior ângulo total de direção e de um ganho que realmente precisa de ajuste — a distância de antecipação é geométrica e pode ser transferida entre robôs; k é um ganho de controle e não pode.
Nenhum dos dois, sozinho, em baixa velocidade. Ambos dividem por — ou multiplicam pela — velocidade. Abaixo de aproximadamente 0,3 m/s, é melhor que um robô de acionamento diferencial gire no lugar até o rumo desejado e depois avance, algo que nenhum dos dois controladores expressa.
Quando dá errado
| Sintoma | Causa provável |
|---|---|
| O erro informado está sempre próximo de zero | Medição contra a estimativa, em vez da verdade de campo |
| O comando oscila em cada ponto de passagem | Sinal obtido de um teste de produto vetorial que muda no vértice |
| Sai com confiança da trajetória depois de um canto | Empate do vértice resolvido a favor do segmento de entrada — a opção que oculta a falha |
| O erro salta para um valor enorme e se recupera | A busca global pelo ponto mais próximo encontrou um segmento distante |
| O RMS parece bom, mas o robô encosta em uma parede | Informe também o pior caso; o RMS esconde picos isolados |
| Stanley oscila nas retas | k alto demais para a velocidade e o atraso; é um ganho, não um parâmetro geométrico |
| Os dois controladores derivam juntos | O problema está antes deles — na estimativa de posição, não no comando de direção |
Execute os dois na mesma trajetória no simulador de seguimento de trajetória e depois siga o roteiro de seguimento de trajetória desde a odometria até um robô que executa uma missão por conta própria.
Explore o grafo
Faz parte destas montagens
Projetos e caminhos de aprendizagem que incluem este tutorial.
Leitura complementar