插值和预测 CLLocationManager

Interpolating and predicting CLLocationManager

我需要获得至少 10 赫兹的更新用户位置,以便在驾驶时在 MapBox 中平滑地动画位置 iOS。由于 Core Location 每秒仅提供一个点,因此我认为我需要做一些预测。

我试过ikalman,但每秒更新一次并以 10 赫兹查询时似乎没有任何区别。

请问我该如何解决?

您要查找的是外推法,而不是内插法。

我真的非常惊讶互联网上关于外推的资源如此之少。如果您想了解更多,您应该阅读一些数值 methods/math 书籍并自己实现算法。

也许简单的线性外推就足够了?

// You need two last points to extrapolate
-(double) getExtrapolatedValueAt:(double)x withPointA:(Point*)A andPointB(Point*)B
{
    // X is time, Y is either longtitute or latitude.
    return A.y + ( x - A.x ) / (B.x - A.x) * (B.y - A.y);
}
-(Point*) getExtrapolatedPointAtTime:(double)X fromLatitudeA:(Point*)latA andLatitudeB:(Point*)latB andLongtitudeA:(Point*)longA andLongtitudeB:(Coord*)longB
{
    double extrapolatedLatitude = [self getExtraploatedValueAt:X withPointA:latA andPointB:latB];
    double extrapolatedLongtitude = [self getExtrapolatedValueAt:X withPointA:longA andPointB:longB];
    Coord* extrapolatedPoint = [Coord new];
    extrapolatedPoint.longtitude = extrapolatedLongtitude;
    extrapolatedPoint.latitude = extrapolatedLatitude;
    return extrapolatedPoint;
}

不确定我的功能是否正确,但您可以在这里查看: http://en.wikipedia.org/wiki/Extrapolation

真的很简单。

您应该实施线性外推法。 如果您发现线性外推法不够用(例如对于曲线),您应该迭代并使用其他一些外推算法对其进行更改。

另一种方法是在动画中延迟 1 秒,并使用插值在两个已知点之间制作动画。我不知道这是否适合您的用例。

这个问题通常可以用 "Dead Reckoning" 来解决。并且您尝试使用卡尔曼滤波器来执行此操作是正确的。如果 iKalman 不适合你,你可以尝试求助于更简单的方法。

在处理游戏和网络延迟时,有很多此类问题可以解决,因此您可以重用为此目的开发的算法。

This seems like a pretty thorough example.

The wiki on Kalman filters may help out as well.

我最终通过使用从当前状态开始的缓动来代替 (2-3) 秒的长 UIView 动画解决了这个问题。这给人的印象是位置和航向遵循 "for free"。