iPhone CoreLocation: как получить максимально точную скорость - PullRequest
6 голосов
/ 24 февраля 2009

Я экспериментирую с добавлением функции GPS в свое приложение для iPhone. Это приложение для тренировок, которое будет использоваться при ходьбе или беге. Так что я хочу использовать GPS для показа скорости, с которой человек движется в милях в час и в минутах / милях.

Как мне настроить CLLocationManager, чтобы получить наилучшие результаты? Что я должен установить желаемую точность и distanceFilter?

Я пробовал с:

distanceFilter = 10 и требуемая точность = kCLLocationAccuracyNearestTenMeters

и чтение

CLLocation.speed свойство

Тестирование во время движения на моей машине, точность кажется хорошей по сравнению с автомобильным спидометром, хотя обновление требует времени. Я понимаю, что задержка обновления вполне может быть временем, которое требуется для запроса местоположения GPS, но я не уверен, что изменение двух указанных выше параметров даст лучшие результаты.

Должен ли я использовать kCLLocationAccuracyBest и некоторые другие значения для distanceFilter?

Мне интересно слышать, как другие используют CoreLocation для ускорения. Что вы делаете, чтобы получить более точные результаты?

Ответы [ 2 ]

5 голосов
/ 10 апреля 2009

Для достижения наилучших результатов вы должны использовать kCLLocationAccuracyBest. То, что вы положите в свой дистанционный фильтр, зависит от того, с какими неисправностями вы готовы столкнуться. По сути, вам придется принимать решения, основанные на точности и доступности. То есть, в периоды, когда нет лучшего ответа, что вы будете отображать?

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

То есть предположим, что я бегаю со скоростью 6 миль в час на север. Вы прокладываете меня вдоль точки A, точки B, точки C ... затем вы получаете ответ с низкой точностью (возможно, kCLLocationAccuracyNearest100Meters.) Посмотрите на то место, где написано, что я нахожусь, и выясните, "мог бы я дойти до этого определить точку C, если я продолжу свой текущий путь, делая разумные поправки на возможные изменения скорости? " Если это так, то новая точка находится в пределах возможного. (Если нет, то выбросьте это.) Затем спроецируйте из точки C на мою последнюю известную скорость и выясните, где, по вашему мнению, я, баллистически. Сохраните это как баллистическая точка-D.

Конечно, вы используете акселерометр, чтобы получить какой-то инерционный смысл, по которому я пошел, верно? Таким образом, вы не можете знать направление (вы не знаете, куда указывает телефон), но вы можете сделать разумный удар на расстоянии.

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

ПРИМЕЧАНИЕ: при тестировании не просто ездите в зонах с хорошей сотовой связью. Посмотрите, как ваше приложение работает вдали от мобильных телефонов. Многие люди любят кататься на велосипеде и бегать трусцой в этих местах!

3 голосов
/ 24 февраля 2009

Отказ от ответственности: я только немного поиграл с CoreLocation, я не очень тщательно проверял точность.

Я ожидаю, что вы получите наиболее точные результаты, используя значения по умолчанию для distanceFilter и требуемой точности. Менее частые обновления дадут вам меньше данных для работы.

Одна проблема, с которой вы, вероятно, столкнетесь, это то, что исправление местоположения некоторое время теряется, а затем возвращается. Наивный подход «соединяй точки» для определения пройденного расстояния будет склонен недооценивать фактическую скорость бегуна. Вместо использования CLLocation.speed вы можете получить более точные результаты, вычисляя скорость на основе некоторого эвристического приближения к линии, по которой фактически следует бегун.

...