Tutorial · Iniciante · 17 min de leitura

Ruído, viés e filtragem de sensores em robótica

Entenda sensores ruidosos em robôs: a diferença entre ruído, viés e deriva, como escolher um filtro, o atraso que a filtragem adiciona e quando a fusão ajuda.

Todo robô age com base em medições ruidosas, atrasadas, enviesadas e às vezes ausentes. Tratar uma leitura bruta como verdade é a forma mais rápida de criar um robô com comportamento imprevisível. Este guia aborda o vocabulário e as compensações necessárias antes de confiar em um sensor. Experimente cada efeito no simulador de sensores do robô.

Ruído, viés e deriva são problemas diferentes

  • Ruído varia aleatoriamente de uma amostra para outra. A média e a filtragem reduzem o ruído.
  • Viés é um deslocamento fixo em relação ao valor verdadeiro. A filtragem não o remove; você precisa medi-lo durante a calibração e subtraí-lo.
  • Deriva é um viés que muda lentamente ao longo do tempo, normalmente com a temperatura. Uma calibração feita na inicialização deixa de corresponder gradualmente à realidade, e é por isso que operações longas exigem recalibração periódica ou uma referência para correção.

Confundi-los leva à correção errada — filtrar mais nunca eliminará um viés.

Quatro traços plotados ao longo de vinte segundos de tempo em torno de um valor verdadeiro horizontal tracejado. Um traço ruidoso se dispersa amplamente acima e abaixo do valor verdadeiro, mas tem média igual a ele. Um traço de viés fica com um deslocamento constante acima do valor verdadeiro, com pouca dispersão. Um traço de deriva começa no valor verdadeiro e se afasta dele continuamente durante toda a medição.
Três falhas que todas parecem uma “leitura ruim” e exigem três correções diferentes. A média corrige apenas a primeira. Baixar SVG

Escolhendo um filtro

Três filtros comuns cobrem a maioria dos casos:

  • Uma média móvel e uma passa-baixa exponencial suavizam o ruído aleatório, trocando rapidez de resposta por suavidade por meio da janela ou da constante de tempo.
  • Um filtro de mediana é melhor para remover picos e perdas de leitura ocasionais, porque poucas amostras ruins não alteram o valor central.

Escolha o filtro mais leve que atenda às necessidades de quem consome a medição — não aquele que produz o gráfico de aparência mais suave.

Filtragem sempre adiciona atraso

Todo filtro de suavização introduz atraso no sinal verdadeiro, e mais suavização significa mais atraso. Um filtro passa-baixa com uma constante de tempo longa rejeita mais ruído, mas acompanha as mudanças rápidas com mais atraso. Sempre represente a estimativa filtrada junto com as amostras brutas e o valor verdadeiro, para que o atraso fique visível antes de colocar o filtro em um ciclo de controle, onde pode causar instabilidade.

class LowPass:
    def __init__(self, alpha):
        self.alpha = alpha      # smaller alpha = smoother but more lag
        self.value = None
    def update(self, sample):
        if self.value is None:
            self.value = sample
        else:
            self.value += self.alpha * (sample - self.value)
        return self.value

O que a fusão de sensores pode e não pode fazer

A fusão combina vários sensores em uma estimativa e só ajuda quando eles contribuem com informações complementares e sua incerteza é representada de forma honesta. Combinar duas medições enviesadas não cria verdade. Um filtro complementar, por exemplo, confia em um sensor nas frequências altas e em outro nas baixas; um filtro de Kalman pondera cada fonte por sua incerteza. De qualquer forma, comece pela calibração, pelos carimbos de tempo e pelos frames de coordenadas compartilhados antes de fundir qualquer coisa.

Aplique carimbos de tempo

As amostras raramente chegam com um intervalo perfeitamente fixo, e tanto a filtragem quanto a fusão pressupõem que você sabe quando cada valor foi medido. Os carimbos de tempo permitem detectar variação de intervalo, alinhar dados de sensores diferentes e rejeitar leituras antigas. Registre os valores brutos ao lado dos processados para que falhas como recorte e perdas de leitura permaneçam reproduzíveis.

Meça o sensor antes de filtrá-lo

