我有实时GPS数据,每秒更新5次。平均80%的数据是相当准确的;但是大约20%的数据是不稳定的。此外,偶尔我们也会得到一个异常值,即远离实际轨迹的错误数据点。
我正在寻找一种算法,我可以做到以下几点:
- 平滑数据以消除抖动
- 不是为了平滑异常数据,而是为了消除那些错误的数据点,并用一些外推值代替
为了提供一些上下文,我首先在stackoverflow.com网站上搜索了一些类似的主题,并找到了以下链接:
平滑GPS数据
我的软件工程师实现了上面链接中提供的KalmanLatLong例程;但我们遇到了以下问题:
-
该算法落后,这意味着当该算法生成外推值时,会有更多的GPS数据点到达(记住数据是实时的)。
-
在偶尔出现异常的情况下,算法很好地将其平滑。而我们的目标是消除这些异常值,因为它们是错误的数据。
我正在寻找一种可以实时工作的算法,它可以处理5赫兹的GPS更新,并在消除异常值的同时平滑数据。
非常感谢您的帮助。
基本方法可以是这样的:
- 取最后x个点,计算平均delta矢量
- 将其应用于最后一个点,以获得外推的新点(您希望新点在哪里)
- 将外推的点与您从GPS获得的点进行比较
- 如果外推节点和你得到的节点之间的距离小于某个阈值,那么你可以认为这是一个好的数据点,并将其与外推节点混合(对于0和1之间的某个P,新点是P*GPS_point+(1-P)*外推点)
- 如果距离超过阈值,那么它可能是一个异常值,所以完全放弃它,只使用外推点
您需要对X、p和阈值的值进行实验,看看什么对您有效。适合高速比赛的东西不适合步行应用。如果你有太多的外推节点,也要添加一个检查,因为这意味着该算法认为大多数数据都是错误的,这不应该是真的。您可以清空点列表,然后从头开始。
您可以在卡尔曼滤波器本身中加入观测抑制。这有时被称为数据窥探。
我假设你有一个简单的例子,你只有GPS数据,你想要么合并一个瞬间的测量,要么把它们全部扔掉(而不是只扔掉纬度)。
该符号与Wiki文章一致
在更新步骤中,计算
V = y'*inv(S)*y
(y是残差向量,S是残差协方差)如果你的滤波器调谐正确,如果你只使用lat和lon,它会有一个卡方(2)分布,如果你也使用height,它会是卡方(3)分布。如果V超过了该分布的0.1%的上百分位,则拒绝观测,即不计算增益或更新状态或状态协方差。