18.08.2013 Views

UNIVERSITA' DEGLI STUDI DI PAVIA - Robotica

UNIVERSITA' DEGLI STUDI DI PAVIA - Robotica

UNIVERSITA' DEGLI STUDI DI PAVIA - Robotica

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

A' + B * Q * B')<br />

% Calcola il guadagno del filtro di Kalman<br />

K = A * P * C' * inv(C * P * C' + R)<br />

abs(eig(A - K * C))<br />

xk = zeros(nA, nk);<br />

xk1 = zeros(nA, nk);<br />

xk_pred = zeros(nA, nk);<br />

pow = zeros(1, nstep + 1);<br />

pow(1) = 1;<br />

An = polyvalm(pow, A)<br />

for i = 1:(nk - nstep)<br />

xk(:,i + 1) = A * xk(:,i) + K * (zk(i) - C * xk(:,i));<br />

xk_pred(:,i + nstep) = An * xk(:,i + 1);<br />

zk_pred(i + nstep) = C * xk_pred(:,i + nstep);<br />

end<br />

% Stampa il grafico<br />

axis xy<br />

grid on<br />

plot(k, zk_real, 'g.', k, zk, 'b.', k, xk_pred(1,:), 'r.');<br />

legend('Trajectory', 'Noisy measurement', 'Prediction', 0);<br />

title('Functions');<br />

xlabel('k - Discrete time');<br />

Il programma utilizza il predittore per stimare lo stato di un sistema<br />

dinamico che evolve nel tempo secondo una legge nota, che è codificata<br />

all'interno del programma stesso: è quindi molto semplice variare la funzione che<br />

determina l'evoluzione del sistema, in modo da testare il filtro nelle più diverse<br />

condizioni operative. Nel listato precedente, e negli esempi che seguono, è<br />

utilizzata una funzione sinusoidale. E' anche possibile aggiungere del rumore al<br />

segnale, in modo da verificare il comportamento del filtro aumentando<br />

progressivamente i disturbi sugli ingressi.<br />

La simulazione è codificata in MATLAB come una funzione che accetta i<br />

seguenti parametri:<br />

- nA, il numero di integratori del modello;<br />

- rho, ovvero il parametro che controlla la sensibilità al rumore del filtro;<br />

207

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!