Contents — find the section you need

Change parameters and verify

Open the panel, then press Run to load Python. You can stop execution and reset parameters. Results are computed on this device. No Python installation is required.

Local execution steps below are optional for reproducing the source results; they are not required for the browser experiment.

The experiment controls are in English.

Open experiment panel in a new tab

Download reproduction source

O ajuste de Kalman expressa a incerteza em um modelo de movimento e suas observações. Este experimento estima a posição e a velocidade e, em seguida, compara a previsão durante a ausência de dados, as reações a um valor discrepante e a rejeição causada pelo excesso de confiança. Todas as entradas são sintéticas; os números não representam a precisão do hardware.

Modelo e unidades

O estado contém a posição [m] e a velocidade [m/s]. Apenas a posição é observada, a cada 0,1 s:

x_k=F x_{k-1}+w_k,\qquad F=\begin{bmatrix}1&0.1\\0&1\end{bmatrix},\qquad z_k=H x_k+v_k,\quad H=\begin{bmatrix}1&0\end{bmatrix}

O desvio padrão da observação é de 0,7 m, resultando em R = 0,49 m². A covariância do processo é q ggᵀ com g = (dt²/2, dt), representando uma perturbação de aceleração independente por passo. Aqui, q = 0,4 tem unidades (m/s²)²; não se trata de uma densidade espectral de ruído branco contínuo. Não transfira este valor para outra discretização sem verificar seu significado. Consulte a introdução ao filtro de Kalman para obter as derivações de previsão e atualização.

Para a teoria, consulte Simo Särkkä (2013), Filtragem e Suavização Bayesiana, seção 4.3. A trajetória, o portão e as condições de comparação aqui são de nosso próprio projeto experimental.

Quatro configurações, entrada idêntica

Salve o script do experimento em um diretório de saída vazio e execute:

python3 engineering_labs.py

A execução foi verificada com Python 3.12.3, NumPy 1.26.4 e Matplotlib 3.6.3. O arquivo também produz os outros experimentos de engenharia vinculados. Ele usa semente 42 e 300 amostras. A velocidade real muda de 1 para 1,4 m/s em 12 s. Trinta observações, de 7,0 a 9,9 s, estão faltando, e 12 m são adicionados à observação em 16 s. A posição/velocidade inicial são 0 m e 1 m/s; a covariância inicial tem entradas diagonais de 1 m² e 1 (m/s)². Cada configuração recebe exatamente as mesmas observações.

Normalizar o resíduo

Seja e o resíduo da observação antes da correção e S sua variância prevista. O gate rejeita uma observação quando:

e=z-H\hat{x}^{-},\qquad S=HP^{-}H^T+R,\qquad e^2/S>9

Este limiar se aplica a este resíduo escalar normalizado, e não arbitrariamente a observações multidimensionais. Medições ausentes ou rejeitadas acionam a predição sem correção. A implementação usa a atualização de covariância de Joseph e verifica a semidefinição positiva. A incerteza aumenta durante a ausência de dados, portanto, isso difere de uma distância de rejeição fixa em metros.

Resultados revelam excesso de confiança

Configuração Posição RMSE [m] Rejeitado
q=0,4, R=0,49, sem gate 0,262 0
q=0,4, R=0,49, com gate 0,178 2
q=0,002, R=0,49, com gate 0,393 4
q=0,4, R=0,0049, com gate 11,251 237
Diagram 1 · Use the button to switch views
Erros de posição KF sintéticos em metros por segundo, com observações faltantes sombreadas.

O intervalo vertical é limitado a −3 a 4 m para comparação. O outlier de 12 m e os grandes erros com R pequeno se estendem além desse intervalo. Inspecione os arquivos CSV com gating, CSV com R pequeno e resumo completo em busca de valores não cortados. Observações ausentes no CSV são consideradas NaN e não contam como rejeições.

O gate rejeita duas observações, embora apenas um outlier artificial tenha sido inserido. Um limiar não identifica apenas amostras deliberadamente corrompidas. Subestimar a variância da observação por um fator de 100 causa 237 rejeições: a dispersão normal torna-se incompatível com a confiança do filtro. Correções perdidas impedem o rastreamento da mudança de velocidade, tornando os resíduos ainda maiores. Adicionar um gate por si só não cria robustez.

Analisando seus próprios registros

Verifique primeiro os timestamps, unidades e frames. Estime a variância da observação em intervalos estacionários e, em seguida, examine os erros do modelo de movimento e os resíduos durante o movimento. Introduza o gating por último, reportando a taxa de dados faltantes, a taxa de rejeição e a incerteza juntamente com o RMSE. O hardware real precisa de uma referência independente para calcular erros comparáveis.

Um Q pequeno pode suavizar uma curva, mesmo aumentando o atraso. Aumentar o Q também não é universalmente melhor. Essas classificações se aplicam apenas a esta trajetória, inicialização, ruído e janela de avaliação.

Verificação complementar

A coluna sigma_m representa o desvio padrão estimado da posição. Plote a estimativa mais/menos duas vezes o valor de sigma e compare o intervalo de dados faltantes com a variação da velocidade. Isso separa o erro real da autoavaliação do estimador. Continue com a depuração de fusão de sensores para diagnosticar o tempo e a função de transferência antes de alterar a covariância.

Execute o mesmo cálculo localmente

Extraia o arquivo ZIP executável completo, ou salve o ponto de entrada do experimento, os kernels gerados e o código-fonte original do PID em uma única pasta. O PID utiliza a biblioteca padrão do Python; Kalman e ICP requerem NumPy. Os comandos originais de geração de figuras permanecem disponíveis.

python3 -m pip install numpy==1.26.4
python3 experiment.py kalman --parameters '{"q":0.4,"r":0.49,"gate":false}' > result.json

Alterne o gate para comparar a resposta de outliers, defina q para 0,002 ou r para 0,0049 e compare o RMSE e a contagem de rejeições. As observações são fixadas a partir do CSV salvo entre as execuções.

Code, data and reproduction

The ZIP contains the same computation code as the browser, synthetic data and comparison cases. These are not physical measurements.

Download reproduction package · Instructions (EN/JA) · Files and experiment conditions (JSON)

Extract the ZIP into a new directory, then run:

python3 reproduce.py --experiment kalman

This Lab compares 4 cases. PID uses Python’s standard library; Kalman/ICP require NumPy. See the instructions for dependencies and tested versions.

Related reading

Check timing, TF and units before tuning.Por que a fusão de sensores falha — sincronização, quadros e calibração extrínsecaExplore another aspect of this fieldLaboratório MPC — resolva novamente uma sequência de curvatura dentro de um horizonte e dos limites de direçãoExplore another aspect of this fieldLaboratório de comparação de rastreamento de trajetória — execute PP, APP, RPP, Stanley e MPC sob as mesmas condições