J'essaie de comprendre le fonctionnement du filtre de Kalman et parce que les variantes multidimensionnelles étaient trop confuses pour le début, j'ai commencé avec un exemple unidimensionnel.Filtre de Kalman (unidimensionnel): plusieurs approches?
J'ai trouvé 3 sources différentes expliquant le scénario d'un thermomètre mais tous ces scénarios mettent en œuvre des équations légèrement différentes et je ne comprends pas le point.
J'ai implémenté solution 2 mais mon filtre kalman ne fonctionnait pas vraiment (il s'adaptait très bien aux mesures et ne considérait vraiment pas le bruit sur celui-ci). Donc, avant de perdre plus de temps à essayer la solution 1 ou 3 (que je viens de lire jusqu'à maintenant): Quelqu'un peut-il fournir une explication propre et/ou un exemple de code pour un filtre de Kalman unidimensionnel?
Solution 1
// x_est: current estimate; p: current estimate error;
// a: constant of the system; kg: kalman gain
// z: current observation;
// Predict
x_est = a * x_est
p = a * p * a
// Update
kg = p/(p + r)
x_est = x_est + kg * (z - x_est)
p = (1 - kg) * p
L'auteur (ici) explique seulement que nous changeons les valeurs actuelles que parce qu'il n'y a pas besoin d'un thermomètre pour tenir compte de la dernière valeur.
Il a donc simplifié:
p[k] = (1 - kg) * p[k-1]
àp = (1 - kg) * p
x_est[k] = x_est[k-1] + kg * (z - x_est[k-1])
àx_est = x_est + kg * (z - x_est)
... et ainsi de suite ...
Je ne comprends pas pourquoi est-ce même possible. Je pensais que l'une des parties principales du filtre de Kalman est de considérer si l'observation actuelle z est utile ou non (via le gain de Kalman). Alors que pour un gain élevé Kalman kg * (z - x_est[k-1])
un "gros morceau" du delta z - x_est[k-1]
est ajouté à la nouvelle estimation. Est-ce que tout cela n'est pas inutile, si on calcule toujours les valeurs actuelles?
Solution 2
# q: process variance/process noise
# r: error in measurement
x_est = x_est
p = p + q;
k = p/(p + r);
x_est = x_est + k * (z – x_est);
p = (1 – k) * p;
C'est à peu près le même, mais l'auteur n'a même pas expliqué pourquoi x [k-1] et p [k-1 ] peut être modifié en x et p.
Solution 3
# Q: process variance/process noise
# R: error in measurement
# prediction
x_est_kminus1[k] = x_est[k - 1]
p_kminus1[k] = p[k - 1] + Q
# update
kg[k] = p_kminus1[k]/(p_kminus1[k] + R)
x_est[k] = x_est_kminus1[k] + kg[k] * (z[k] - x_est_kminus1[k])
p[k] = (1 - kg[k]) * p_kminus1[k]
Dans cette solution l'auteur avait deux listes différentes pour x_est
(x_est
lui-même et x_est_kminus1
) et p
(p
lui-même et p_kminus1
).
Deux listes sont-elles nécessaires, sinon p [k] serait calculé deux fois (dans la prédiction et l'étape de mise à jour)?
Merci beaucoup! Je n'ai eu que quelques questions qui me sont venues à l'esprit en lisant. Est-ce que 'a' est toujours une constante? Que se passe-t-il si un capteur détecte si la fenêtre a été ouverte ... est-ce que je réinitialiserais mon 'a' à une valeur négative alors (parce que la pièce refroidit maintenant au lieu de chauffer)? Pourriez-vous donner un exemple de 'h'? Comment transforme-t-il un état d'estimation actuel en une mesure? Vous avez oublié de dire "y". Pourriez-vous s'il vous plaît ajouter une explication pour cela? Est-ce une sorte de "repos inconnu"? Ou d'où vient-elle? – daniel451
+ mettons-nous à jour 'q' et' r' à chaque itération? Par exemple. quand je sais que le bruit des mesures du thermomètre augmente plus la pièce devient chaude ... ou est-ce que je prendrais une erreur moyenne basée sur la connaissance préalable et ne mettrais jamais à jour 'q' et' r'? – daniel451
@ascenator J'ai essayé d'élargir la réponse en fonction de vos questions de suivi - vérifiez la modification pour obtenir les changements. La version de tldr: tous peuvent changer, mais cela rend les choses plus difficiles à implémenter; 'q' et' r' peuvent être des erreurs moyennes ou vous pouvez les modifier en fonction de l'endroit où vous vous trouvez dans l'espace d'état; 'h' est une transformation linéaire. – jepio