Escolher um filtro antes de saber como é o ruído equivale a adivinhar. Dez minutos de registro resolvem a questão, e o procedimento é o mesmo para qualquer sensor:

  1. Mantenha o sensor completamente imóvel diante de uma entrada conhecida e constante.
  2. Registre alguns milhares de amostras brutas com carimbos de tempo.
  3. Calcule a média e o desvio-padrão.
  4. Represente as amostras e também um histograma delas.

Esses quatro números e dois gráficos revelam qual das três falhas você tem:

O que você observa O que é A correção
A média corresponde à verdade e os valores se dispersam simetricamente Ruído Filtre-o
A média está deslocada em relação à verdade e a dispersão é pequena Viés Meça-o e subtraia — a filtragem nunca ajudará
A média se afasta ao longo de minutos Deriva Recalibre periodicamente ou corrija usando uma referência
Predominantemente valores próximos, com alguns valores extremos ocasionais Valores atípicos Mediana, não média
Os valores caem em degraus discretos Quantização Esperado; isso limita sua resolução

O histograma é a parte que as pessoas ignoram, e é a mais informativa. Ruído gaussiano produz um sino; valores atípicos produzem um sino com alguns pontos muito afastados nas caudas. Esses dois casos exigem filtros diferentes, e observar o gráfico de série temporal por mais tempo não os diferencia com tanta clareza.

Escolhendo um filtro, quantitativamente

Filtro Elimina ruído gaussiano Elimina valores atípicos Atraso Custo
Média móvel, N amostras Sim — por √N Não — espalha um pico por N amostras (N−1)/2 amostras Buffer de N amostras
Passa-baixa exponencial (EMA) Sim Não ≈ (1−α)/α amostras Um único valor de ponto flutuante
Mediana de N Parcialmente Completamente, até N/2 valores atípicos (N−1)/2 amostras Ordenação, trivial para N pequeno
Mediana e depois EMA Sim Sim Ambos Ambos

O √N da primeira linha é o número útil: a média de 4 amostras reduz o ruído à metade; a média de 100 amostras o reduz em dez, ao custo de 50 amostras de atraso. A redução de ruído tem retornos cada vez menores, e o atraso não tem, e é por isso que médias muito longas quase sempre são a resposta errada.

Para uma EMA, a constante de tempo se relaciona com α por:

tau = dt x (1 - alpha) / alpha

Assim, em um ciclo de 10 ms, α = 0,1 resulta em uma constante de tempo de 90 ms. É comum definir α por intuição e acabar com filtros muito mais lentos do que se percebe — calcule uma vez para saber exatamente o que você tem.

O atraso não é gratuito, e este é seu custo

Todo filtro de suavização atrasa o sinal e, dentro de um ciclo de controle, esse atraso é indistinguível de a planta responder mais lentamente. Ele reduz diretamente o ganho que o ciclo pode tolerar antes de oscilar.

Filtro Atraso em um ciclo de 10 ms Distância percorrida a 0,3 m/s
Mediana de 3 10 ms 3 mm
Mediana de 5 20 ms 6 mm
Média móvel de 10 45 ms 14 mm
EMA, α = 0,1 90 ms 27 mm
EMA, α = 0,02 490 ms 147 mm

Vale observar a última linha. Um α de 0,02 produz um gráfico belamente suave e meio segundo de atraso — o robô está usando uma leitura do obstáculo feita 15 cm antes, ao longo do percurso. Esta é a maneira mais comum de um filtro bem-intencionado piorar um robô, e ela é invisível a menos que você represente o resultado filtrado junto com os dados brutos e o valor verdadeiro.

Escolha o filtro mais leve que atenda ao requisito e sempre verifique o que o atraso custa nas unidades importantes para o robô — milímetros ou graus, não amostras.

Um filtro complementar e como escolher sua constante

O filtro complementar é a solução mais comum na robótica hobbista porque tem três linhas e resolve o problema real: dois sensores que falham de maneiras opostas.

// gyroRate in deg/s, accelAngle in degrees, dt in seconds.
angle = alpha * (angle + gyroRate * dt) + (1.0f - alpha) * accelAngle;

alpha define a frequência de cruzamento — acima dela você confia no giroscópio e abaixo dela, no acelerômetro:

