插值和预测CLLocationManager

时间:2015-01-19 11:56:10

标签: ios core-location cllocationmanager prediction kalman-filter

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

我已经尝试了ikalman但是,如果每秒更新一次并以10赫兹查询,它似乎没有任何区别。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

你要找的是外推,而不是插值。

我真的非常惊讶于互联网上推断的资源非常少。如果你想了解更多,你应该阅读一些数值方法/数学书并自己实现算法。

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

// 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秒,并使用插值在两个已知点之间设置动画。我不知道你的用例是否可以接受。

答案 1 :(得分:1)

此问题通常通过称为“航位推算”的方式解决。而且你正试图使用​​卡尔曼滤波器来实现这一目标。如果iKalman不适合您,您可以尝试采用更简单的方法。

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

This seems like a pretty thorough example

The wiki on Kalman filters may help out as well

答案 2 :(得分:1)

我最终通过使用长UIView动画来解决这个问题,而不是(2-3)秒,从当前状态开始缓动。这给人的印象是平稳的位置和标题跟随"免费"。