Проблема в поиске скорости при использовании CLLocationManager - PullRequest
3 голосов
/ 07 июня 2011

Я разрабатываю приложение для спидометра в iPhone.Я использовал CLLocationManager (на основе GPS) для измерения скорости автомобиля.Но я не получаю точную скорость.Я перепробовал все методы фильтрации, приведенные в различных обсуждениях в стеке потока.Но я не получаю никакого улучшения.Иногда скорость достигает большего значения (> 400 км / ч).

Я не знаю, что идет не так.Пожалуйста, предложите мне любой код, чтобы получить точную скорость.

Заранее спасибо,

Я следил за обсуждениями ниже стека по потоку

Измерение скорости через iPhoneSDK

Оптимизация CLLocationManager / CoreLocation для более быстрого извлечения точек данных на iPhone

Скорость CLLocation

Почему моя скорость CLLocation такая неточная?

В настоящее время я реализовал следующий код:

//locationManager declaration in ViewDidLoad

locManager=[[CLLocationManager alloc]init];
locManager.delegate =self;
[locManager startUpdatingLocation];           


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    NSTimeInterval locationAge = abs([newLocation.timestamp timeIntervalSinceNow]);

    if (locationAge > 5.0) return;
    if (newLocation.speed < 0 || newLocation.horizontalAccuracy < 0) return;
    if ((newLocation.horizontalAccuracy < (oldLocation.horizontalAccuracy - 10.0)) || (newLocation.horizontalAccuracy < 50.0)|| (newLocation.horizontalAccuracy <= 150.0))
    {
        if(oldLocation != nil)
        {
            CLLocationDistance distanceChange = [newLocation distanceFromLocation:oldLocation];

            NSTimeInterval sinceLastUpdate = [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp];


            double calculatedSpeed;
            calculatedSpeed = (distanceChange / sinceLastUpdate)*3.6;   // to convert the speed into kmph.

        }       
    }

}

1 Ответ

4 голосов
/ 07 июня 2011

Даже если вам не нравятся встроенные элементы скорости, вы можете просто свернуть свою собственную.

Скорость - это расстояние во времени, верно?

Если у вас есть два CLLocation с, вы можете сделать:

CLLocationDistance distance = [aLocation distanceFromLocation:bLocation];

distance теперь является плавающей точкой расстояния между этими двумя точками в метрах. И эти два CLLocations тоже имеют timestamp свойства, верно? Содержит объекты NSDate. Ну ...

NSTimeInterval timediff = [aDate timeIntervalSinceDate:bDate];

timediff - разница в секундах.

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

Я полагаю, что это все, что происходит, чтобы получить свойство speed объекта CLLocation, который вы получаете. Но, эй, хочешь быть ближе к математике, иди прямо.

Оттуда вы можете конвертировать в любые единицы, которые вам нравятся. В миле 1609,344 метра. В часе 3600 секунд.

СЕЙЧАС: Это такой же недостаток, как и при расчете скорости, основанном исключительно на GPS, в том смысле, что вы не будете получать идеально размеченные отметки обновлений местоположения, а иногда они будут ошибаться. Если вы потеряете сигнал GPS, и устройство вернется к триангуляции вышки сотовой связи, это может увести вас с дороги куда-нибудь, и это будет выглядеть так, будто вы пристегнуты к ракете, чтобы быстро добраться туда .

...