tau = alpha x dt / (1 - alpha)          # constante de tempo do filtro, em segundos
f_crossover = 1 / (2 x pi x tau)        # Hz
α com dt = 5 ms Constante de tempo Cruzamento Comportamento
0.90 45 ms 3,5 Hz Muito responsivo, com ruído visível do acelerômetro
0.98 245 ms 0,65 Hz O padrão comum — um bom equilíbrio
0.995 1,0 s 0,16 Hz Muito suave, sofre deriva perceptível antes de corrigir
0.999 5,0 s 0,03 Hz Praticamente apenas o giroscópio em qualquer manobra curta

Escolha com base na física, não por intuição: a constante de tempo deve ser longa em comparação com a escala de tempo das perturbações que você quer rejeitar e curta em comparação com a escala de tempo na qual o erro do giroscópio se acumula. Um giroscópio com viés de 1 °/s atinge 1° de erro em um segundo, portanto uma constante de tempo de vários segundos permite que o erro real se acumule antes de o acelerômetro puxá-lo de volta.

Observe também que α depende de dt. Copiar um α de um projeto com uma frequência de ciclo diferente fornece um filtro diferente — uma fonte comum e invisível de “estes ganhos não funcionam para mim”.

O que a fusão não pode fazer

A fusão não é mágica, e vale declarar claramente três limites:

Ela não pode remover um viés compartilhado. Dois acelerômetros que indicam 2° a mais produzem uma estimação fundida que lê 2° a mais. A fusão explora erros independentes; um erro de modo comum sobrevive intacto.

Ela não pode criar informação que não existe. Nenhuma quantidade de filtragem dá a uma IMU de seis eixos uma orientação absoluta. A guinada não tem referência de gravidade, portanto sofre deriva, e somente um magnetômetro ou uma referência externa a corrige.

Ela não pode corrigir carimbos de tempo ruins. Fundir uma correção GPS de 10 Hz com um giroscópio de 200 Hz exige saber quando cada um foi medido, com precisão de uma fração do intervalo mais rápido. Uma correção desatualizada em 100 ms e tratada como atual corromperá ativamente uma estimativa que o giroscópio sozinho tinha correta.

Carimbos de tempo, na prática

“Aplique carimbos de tempo” é fácil de aceitar e fácil de ignorar. A versão prática é:

struct Sample {
  float value;
  unsigned long micros;    // when it was MEASURED, not when it was read
};

// Reject anything too old to be useful, rather than fusing it.
bool isFresh(const Sample &s, unsigned long maxAgeUs) {
  return (micros() - s.micros) < maxAgeUs;
}

Capture o carimbo de tempo o mais próximo possível da medição — dentro da interrupção, não depois da decodificação. Uma frase GPS processada 80 ms depois de a correção ser obtida e carimbada no momento do processamento está 80 ms errada, e nada posterior pode recuperar esse erro.

Solução de problemas

Sintoma Causa provável Correção
Mais filtragem, sem melhoria É viés, não ruído Meça o deslocamento em repouso e subtraia
A estimativa se afasta lentamente Deriva Recalibração periódica ou uma referência absoluta
Um pico ocasional sobrevive ao filtro Está sendo usada uma média A mediana rejeita valores atípicos; uma média os espalha
O ciclo de controle oscila depois de adicionar um filtro O atraso reduziu o ganho estável Use um filtro mais leve ou reajuste os ganhos
Gráfico suave, mas o robô reage tarde Constante de tempo muito maior que a pretendida Calcule τ a partir de α — não defina α por intuição
A estimativa fundida é pior que a de qualquer sensor Carimbos de tempo desatualizados ou viés compartilhado Carimbe a medição; verifique os deslocamentos de ambos os sensores
O filtro funciona na bancada, mas não no robô A vibração é um sinal real, não ruído Monte o sensor com isolamento; o filtro não consegue diferenciá-los
O filtro complementar se comporta de modo diferente do tutorial α depende de dt Calcule α para a sua taxa de ciclo

Experimente você mesmo

No simulador de sensores do robô, você pode ajustar ruído, viés, deriva e perdas de leitura e comparar os dados brutos com estimativas de passa-baixa, média móvel e mediana. É a forma mais rápida de perceber a compensação entre ruído e atraso — a mesma compensação que determina como um robô reage no simulador de desvio de obstáculos.

Explore o grafo

Faz parte destas montagens

Projetos e caminhos de aprendizagem que incluem este tutorial.

Leitura complementar

Referências