我有一些加速计传感器每秒收集数据:
AC.X AC.Y AC.Z
9234 -0.98 -0.10 0.03
9235 -0.98 -0.10 0.03
9236 -0.98 -0.10 0.03
9237 -0.98 -0.10 0.03
9238 -0.98 -0.10 0.03
9239 -0.98 -0.10 0.03
GPS数据集会以更长的间隔拍摄:
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18
81 $GPGGA 181553.00 4105.86029 N 08754.49966 W 1 06 1.90 00208 M -033 M *53
133 $GPGGA 181554.00 4105.86052 N 08754.49954 W 1 05 2.04 00208 M -033 M *54
185 $GPGGA 181555.00 4105.86002 N 08754.49950 W 1 06 1.90 00208 M -033 M *59
237 $GPGGA 181556.00 4105.85944 N 08754.49889 W 1 06 1.90 00207 M -033 M *58
289 $GPGGA 181557.00 4105.85952 N 08754.49877 W 1 07 1.30 00210 M -033 M *52
341 $GPGGA 181558.00 4105.85925 N 08754.49852 W 1 06 1.35 00209 M -033 M *56
我一直在阅读如何使用卡尔曼滤波器来整合这些数据,我开始很好地理解算法是如何工作的。两种数据集都会引入不同类型的误差(加速度计数据随时间漂移,但几乎没有噪声; GPS数据几乎没有漂移但噪声很大),而卡尔曼滤波器使我们能够利用这些误差曲线来获得更好的导航数据。但是,我仍然在努力将其纳入代码中。我用R和Python编写代码,但我只是在寻找一些通用的伪代码来帮助我入门。你知道任何好资源或有这方面的经验吗?
答案 0 :(得分:2)
卡尔曼滤波器是基于先前数据的算法。当你有可预测的运动时(例如摆动摆),它很容易实现。但是,对于一般用途,可能难以正确实施。
我发现实现更简单的LLS过滤器(线性最小二乘)更容易(在某些情况下更可靠),如果你想做的就是平滑你的GPS。下面是来自Wikipedia的python示例,它考虑了二维空间中的三个点,我用作代码的起点:
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(5,2)*10
a = np.matrix([ [1,x[0][0]], [1,x[1][0]], [1,x[2][0]] ])
b = np.matrix([ [x[0][2]], [x[1][3]], [x[2][4]] ])
yy = (a.T * a).I * a.T*b
xx = np.linspace(1,10,50)
y = np.array(yy[0]+yy[1]*xx)
plt.figure(1)
plt.plot(xx,y.T,color='r')
plt.scatter([x[0][0],x[1][0],x[2][0] ],[x[0][5],x[1][6],x[2][7] ])
plt.show()
如果您仍然对使用卡尔曼滤波器感兴趣,article对于在动态系统中的加速度计上实现卡尔曼滤波器非常有用