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.
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:
- Mantenha o sensor completamente imóvel diante de uma entrada conhecida e constante.
- Registre alguns milhares de amostras brutas com carimbos de tempo.
- Calcule a média e o desvio-padrão.
- 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