3

Мне нужно получить обновленное местоположение пользователя не менее 10 Гц для плавного анимирования местоположения в MapBox для iOS во время вождения. Поскольку Core Location предоставляет только одну точку каждую секунду, я считаю, что мне нужно сделать некоторое предсказание.Интерполяция и прогнозирование CLLocationManager

Я пробовал ikalman, но он не имеет никакого значения при обновлении один раз в секунду и запрашивается при 10 Гц.

Как справиться с этим, пожалуйста?

+0

только из любопытства: почему 10 Гц? При вождении автомобиля проблески каждых трех секунд слишком часто, чтобы держать дорогу и не ударять по препятствиям ... одна идея, чтобы получить это, чтобы использовать данные гироскопа и акселерометра ... – Volker

+0

Потому что, если Apple сможет анимировать его гладко, мы также должны быть в состоянии. Взгляд может длиться 1-2 секунды, и за это время он должен двигаться по пути красиво и не прыгать. –

+0

, если вы обновляете дважды в секунду и анимируете позицию через CoreAnimation, пользователь получит гладкое изображение ... если вы обновляете один раз в секунду и анимируете то же самое с временем анимации в одну секунду, это также должно сделать трюк. и намного проще, чем делать много математики. – Volker

ответ

1

Я решил решить эту проблему, используя длинные анимации UIView вместо (2-3) секунд с ослаблением, которое начинается с текущего состояния. Это создает впечатление гладкого положения и заголовка, следующего за «бесплатно».

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

Эта проблема обычно решается с помощью чего-то, называемого «Dead Reckoning». И вы на правильном пути, пытаясь использовать фильтр Kalman для этого. Если iKalman не работает для вас, вы можете попытаться использовать более простой подход.

Существует множество подобных проблем при работе с играми и латентностью сети, поэтому вы можете, вероятно, повторно использовать алгоритм, разработанный для этой цели.

This seems like a pretty thorough example.

The wiki on Kalman filters may help out as well.

Смежные вопросы