Suivi de véhicule

Contents

Définition du modèle

On construit le modèle à partir du modèle continu. L'état contient position et vitesse dans les deux directions On suppose un bruit de modèle sur la vitesse uniquement

dt = 1; % pas de temps


dF = [0 0 1 0; 0 0 0 1;0 0 0 0;0 0 0 0]; % matrice du système linéaire d'eq. diffs

F = expm(dF*dt); % matrice du modèle discret

sigma_q = 0.05;
Q = sigma_q^2 * [0 0 0 0;0 0 0 0;0 0 1 0;0 0 0 1];

% On mesure uniquement la position.

H = [1 0 0 0; 0 1 0 0];

sigma_r = 1;
R = eye(2) * sigma_r^2;

Génération des données

L = 40; % nombre d'échantillons


V = [2; 1]; % vitesse, supposée uniforme
x = V * (1:L); % position au cours du temps

z = x + randn(2, L) * sigma_r; % position mesurée

Initialisation

On initialise l'estimation de l'état en utilisant la première mesure pour la position, et 0 pour la vitesse. La covariance de l'estimation est prise égale à celle des mesures pour la position, et arbitrairement grande pour la vitesse.

X0 = [z(:, 1); 0 ; 0]; % première estimation de l'état
P0 = diag([sigma_r sigma_r 100 100]); % covariance de l'estimation

Filtre de Kalman

[xest, Pest, K, xap] = kalman(z, F, H, Q, R, X0, P0); % Kalman

Visualisation des résultats

Premières estimations de l'état En rouge les estimations, en vert les prédictions position réelles en bleu position mesurées en noir

figure
hold on
quiver(xest(1, 1:10), xest(2, 1:10), xest(3, 1:10), xest(4, 1:10), 'r', 'linewidth', 2, 'AutoScale', 'off');
quiver(xap(1, 2:11), xap(2, 2:11), xap(3, 2:11), xap(4, 2:11), 'g', 'linewidth', 2, 'AutoScale', 'off');
scatter(z(1, 2:11), z(2, 2:11), 30, 'k', 'filled');
scatter(x(1, 2:11), x(2, 2:11), 30, 'b', 'filled');

Visualisation des résultats

Après une trentaine d'itérations, le filtre converge En rouge les estimations, en vert les prédictions position réelles en bleu position mesurées en noir

figure
hold on
quiver(xest(1, 30:39), xest(2, 30:39), xest(3, 30:39), xest(4, 30:39), 'r', 'linewidth', 2, 'AutoScale', 'off');
quiver(xap(1, 31:40), xap(2, 31:40), xap(3, 31:40), xap(4, 31:40), 'g', 'linewidth', 2, 'AutoScale', 'off');
scatter(z(1, 31:40), z(2, 31:40), 30, 'k', 'filled');
scatter(x(1, 31:40), x(2, 31:40), 30, 'b', 'filled');