2015-10-28 4 views
3

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)?

Répondre

11

Toutes ces solutions sont des cas particuliers des équations générales et nous devrons voir ce qui est spécial à propos de chacune d'entre elles.

équations appropriées

Commençons par les propres équations générales pour le cas 1D:

# prediction 
x[k] = a * x[k - 1] 
p[k] = a * p[k - 1] * a + q 
# update 
y = z - h * x[k] 
kg = p * h/(h * p * h + r) 
x[k] = x[k] + kg * y 
p[k] = (1 - kg * h) * p[k] 
  • x - état
  • p - erreur (covariance)
  • a - transition d'état
  • q - Erreur transition
  • z - Mesure
  • h - transformation à mesure l'état
  • y - différence entre ce que nous nous attendions à mesure en fonction de la prévision et ce que nous avons mesuré en fait
  • kg - Kalman gagner
  • r - erreur de mesure

Tous des paramètres du modèle (a, q, r, h) pourrait en principe également avoir un indice k et changer à mesure que le système évolue. Mais dans des cas simples, ils peuvent tous être considérés comme constants.

Comment les solutions diffèrent des équations appropriées

Seule solution 1 met en oeuvre un a et c'est très bien. a vous indique comment les changements d'état d'une étape à l'autre, si vous assumez la température à l'arrêt puis a == 1, comme en solution 2 et 3.

Solution 1 ne dispose pas d'un q. q est l'endroit où nous pouvons donner une estimation de l'erreur de processus. Encore une fois, si le processus est sur le système étant stationnaire (a == 1) alors nous pourrions définir q = 0.

Aucune de vos solutions n'a de h, qui est la transformation d'observation (comment passer de la mesure à l'état). Si vous estimez la température, basée sur les mesures de la température, alors h = 1.

Un exemple de quand h peut être différent de 1 est si vous mesuriez autre chose que vous êtes intéressé par l'estimation, par ex. utiliser une mesure d'humidité pour estimer la température. Alors h serait le linéaire transformation T(humidity) = h * humidity. Je souligne linéaire parce que ce qui précède sont les équations linéaires de filtre de Kalman et ils ne s'appliquent qu'aux systèmes linéaires (dans le sens mathématique).

question de l'étape actuelle et précédente

La question de k contre k - 1 et ayant x_est et x_est_kminus1 est purement une question de mise en œuvre. À cet égard, toutes vos solutions sont les mêmes.

Votre réflexion sur k et k - 1 dans la solution 1 est désactivée. Seule l'étape de prédiction doit penser à l'étape actuelle et à l'étape précédente (puisqu'il s'agit d'une prédiction de l'état actuel sur la base du précédent) et non à l'étape de mise à jour. L'étape de mise à jour agit sur la prédiction. Du point de vue de la lisibilité, la solution 3 est la plus proche des équations mathématiques. En principe, l'étape de prédiction ne nous donne pas encore x_est[k] mais plutôt comme predicted_x_est[k]. Ensuite, l'étape de mise à jour s'exécute sur ce predicted_x_est[k] et nous donne notre x_est[k] réel.

Cependant, comme je l'ai dit, toutes les implémentations sont équivalentes car lorsqu'elles sont programmées, vous pouvez voir qu'après l'étape de prédiction, le passé n'est plus nécessaire. Ainsi, vous pouvez utiliser en toute sécurité une variable pour p et x sans avoir besoin de garder une liste.

A propos Kalman Gain

Vous avez écrit:

Alors que pour un haut de Kalman kg de gain * (z - x_est [k-1]) un "gros morceau" de le delta z - x_est [k-1] est ajouté à la nouvelle estimation. Cette chose n'est-elle pas inutile, si l'on calcule toujours les valeurs actuelles?

Dans ces cas, le gain de kalman ne peut être compris qu'entre 0 et 1. Quand est-ce le plus grand? Lorsque r (erreur de mesure) est 0, ce qui signifie que nous faisons confiance infiniment nos mesures. L'équation simplifie ensuite

x_est = x_est + z - x_est 

ce qui signifie que l'on écarte notre valeur prédite (la x_est sur le côté droit) et mis notre estimation mise à jour égale à notre mesure. C'est une chose valide à faire quand nous faisons confiance infiniment à ce que nous mesurons.

Adaptation aux mesures

Je solution 2, mais mis en œuvre mon filtre de Kalman ne fonctionnait pas vraiment (il lui-même très adapté aux mesures et pas vraiment considéré comme le bruit dessus).

Tuning un filtre de Kalman est délicate et nécessite une connaissance approfondie du système et des estimations précises des q et r. Rappelez-vous que q est l'erreur sur le processus (évolution de l'état) et r est l'erreur sur nos mesures.Si votre filtre de Kalman est trop s'adapte aux mesures cela signifie que:

  • q est trop grand
  • r est trop petit

ou une combinaison des deux. Vous devrez jouer avec les valeurs pour trouver celles qui fonctionnent.

+0

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

+0

+ 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

+0

@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