回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我开始在Jupyter笔记本上使用python,因此出于学习目的,我在下面的<a href="http://%20youtube.com/watch?v=SIQJaqYVtuE&ab_channel=MichelvanBiezen" rel="nofollow noreferrer">YouTube tutorial</a>中实现了卡尔曼滤波器。我首先对静态数据使用Kalman滤波器,我想它正在工作,所以我尝试扩展代码,在鼠标坐标上应用滤波器,但它的行为非常奇怪。有人能帮我修理吗</p>
<p>我希望有<a href="https://www.youtube.com/watch?v=Isv5MEeaKjU" rel="nofollow noreferrer">this kind of result</a>,但我得到了类似截图的东西</p>
<p>这是代码-</p>
<pre><code>import numpy as np
import pandas as pd
from tkinter import *
### True Value: What should be the actual value if there was no error in measurements
### Estimates : It is the predicted value.
#### Error in Estimate: Error in the predicted value
### Measurements : It is the actual value measured with sensor
#### Error in Measurements: Error in the measured value
#### initializing variables
true_x,true_y = 0,0 # True Mouse location
Est_x,Est_y = 0,0 # Initial Estimate
Err_est_x,Err_est_y = 5,5 # Error in Initial Estimate
M_x,M_y = 0,0 # Initial Measurements
Err_msr_x,Err_msr_y = 5,5 # Error in Initial Measurements
kg_x,kg_y = 0,0 # Kalman Gain
def getKG(Err_est, Err_msr):
return Err_est/(Err_est+Err_msr)
def getEst(EST_prev, kg, Msr):
return EST_prev+kg*(Msr-EST_prev)
def getE_est(kg, Err_est):
return (1-kg)*Err_est
def updateKal(val, kg, Est, Err_est, Err_msr):
kg = getKG(Err_est, Err_msr)
Est = getEst(Est, kg, val)
Err_est = getE_est(kg, Err_est)
return kg, Est, Err_est
kg_x,Est_x,Err_est_x = updateKal(true_x,kg_x,Est_x,Err_est_x,Err_msr_x)
kg_y,Est_y,Err_est_y = updateKal(true_y,kg_y,Est_y,Err_est_y,Err_msr_y)
def activate_paint(e):
global lastx, lasty
global true_x, true_y
cv.bind('<B1-Motion>', paint)
lastx, lasty = e.x, e.y
true_x, true_y = e.x, e.y
Est_x, Est_y = e.x, e.y
def paint(e):
global lastx, lasty
global true_x, true_y
global kg_x, Est_x, Err_est_x
global kg_y, Est_y, Err_est_y
global firstval
x, y = e.x, e.y
kg_x, Est_x, Err_est_x = updateKal(x, kg_x, Est_x, Err_est_x, 0.5)
kg_y, Est_y, Err_est_y = updateKal(y, kg_y, Est_y, Err_est_y, 0.5)
cv.create_line((lastx, lasty, x, y), fill='blue',width=1)
cv.create_line((true_x,true_y, Est_x, Est_y), fill='green',width=2)
lastx, lasty = x, y
true_x, true_y = Est_x, Est_y
root = Tk()
lastx, lasty = None, None
cv = Canvas(root, width=640, height=480, bg='white')
cv.bind('<1>', activate_paint)
cv.pack(expand=YES, fill=BOTH)
root.mainloop()
</code></pre>
<p>红色是Kalman,蓝色是实际值</p>
<p><a href="https://i.stack.imgur.com/qimcS.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/qimcS.gif" alt="enter image description here"/></a></p>
<p><strong>编辑:</strong>用建议的代码更新by@Lho
<a href="https://i.stack.imgur.com/NczLv.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/NczLv.gif" alt="enter image description here"/></a></p>