[编辑] @Claudio的回答给了我一个关于如何过滤掉异常值的非常好的提示.我确实想开始在我的数据上使用卡尔曼滤波器.所以我改变了下面的示例数据,以便它具有微妙的变化噪声,这不是那么极端(我也看到了很多).如果有其他人可以给我一些关于如何在我的数据上使用PyKalman的方向,这将是很好的.[/编辑]
对于机器人项目,我试图用相机跟踪空中的风筝.我正在使用Python进行编程,并在下面粘贴了一些嘈杂的位置结果(每个项目都包含一个日期时间对象,但为了清晰起见,我将它们留下了).
[ # X Y
{'loc': (399, 293)},
{'loc': (403, 299)},
{'loc': (409, 308)},
{'loc': (416, 315)},
{'loc': (418, 318)},
{'loc': (420, 323)},
{'loc': (429, 326)}, # <== Noise in X
{'loc': (423, 328)},
{'loc': (429, 334)},
{'loc': (431, 337)},
{'loc': (433, 342)},
{'loc': (434, 352)}, # <== Noise in Y
{'loc': (434, 349)},
{'loc': (433, 350)},
{'loc': (431, 350)},
{'loc': (430, 349)},
{'loc': (428, 347)},
{'loc': (427, 345)},
{'loc': (425, 341)},
{'loc': (429, 338)}, # <== Noise …
Run Code Online (Sandbox Code Playgroud) 这是我关于Stackoverflow的第一个问题,所以如果我说的不好,我会道歉.我正在编写代码以从IMU获取原始加速度数据,然后将其集成以更新对象的位置.目前,此代码每隔一毫秒采用一个新的加速度计读数,并使用它来更新位置.我的系统有很多噪音,由于复合错误导致疯狂的读数,即使我实施了ZUPT方案.我知道卡尔曼滤波器理论上对于这种情况是理想的,我想使用pykalman模块而不是自己构建一个.
我的第一个问题是,pykalman可以像这样实时使用吗?从文档中我看起来像你必须记录所有测量然后执行平滑操作,这是不切实际的,因为我想每隔一毫秒递归过滤.
我的第二个问题是,对于转换矩阵,我只能将pykalman单独应用于加速度数据,还是可以以某种方式将双重积分包含到位置?那矩阵会是什么样的?
如果pykalman对于这种情况不实用,还有另一种方法可以实现卡尔曼滤波器吗?先感谢您!
我计划从包含加速计和陀螺仪的 IMU(惯性传感器)获取 3D 笛卡尔坐标中的位置。我用它来跟踪 3D 对象的位置和轨迹。
1-根据我有限的知识,我假设单独的加速度计就足够了,导致 xyz 轴A (Ax,Ay,Az) 上的加速度,并且需要积分两次才能获得速度,然后获得位置,但积分会增加一个未知的常数值,这种称为漂移的误差随着时间的推移而增加。如何消除这个错误?
2-此外,为什么首先需要陀螺仪,我们不能将 xyz 轴加速度转换为位移吗?如果加速度计告诉运动轴,那么为什么要检查陀螺仪的方向。抱歉,这是一个非常基本的问题,我到处检查都使用了陀螺仪+加速器,但不知道为什么。
3-即使在静止且没有任何运动时,地球引力也会作用在传感器上,其给出的值始终大于传感器运动所产生的值。如何消除重力?
完成此操作后,将对它们应用卡尔曼滤波器以融合它们并平滑值。在无法选择 GPS 的环境中,这种方法对物体轨迹估计的准确度如何。我从arduino获取加速度计和陀螺仪值,然后导入到Python,并将其绘制在实时更新的 3D 图形上。任何帮助将不胜感激,尤其是类似代码的链接。
我有一些数据,这些数据代表从两个不同的传感器测得的物体的位置。因此,我需要进行传感器融合。更为困难的问题是来自每个传感器的数据实际上是在随机时间到达的。我想使用pykalman来融合和平滑数据。pykalman如何处理可变的时间戳数据?
数据的简化示例如下所示:
import pandas as pd
data={'time':\
['10:00:00.0','10:00:01.0','10:00:05.2','10:00:07.5','10:00:07.5','10:00:12.0','10:00:12.5']\
,'X':[10,10.1,20.2,25.0,25.1,35.1,35.0],'Y':[20,20.2,41,45,47,75.0,77.2],\
'Sensor':[1,2,1,1,2,1,2]}
df=pd.DataFrame(data,columns=['time','X','Y','Sensor'])
df.time=pd.to_datetime(df.time)
df=df.set_index('time')
Run Code Online (Sandbox Code Playgroud)
和这个:
df
Out[130]:
X Y Sensor
time
2017-12-01 10:00:00.000 10.0 20.0 1
2017-12-01 10:00:01.000 10.1 20.2 2
2017-12-01 10:00:05.200 20.2 41.0 1
2017-12-01 10:00:07.500 25.0 45.0 1
2017-12-01 10:00:07.500 25.1 47.0 2
2017-12-01 10:00:12.000 35.1 75.0 1
2017-12-01 10:00:12.500 35.0 77.2 2
Run Code Online (Sandbox Code Playgroud)
对于传感器融合问题,我认为我可以重新调整数据的形状,使位置X1,Y1,X2,Y2具有大量缺失值,而不仅仅是X,Y。(这是相关的:https : //stackoverflow.com/questions/47386426/2-sensor-readings-fusion-yaw-pitch)
因此,我的数据如下所示:
df['X1']=df.X[df.Sensor==1]
df['Y1']=df.Y[df.Sensor==1]
df['X2']=df.X[df.Sensor==2]
df['Y2']=df.Y[df.Sensor==2]
df
Out[132]:
X Y Sensor X1 Y1 X2 Y2
time
2017-12-01 10:00:00.000 10.0 20.0 1 …
Run Code Online (Sandbox Code Playgroud) 我正在使用 pykalman 模块中的 KalmanFilter 并想知道它如何处理丢失的观察结果。根据文档:
在现实世界的系统中,传感器偶尔出现故障是很常见的。卡尔曼滤波器、卡尔曼平滑器和 EM 算法都可以处理这种情况。要使用它,只需在缺失的时间步长处对测量应用 NumPy 掩码:
from numpy import ma X = ma.array([1,2,3]) X 1 = ma.masked # 在时间步长 1 隐藏测量 kf.em(X).smooth(X)
我们可以平滑输入时间序列。由于这是一个“附加”功能,我认为它不是自动完成的;那么在变量中有 NaN 时的默认方法是什么?
这里解释了可能发生的理论方法;这也是pykalman所做的吗(在我看来这真的很棒):
谁能给我提供示例代码或python 2.7和openCV 2.4.13中的卡尔曼过滤器实现示例
我想在视频中实现它来跟踪人,但是,我没有任何学习参考,也找不到任何python示例。
我知道openCV中的Kalman筛选器以cv2.KalmanFilter的形式存在,但我不知道如何使用它。任何指导将不胜感激
我想测试卡尔曼滤波器以平滑我拥有的一组数据。请注意,x 轴间隔不相等。
x = [1,10,22,35,40,51,59,72,85,90,100]
y = [0.2,0.23,0.3,0.4,0.5,0.2,0.65,0.67,0.62,0.5,0.4]
plt.plot(x,y, 'go-');
Run Code Online (Sandbox Code Playgroud)
每个点都是一个观察点。很明显,x=50 处的点是噪声。因此我希望卡尔曼滤波器的结果是这样的:
我不是数学专家,所以我不确定这是否重要,但我的数据不是速度或位置(我发现的所有卡尔曼示例都是指那个案例)。问题是我不知道如何在 Python 中为卡尔曼滤波器实现这个相当简单的问题。我看到很多人使用这个pykalman
包
我的第一个问题是 - 卡尔曼滤波器可以处理不相等的时间间隔吗?如果答案是否定的,那么假设我的数据中的时间间隔相等,我仍然希望得到答案。我还在示例中看到数据应该是一种特定的方式,而不是像我的示例中那样“简单”的两个列表。所以我的第二个问题是,如何在 Python 中应用卡尔曼滤波器/平滑盯着我的“简单”两个列表(如果这是一个问题,您可以将 x 间隔更改为相等)。