Как реализовать одометр на iPhone - PullRequest
2 голосов
/ 15 сентября 2010

Я работаю над довольно упрощенным приложением для iPhone для поездок на велосипеде и т. Д.

Одной из функций, которые я хотел бы реализовать, является одометр.

Я периодически получаю местоположение с помощью didUpdateToLocation.

Я пытался измерить расстояние между newLocation и oldLocation и накапливать результат, но это не очень точно. Суммарное значение, как правило, намного превышает фактическое пройденное расстояние.

Какой алгоритм я могу использовать для повышения точности этого расчета?

Ответы [ 2 ]

1 голос
/ 04 октября 2010

Я пытаюсь понять это и думаю, что что-то можно сделать с помощью свойства CLLocationManager distanceFilter.Свойство позволяет ограничить didUpdateToLocation делегирование вызовов обновлениям, которые находятся на минимальном расстоянии от предыдущего обновления.Например, с проблемой одометра, скажем, вы стоите на месте, но GPS ошибочно сообщает о положении на 1 м вокруг вас.Если вы установите distanceFilter на 2, то ни одно из этих обновлений не будет зарегистрировано как движение.

Хитрость заключается в том, чтобы найти значение distanceFilter, которое работает, и я считаю, что это как-то связано сhorizontalAccuracy GPS (который я предполагаю является причиной ошибочных обновлений) и скорость, с которой вы путешествуете.horizontalAccuracy должно быть хорошо для активного отдыха, но предполагается, что эти небольшие неточности накапливаются и приводят к неправильным показаниям одометра.

Если каждый вызов didUpdateLocation вносит небольшую ошибку (скажем, додо 10 см на чтение), тогда имеет смысл медленная активность, такая как ходьба, будет крайне неточной, если на каждый метр звонить по номеру didUpdateToLocation.Это будет до (10 см / 1 м =) 10% ошибок на обновление.Если это было сделано на автомобиле, движущемся со скоростью 100 км / ч, а distanceFilter был установлен на 10 м (что является безопасным параметром, поскольку автомобиль, движущийся со скоростью 100 км / ч, будет двигаться очень близко к прямой линии более 10 м), то это то же самоеошибка 10см будет иметь максимум (10см / 10м =) 1% ошибок на обновление.Возможно, это сложнее, чем это, но я пытаюсь проиллюстрировать, что скорость играет роль.

Я думаю, что решение состоит в том, чтобы выбрать значение для distanceFilter, которое минимизирует ошибочные обновления, но самое главное учитываетскорость пользователя (например, с автомобилем в предыдущем примере).Кто-нибудь хочет выяснить алгоритм или формулу?

1 голос
/ 16 сентября 2010

Звучит так, будто плохой сигнал GPS перемещает (сообщается) местоположение вашего устройства повсюду, что ваше приложение интерпретирует как пользователь, постоянно меняющий направление.Возможно, это поможет разделить движение от одного местоположения к другому на его x- и y-компонент и пропустить их через какой-то фильтр нижних частот.Это должно минимизировать эффект «плохих» обновлений, которые приводят к тому, что ваше местоположение полностью пересекает ваш фактический путь.

...