Реализация фильтра Калмана в python для оценки скорости

Я пытаюсь реализовать фильтр Калмана для прогнозирования скорости на шаг вперед. Реализация в питоне H=np.diag([1,1]) H

Результат: array([[1, 0], [0, 1]]) Для векторных измерений файл данных представляет собой CSV-файл, содержащий время в одном столбце и скорость в другом столбце.

measurements=np.vstack((mx,my,datafile.speed))
 #length of meassurement
 m=measurements.shape[1]
 print(measurements.shape)

Вывод: (3, 1069)

Кальман

 for filterstep in range(m-1):
         #Time Update
           #=============================
         #Project the state ahead
        x=A*x

        #Project the error covariance ahead
        P=A*P*A.T+Q

        #Measurement Update(correction)
        #===================================
        #if there is GPS measurement
        if GPS[filterstep]:
        #COmpute the Kalman Gain
        S =(H*P*H).T + R
        S_inv=S.inv()
        K=(P*H.T)*S_inv

        #Update the estimate via z
        Z = measurements[:,filterstep].reshape(H.shape[0],1)
        y=Z-(H*x)
        x = x + (K*y)

        #Update the error covariance
        P=(I-(K*H))*P


# Save states for Plotting
    x0.append(float(x[0]))
    x1.append(float(x[1]))


    Zx.append(float(Z[0]))
    Zy.append(float(Z[1]))

    Px.append(float(P[0,0]))
    Py.append(float(P[1,1]))



    Kx.append(float(K[0,0]))
    Ky.append(float(K[1,0]))

Ошибка появляется как:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-80-9b15fccbaca8> in <module>()
     20 
     21         #Update the estimate via z
---> 22         Z = measurements[:,filterstep].reshape(H.shape[0],1)
     23         y=Z-(H*x)
     24         x = x + (K*y)

ValueError: total size of new array must be unchanged

Как убрать такую ​​ошибку


person Himal Acharya    schedule 23.04.2016    source источник
comment
Мне интересно узнать, что такое столбцы в измерениях? У вас есть позиция x и y или у вас есть только скорость и время?.   -  person Yasmin    schedule 30.03.2020


Ответы (1)


Эта строка неверна:

S =(H*P*H).T + R

Правильный код:

S =(H*P*H.T) + R

У меня возникли проблемы с тем, каковы измерения. Вы указали «массив ([[1, 0], [0, 1]]) Для векторного файла данных измерения является CSV-файл, содержащий время в одном столбце и скорость в другом столбце»

Так что для меня это читается как файл CSV с двумя столбцами, одним временем и одной скоростью. В этом случае у вас есть только одно измерение в каждый момент времени, скорость. Для одного измерения ваша H-матрица должна быть вектором-строкой.

person Keith Brodie    schedule 25.04.2016