gpt4 book ai didi

用于鼠标位置的 Python 卡尔曼滤波器未按预期工作

转载 作者:行者123 更新时间:2023-12-04 15:17:01 25 4
gpt4 key购买 nike

我开始在 Jupyter notebook 中使用 python,因此为了学习目的,我在此之后实现了卡尔曼滤波器 YouTube tutorial .我首先将我的卡尔曼滤波器与静态数据一起使用,我猜它是有效的,所以我尝试扩展该代码以在鼠标坐标上应用过滤器,但它的行为真的很奇怪。谁能帮我修一下?
我希望有 this kind of result但我得到了类似截图的东西。
这是代码 -

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

红色是卡尔曼,蓝色是实际
enter image description here
编辑:使用@Lho 建议的代码更新
enter image description here

最佳答案

我没有运行你的代码,但是你的变量 Err_est_xErr_est_y只会变小?您必须在每次调用 updateCall 后增加这些变量。像这样:

# in method paint()
#
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)
Err_est_x = 1.1 * Err_est_x + 0.1 # new code
Err_est_y = 1.1 * Err_est_y + 0.1 # new code
解释:如果您的估计误差很小,则新的噪声测量的信息也很低 [1]。
这在您的可视化中也可见:最初,红卡尔曼估计“非常快”,因为您的估计误差很高。但是,当您的估计误差越来越小时,您的红色卡尔曼估计就是“减速完成”。
请注意,我没有运行您的代码,因此选择的值(1.1 和 0.1)可能过高或过小。增加/减少这两个数字以增加/减少您的红色卡尔曼估计的“速度”。
[1] 例如,如果您的估计误差为 0,则新测量的信息增益也为 0。

关于用于鼠标位置的 Python 卡尔曼滤波器未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64159866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com