您当然不必从头开始“发明”它 - GPS/INS 融合是文学中很好的话题。仅有两本书:
正如其他人指出的那样(例如Android 的 Kalman Filter),Java / for Android 中也有 Kalman 滤波器的实现。
在您的特定情况下,卡尔曼滤波的问题是需要满足实现卡尔曼滤波器的几个要求*。从理论上讲,您需要确保噪声(未建模的测量误差)始终为白色且不相关。问题是您没有从内部接收器(大致可以认为是白色的)获得原始 GPS 测量值,而是已经过滤的解决方案(它肯定表现出时间相关性)。
另一个问题是,在卡尔曼滤波器中,您需要进行一些调整,即您需要设置测量噪声等参数。这些参数取决于所用传感器的质量——因此它们在不同设备之间有所不同。这可能会降低您在某些设备上的估计质量。
话虽如此,可能有几种解决方案:
使用速度来推断位置更新之间的位置。(我没有在 Android 上做过这个,但这个问题可能有助于获得速度。)如果用户的速度变化不是太频繁(与位置更新频率相比),这在大多数情况下应该工作得很好。
实现一个完整的卡尔曼滤波器:如上面引用的书籍所述,将绝对位置测量与加速度计相结合是很常见的,即使使用廉价的 MEMS 级惯性传感器也是如此。为了减少 Acc 传感器引起的误差,请在卡尔曼滤波器状态向量中估计这些误差。通常,卡尔曼滤波器在一个滤波器中估计位置、速度、姿态和 Acc/Gyro 偏差。如果你想假设它们已经足够了解,你可以放弃姿态和陀螺仪。即使您的传感器可能会出现更多错误,但估计偏差通常足以在位置更新之间进行估计。
实现一个完整的卡尔曼滤波器也可能意味着您考虑测量的时间相关性,例如使用称为施密特卡尔曼滤波器的技术(参见上面引用的书籍)。这也可能意味着您使用自适应卡尔曼滤波来估计滤波器的一些参数,以考虑不同设备中的不同传感器。但是请注意,此类事情需要一点导航领域的经验:实现通常很容易 - 只需几行矩阵运算,但调整可能很耗时。但这并不意味着你不应该尝试!
- 仅使用上述滤波器的偏差估计:使用估计的 Acc 偏差,您可以通过加速度计测量值外推速度来改进第一种方法(用速度外推位置)。
*从理论的角度来看 - 你总是可以忽略理论而只是尝试。有时它仍然可以工作:-)