Skip to content

Commit a748533

Browse files
committed
complete but untested
1 parent e792139 commit a748533

File tree

2 files changed

+120
-21
lines changed

2 files changed

+120
-21
lines changed

ExtendedKF.m

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
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+
classdef ExtendedKF < handle
25+
properties
26+
27+
Xhistory
28+
Plast
29+
Xtrue
30+
statetransitionfcn
31+
measurementfcn
32+
statej
33+
measurementj
34+
statecovariance
35+
measurementcovariance
36+
T
37+
xk
38+
k
39+
vk %plant noise
40+
wk %measurement noise
41+
state_dim
42+
measurement_dim
43+
hasadditivenoise
44+
end
45+
46+
methods
47+
48+
%constructor of class
49+
function self = ExtendedKF(statetransition_f, measurement_f,...
50+
state_j, measurement_j, state_covariance,...
51+
measurement_covariance, sampling_time, initial_x)
52+
if nargin == 8
53+
self.statetransitionfcn = statetransition_f;
54+
self.measurementfcn = measurement_f;
55+
self.statej = state_j;
56+
self.measurementj = measurement_j;
57+
self.statecovariance = state_covariance;
58+
self.measurementcovariance = measurement_covariance;
59+
self.T = sampling_time;
60+
61+
self.state_dim = size(intial_x);
62+
self.Xtrue(:, 1) = initial_x;
63+
self.Xhistory = zeros(state_dim);
64+
self.k = 1;
65+
self.hasadditivenoise = true;
66+
self.Xtrue = zeros(state_dim);
67+
end
68+
69+
end
70+
71+
72+
function [Xpred, Ppred] = predict(self)
73+
%create plant noise
74+
self.vk = sqrt(self.statecovariance)*randn(self.state_dim, 1);
75+
%create noisy plant state: REFERENCE VALUE
76+
xtrue_last = self.Xtrue(:, end);
77+
self.xk = self.statetransitionfcn(xtrue_last, self.T) + self.vk;
78+
79+
xhat_last = self.Xhistory(:, end);
80+
F = self.statej(self.T, self.vk, xhat_last);
81+
Xpred = self.statetransitionfcn(xhat_last, self.T);
82+
Ppred = F*self.Plast*F' + self.statecovariance;
83+
84+
%save the new values:
85+
self.k = self.k+1;
86+
self.Plast = Ppred;
87+
self.Xhistory(:, self.k) = Xpred;
88+
self.Xtrue(:, self.k) = self.xk;
89+
90+
91+
end
92+
93+
function [Xcorr, Pcorr] = correct(self)
94+
%create measurement noise
95+
self.wk = sqrt(self.measurementcovariance)*randn(self.state_dim, 1);
96+
%create true measurement
97+
yk = self.measurementfcn(self.xk) + self.wk;
98+
99+
%correcting measurement
100+
Xpred = self.Xhistory(:, self.k);
101+
H = self.measurementj(Xpred);
102+
Ypred = self.measurementfcn(Xpred);
103+
Sk = H*self.Plast*H' + self.measurementcovariance;
104+
Kk = self.Plast*H'*inv(Sk);
105+
106+
107+
108+
%correct the readings
109+
Xcorr = Xpred+Kk*(yk-Ypred);
110+
Pcorr = self.Plast - Kk*H*self.Plast;
111+
112+
113+
%overwrite to existing values:
114+
self.Plast = Pcorr;
115+
self.Xhistory(:, self.k) = Xcorr;
116+
117+
end
118+
119+
end
120+
end

KalmanFilter.m

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

0 commit comments

Comments
 (0)