Skip to content

Commit c97d15e

Browse files
authored
Merge pull request #2 from mehhdiii/using-MATLAB-classes
Simulation now working using ExtendedKF MATLAB class
2 parents e792139 + 8602a42 commit c97d15e

13 files changed

+1674
-1028
lines changed

ExtendedKF.m

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
classdef ExtendedKF < handle
2+
properties
3+
4+
Xhistory
5+
Plast
6+
Xtrue
7+
statetransitionfcn
8+
measurementfcn
9+
statej
10+
measurementj
11+
statecovariance
12+
measurementcovariance
13+
T
14+
xk
15+
k
16+
vk %plant noise
17+
wk %measurement noise
18+
state_dim
19+
measurement_dim
20+
hasadditivenoise
21+
end
22+
23+
methods
24+
25+
%constructor of class
26+
function self = ExtendedKF(statetransition_f, measurement_f,...
27+
state_j, measurement_j, state_covariance,...
28+
measurement_covariance, sampling_time, initial_x)
29+
if nargin == 8
30+
self.statetransitionfcn = statetransition_f;
31+
self.measurementfcn = measurement_f;
32+
self.statej = state_j;
33+
self.measurementj = measurement_j;
34+
self.statecovariance = state_covariance;
35+
self.measurementcovariance = measurement_covariance;
36+
self.T = sampling_time;
37+
38+
self.state_dim = size(self.statecovariance(:, 1));
39+
self.measurement_dim = size(self.measurementcovariance(:, 1));
40+
self.Xtrue(:, 1) = initial_x;
41+
self.Xhistory = zeros(self.state_dim);
42+
self.k = 1;
43+
self.hasadditivenoise = true;
44+
self.Plast = eye(self.state_dim(1));
45+
end
46+
47+
end
48+
49+
50+
function [Xpred, Ppred] = predict(self)
51+
%create plant noise
52+
self.vk = sqrt(self.statecovariance)*randn(self.state_dim(1), 1);
53+
%create noisy plant state: REFERENCE VALUE
54+
xtrue_last = self.Xtrue(:, end);
55+
self.xk = self.statetransitionfcn(xtrue_last, self.T) + self.vk;
56+
57+
xhat_last = self.Xhistory(:, end);
58+
F = self.statej(xhat_last, self.T);
59+
Xpred = self.statetransitionfcn(xhat_last, self.T);
60+
Ppred = F*(self.Plast)*F' + self.statecovariance;
61+
62+
%save the new values:
63+
self.k = self.k+1;
64+
self.Plast = Ppred;
65+
self.Xhistory(:, self.k) = Xpred;
66+
self.Xtrue(:, self.k) = self.xk;
67+
68+
69+
end
70+
71+
function [Xcorr, Pcorr] = correct(self)
72+
%create measurement noise
73+
self.wk = sqrt(self.measurementcovariance)*randn(self.measurement_dim(1), 1);
74+
%create true measurement
75+
yk = self.measurementfcn(self.xk, self.T) + self.wk;
76+
77+
%correcting measurement
78+
Xpred = self.Xhistory(:, self.k);
79+
H = self.measurementj(Xpred, self.T);
80+
Ypred = self.measurementfcn(Xpred);
81+
Sk = H*self.Plast*H' + self.measurementcovariance;
82+
Kk = self.Plast*H'*inv(Sk);
83+
84+
85+
86+
%correct the readings
87+
Xcorr = Xpred+Kk*(yk-Ypred);
88+
Pcorr = self.Plast - Kk*H*self.Plast;
89+
90+
91+
%overwrite to existing values:
92+
self.Plast = Pcorr;
93+
self.Xhistory(:, self.k) = Xcorr;
94+
95+
end
96+
97+
end
98+
end

KalmanFilter.m

Lines changed: 0 additions & 21 deletions
This file was deleted.

measurement_predict.m

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)