python 中用于速度估计的卡尔曼滤波器实现
Kalman filter implementation in python for speed estimation
我尝试实施卡尔曼滤波器来提前预测速度。
在 python 中实施
H=np.diag([1,1])
H
结果:
数组([[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
我怎样才能消除这样的错误
此行不正确:
S =(H*P*H).T + R
正确的代码是:
S =(H*P*H.T) + R
我无法理解测量结果。你说
" array([[1, 0], [0, 1]]) 对于测量矢量数据文件是 csv 文件,其中一列是时间,另一列是速度"
所以这对我来说是一个包含两列的 CSV 文件,一个时间,一个速度。在那种情况下,您每次只有一个测量值,即速度。对于单次测量,您的 H 矩阵应该是行向量。
我尝试实施卡尔曼滤波器来提前预测速度。 在 python 中实施 H=np.diag([1,1]) H
结果: 数组([[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
我怎样才能消除这样的错误
此行不正确:
S =(H*P*H).T + R
正确的代码是:
S =(H*P*H.T) + R
我无法理解测量结果。你说 " array([[1, 0], [0, 1]]) 对于测量矢量数据文件是 csv 文件,其中一列是时间,另一列是速度"
所以这对我来说是一个包含两列的 CSV 文件,一个时间,一个速度。在那种情况下,您每次只有一个测量值,即速度。对于单次测量,您的 H 矩阵应该是行向量。