2016-03-14 3 views
1

Contexte: Pour donner un peu de contexte à tout le monde, j'essaie de lisser les données GPS reçues d'un appareil utilisant le filtre de Kalman (Apache ). Quel type de bruits dynamiques dois-je inclure dans ma mise en œuvre par rapport à la matrice P0, Q et R sachant que la seule entrée que j'ai en dehors de la position (X et Y) est précision horizontale et la vitesse pour les composants X et Y. Ce n'est pas un exemple de vitesse constante puisque la vitesse peut changer d'un ping à un autre ping.Comment remplir les matrices dans le filtre Apache Commons Kalman Mise en œuvre

Bibliothèque de mise en œuvre: Apache Common
- http://commons.apache.org/proper/commons-math/userguide/filter.html

Utilisation: Je ne considérais l'espace 2D pour le moment

entrées que j'ai avec moi: 1. latitude
2. longitude
3 Précision horizontale ou Dilution horizontale de précision (HDOP) en mètres/s
4. Temps entre deux pings (dt) = 30 secondes

Sorties Je me soucie de
1. nouveau Latitude
2. Longitude nouvelle

Valeurs calculées: Vx (vitesse dans la direction X) Vy (vitesse dans la direction Y) L'objet sera constamment en mouvement, mais avec différents vélocités afin que je puisse calculer Vx et Vy en utilisant le formulaire V * sin (thêta) et V * Cosine (thêta)

Comment dois-je mapper mes valeurs à l'implémentation Apache Common?

configuration actuelle:

X = Initial State = [ 

    {X Y X-Vel Y-Vel} 

    ] 

// I only care about X and Y coordinates so this is a 2 * 4 matrix 
H = Observation variables = [ 

    {1, 0, 0, 0}, 
    {0, 1, 0, 0} 



] 

// This is a 4 * 4 matrix 
P0 = Cov(X) = [  

    {(horizontal accuracy from i/p), 0, 0, 0}, 
    {0, (horizontal accuracy from i/p), 0, 0}, 
    {0, 0, (some initial value for VY), 0}, 
    {0, 0, 0, (some initial value for VX) } 

    ] 

// Copied this from somewhere. What values should I have in this? // 
This is a 4 * 4 matrix 
Q = Cov(Dynamic noise) = [   

    { Math.pow(dt, 4d)/4d, 0d, Math.pow(dt, 3d)/2d, 0d }, 
    { 0d, Math.pow(dt, 4d)/4d, 0d, Math.pow(dt, 3d)/2d }, 
    { Math.pow(dt, 3d)/2d, 0d, Math.pow(dt, 2d), 0d }, 
    { 0d, Math.pow(dt, 3d)/2d, 0d, Math.pow(dt, 2d) } 

    ] 

// This is a 2 * 2 matrix 
R = Cov(measurement noise) = [ 

    { Math.pow((horizontal accuracy from i/p), 2d) , 0}, 
    { 0, Math.pow((horizontal accuracy from i/p), 2d)} 

] 

// This is a 4 * 4 matrix 
A = State transition matrix = [ 

    { 1d, 0d, dt, 0d }, 
    { 0d, 1d, 0d, dt }, 
    { 0d, 0d, 1d, 0 }, 
    { 0d, 0d, 0d, 1d } 

] 

sont mes matrices correctes pour ce que je suis en train de faire? Quand je les cours, je continue à obtenir MatrixDimensionMismatchException et j'ai donc décidé de poser une question. Toute aide serait appréciée.

+1

Veuillez reformater votre question. Pas besoin de formateur de fantaisie. Utilisez le formatage du code pour le code et la citation pour les devis. –

+0

Je pense que c'est inhabituel, mais bien formaté, pas besoin de changer le formatage – AlexWien

+0

Les coordonnées GPS sont déjà fortement filtrées kalman. Le lissage les rendra moins précis. Pensez si vous pourriez avoir besoin de filtrer les emplacements indésirables au lieu de lisser. – AlexWien

Répondre

0

J'ai été capable de résoudre ce problème en utilisant la dernière version de la librairie Apache Commons Math.

Il se trouve que Apache Commons Math 3.2 et version antérieure avait un bug majeur
signalé ici: https://issues.apache.org/jira/browse/MATH-1033

Le problème était la dimension de la colonne measNoise avait toujours à 1 ce qui signifie que la matrice R doit toujours avoir seulement 1 colonne