SignalFilters/Code_Python/KalmanCourse.py

184 wiersze
4.3 KiB
Python

# import numpy as np
# measurements = np.array([5., 6., 7., 9., 10.])
# motion = np.array([1., 1., 2., 1., 1.])
# measurement_sigma = 4.
# motion_sigma = 2.
# mu = 0.
# sigma = 1000.
# # Measurement
# def Update( mean1, var1, mean2, var2 ):
# mean = (var2*mean1 + var1*mean2) / (var1 + var2)
# var = 1.0 / (1.0/var1 + 1.0/var2)
# return [mean, var]
# # Motion
# def Predict( mean1, var1, U, varU ):
# mean = mean1 + U
# var = var1 + varU
# return [mean, var]
# for n in range(len(measurements)):
# [mu, sigma] = Update(mu, sigma, measurements[n], measurement_sigma)
# print('Update : ', n, [mu, sigma])
# [mu, sigma] = Predict(mu, sigma, motion[n],motion_sigma)
# print('Predict: ', n, [mu, sigma])
# print(' ')
# print(Update(1,1,3,1))
# -------------------------------------------------------
# import numpy as np
# measurements = [ 1., 2., 3. ]
# dt = 1.
# # Initial state (location and velocity)
# x = np.array([[ 0. ],
# [ 0. ]])
# # Initial uncertainty
# P = np.array([[ 1000., 0. ],
# [ 0., 1000. ]])
# # External motion
# U = np.array([[ 0. ],
# [ 0. ]])
# # Next state function
# F = np.array([[ 1., dt ],
# [ 0., 1. ]])
# # Measurement function
# H = np.array([[ 1., 0. ]])
# # Measurement uncertainty
# R = np.array([[ 1. ]])
# # Identity matrix
# I = np.eye(2)
# def filter(x, P):
# step = 0
# for z in (measurements):
# step += 1
# print("step = ", step, " meas. = ", z)
# # Measurement
# Htra = H.T
# S = H.dot(P.dot(Htra)) + R
# Sinv = np.linalg.inv(S)
# K = P.dot(Htra.dot(Sinv))
# y = z - H.dot(x)
# xp = x +K.dot(y)
# Pp = P - K.dot(H.dot(P))
# # Prediction
# x = F.dot(xp) + U
# Ftra = F.T
# P = F.dot(Pp.dot(Ftra))
# print('x =')
# print(x)
# print('P =')
# print(P)
# filter(x, P)
# # -------------------------------------------------------
import numpy as np
x0 = 4.
y0 = 12.
measurements = np.array([[ 5., 10. ],
[ 6., 8. ],
[ 7., 6. ],
[ 8., 4. ],
[ 9., 2. ],
[ 10., 0. ]])
# x0 = -4.
# y0 = 8.
# measurements = np.array([[ 1., 4. ],
# [ 6., 0. ],
# [ 11., -4. ],
# [ 16., -8. ]])
# x0 = 1.
# y0 = 19.
# measurements = np.array([[ 1., 17. ],
# [ 1., 15. ],
# [ 1., 13. ],
# [ 1., 11. ]])
# x0 = 1.
# y0 = 19.
# measurements = np.array([[ 2., 17. ],
# [ 0., 15. ],
# [ 2., 13. ],
# [ 0., 11. ]])
# Time step
dt = 0.1
# Initial state (location and velocity)
x = np.array([[ x0 ],
[ y0 ],
[ 0. ],
[ 0. ]])
# Initial uncertainty
P = np.array([[ 0., 0., 0., 0. ],
[ 0., 0., 0., 0. ],
[ 0., 0., 1000., 0. ],
[ 0., 0., 0., 1000. ]])
# External motion
U = np.array([[ 0. ],
[ 0. ],
[ 0. ],
[ 0. ]])
# Next state function
F = np.array([[ 1., 0., dt, 0. ],
[ 0., 1., 0., dt ],
[ 0., 0., 1., 0. ],
[ 0., 0., 0., 1. ]])
# Measurement function
H = np.array([[ 1., 0., 0., 0. ],
[ 0., 1., 0., 0. ]])
# Measurement uncertainty
R = np.array([[ 0.1, 0. ],
[ 0. , 0.1 ]])
# Measurement vector
z = np.zeros((2,1))
def filter(x, P):
for n in range(len(measurements)):
z[0][0] = measurements[n][0]
z[1][0] = measurements[n][1]
# Prediction
xp = F.dot(x) + U
Ftra = F.T
Pp = F.dot(P.dot(Ftra))
# Measurement
Htra = H.T
S = H.dot(Pp.dot(Htra)) + R
Sinv = np.linalg.inv(S)
K = Pp.dot(Htra.dot(Sinv))
y = z - H.dot(xp)
x = xp +K.dot(y)
P = Pp - K.dot(H.dot(Pp))
# print(z)
# print('x = ')
# print(x)
# print('P = ')
# print(P)
# print(' ')
return x, P
x_final, P_final = filter(x, P)
print('x = ')
print(x_final)
print('P = ')
print(P_final)