# 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)