|
1 | | -% function [xhat_optimal,P_optimal] = KalmanFilter(y_k, Q_k, R_k, xhat_last, P_last, vk, wk, T) |
2 | | -% %Predicts the state xk and covariance matrix pk given k-1 information |
3 | | -% |
4 | | -% %compute jacobian of system: |
5 | | -% F_k = F_jacobian(T, vk, xhat_last); |
6 | | -% |
7 | | -% %compute predicted mean and covariance |
8 | | -% [xhat_predict, P_k_predict] = state_predict(xhat_last,F_k, P_last, Q_k, vk, wk, T); |
9 | | -% |
10 | | -% %compute jacobian of sensor: |
11 | | -% H_k = H_jacobian(xhat_predict); |
12 | | -% |
13 | | -% %predict the measured value |
14 | | -% [yhat_predict,K_k] = measurement_predict(xhat_predict, H_k, P_k_predict, R_k); |
15 | | -% |
16 | | -% %Estimate: |
17 | | -% xhat_optimal = xhat_predict + K_k*(y_k-yhat_predict); |
18 | | -% P_optimal = P_k_predict-K_k*H_k*P_k_predict; |
19 | | -% |
20 | | -% |
21 | | -% end |
22 | | - |
23 | | - |
24 | 1 | classdef ExtendedKF < handle |
25 | 2 | properties |
26 | 3 |
|
|
58 | 35 | self.measurementcovariance = measurement_covariance; |
59 | 36 | self.T = sampling_time; |
60 | 37 |
|
61 | | - self.state_dim = size(intial_x); |
| 38 | + self.state_dim = size(self.statecovariance(:, 1)); |
| 39 | + self.measurement_dim = size(self.measurementcovariance(:, 1)); |
62 | 40 | self.Xtrue(:, 1) = initial_x; |
63 | | - self.Xhistory = zeros(state_dim); |
| 41 | + self.Xhistory = zeros(self.state_dim); |
64 | 42 | self.k = 1; |
65 | 43 | self.hasadditivenoise = true; |
66 | | - self.Xtrue = zeros(state_dim); |
| 44 | + self.Plast = eye(self.state_dim(1)); |
67 | 45 | end |
68 | 46 |
|
69 | 47 | end |
70 | 48 |
|
71 | 49 |
|
72 | 50 | function [Xpred, Ppred] = predict(self) |
73 | 51 | %create plant noise |
74 | | - self.vk = sqrt(self.statecovariance)*randn(self.state_dim, 1); |
| 52 | + self.vk = sqrt(self.statecovariance)*randn(self.state_dim(1), 1); |
75 | 53 | %create noisy plant state: REFERENCE VALUE |
76 | 54 | xtrue_last = self.Xtrue(:, end); |
77 | 55 | self.xk = self.statetransitionfcn(xtrue_last, self.T) + self.vk; |
78 | 56 |
|
79 | 57 | xhat_last = self.Xhistory(:, end); |
80 | | - F = self.statej(self.T, self.vk, xhat_last); |
| 58 | + F = self.statej(xhat_last, self.T); |
81 | 59 | Xpred = self.statetransitionfcn(xhat_last, self.T); |
82 | | - Ppred = F*self.Plast*F' + self.statecovariance; |
| 60 | + Ppred = F*(self.Plast)*F' + self.statecovariance; |
83 | 61 |
|
84 | 62 | %save the new values: |
85 | 63 | self.k = self.k+1; |
86 | | - self.Plast = Ppred; |
| 64 | + self.Plast = Ppred; |
87 | 65 | self.Xhistory(:, self.k) = Xpred; |
88 | 66 | self.Xtrue(:, self.k) = self.xk; |
89 | 67 |
|
|
92 | 70 |
|
93 | 71 | function [Xcorr, Pcorr] = correct(self) |
94 | 72 | %create measurement noise |
95 | | - self.wk = sqrt(self.measurementcovariance)*randn(self.state_dim, 1); |
| 73 | + self.wk = sqrt(self.measurementcovariance)*randn(self.measurement_dim(1), 1); |
96 | 74 | %create true measurement |
97 | | - yk = self.measurementfcn(self.xk) + self.wk; |
| 75 | + yk = self.measurementfcn(self.xk, self.T) + self.wk; |
98 | 76 |
|
99 | 77 | %correcting measurement |
100 | 78 | Xpred = self.Xhistory(:, self.k); |
101 | | - H = self.measurementj(Xpred); |
| 79 | + H = self.measurementj(Xpred, self.T); |
102 | 80 | Ypred = self.measurementfcn(Xpred); |
103 | 81 | Sk = H*self.Plast*H' + self.measurementcovariance; |
104 | 82 | Kk = self.Plast*H'*inv(Sk); |
|
0 commit comments