En ce moment, nous essayons de créer un filtre Kalman 5 dimensions qui reçoit en entrée les coordonnées x et y d'un petit bug qui est errant dans la boîte. Nous observons ce bug car il fait environ 2000 mouvements, puis prédire sa position à partir de là. Les dimensions sont x-coord, y-coord, vélocité, cap et accélération angulaire. Voici le code que nous avons jusqu'ici.5D Le filtre de Kalman ne fonctionne pas, et nous ne savons pas où nous allons mal
#x is a list of five variables - x, y, velocity, angularVelocity, angularAcceleration
#currentmeasurement is the x and y that were observed
def kalman_filter(x, P, currentmeasurement, lastMeasurement = None):
prevmeasurement = []
#if there is a lastMeasurement argument, it becomes measurement
if lastMeasurement:
prevmeasurement = [lastMeasurement[0], lastMeasurement[1], x.value[3][0]]
#if there is no lastMeasurement argument, the current measurement becomes measurement.
else:
prevmeasurement = [x.value[0][0], x.value[1][0], x.value[3][0]]
#Prediction Step
a = x.value[3][0]
F = matrix([
[1., 0., cos(a), 0., 0.],
[0., 1., sin(a), 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., dt],
[0., 0., 0., 0., 1.]])
x = (F * x) + u
P = F * P * F.transpose()
#we can calculate the heading from our observations.
heading = atan2(currentmeasurement[0][1] - prevmeasurement[1], currentmeasurement[0][0] - prevmeasurement[0])
while(abs(heading - prevmeasurement[2]) > pi):
heading = heading + 2*pi*((prevmeasurement[2]-heading)/abs(prevmeasurement[2]-heading))
#perhaps the velocity should also be calculated?
# measurement update
dt = 1.
u = matrix([[0.], [0.], [0.], [0.], [0.]]) # external motion
H = matrix([[1., 0., 0., 0., 0.], #the measurement function
[0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0.]])
R = matrix([[1., 0., .0], #measurement uncertainty
[0., 1., .0],
[0., 0., 1.]])
I = matrix([[]]) #a 5x5 identity matrix
I.identity(5)
prevmeasurement = [currentmeasurement[0][0], currentmeasurement[0][1], heading]
Z = matrix([prevmeasurement])
y = Z.transpose() - (H * x)
S = H * P * H.transpose() + R
K = P * H.transpose() * S.inverse()
x = x + (K * y)
P = (I - (K * H)) * P
return x,P
Ceci aboutit à des estimations extrêmement incorrectes. Nous ne sommes pas sûrs de ce que nous faisons mal ici - je pense que nous suivons toutes les étapes correctement, mais nous ne sommes pas sûrs si toutes les matrices requises sont correctes. Toute contribution serait utile!
Réduisez l'ensemble de données à quelques points, où quatre des paramètres sont des valeurs fixes, et le cinquième suit une progression bien définie, par ex. x = 1,2,3,4,5 avec y = 0, v = 1, en-tête = + x-direction, angulaire = 0. Ensuite, exécutez l'algorithme et voyez ce que vous obtenez. – user3386109
En plus des problèmes structurels que j'ai signalés dans ma réponse, vous devriez vous demander si vous pensez que votre modèle de bogue de vitesse angulaire constante sans friction et à vitesse constante reflète vraiment la réalité. Votre étape de mise à jour est idéale pour quelque chose comme une rondelle sur une table de hockey sur air. –