Compass True Heading в iPhone / iPad - PullRequest
       16

Compass True Heading в iPhone / iPad

12 голосов
/ 12 сентября 2011

У меня возникли проблемы при разработке компаса для iPhone / iPad.

TrueHeading, взятый из CLHeading всегда, дает мне значение -1, я застрял здесь.Вот мой код:

self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
self.locationManager.headingFilter = 0.5; //1 degrees
[self.locationManager startUpdatingHeading];

Я также кое-что узнал, то есть, когда я в приложении карты или в приложении компаса, которое использует материал для определения местоположения, значение trueHeading внезапно показало правильное значение.Интересно, в чем причина, есть идеи?Это происходит как на iPhone4, так и на iPad.

Это также происходит всякий раз, когда я отключаю Службы определения местоположения в настройках и повторно включаю его, он не сможет прочитать правильное значение trueHeading, интересно, потому что службы определения местоположения не могут быть включены приложением, которое я создал?

в любом случае, спасибо заранее

--- Мое решение ---

см. Ниже.

Ответы [ 8 ]

7 голосов
/ 20 сентября 2011

, чтобы избежать повторного появления заголовка -1.000000, это НЕ ПРОСТО запускает startUpdatingHeading, а запускает startUpdatingLocation вместе, это помогает.

4 голосов
/ 12 сентября 2011

Попробуйте использовать это ...

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate=self;
    locationManager.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
    // Start heading updates. 
    if (locationManager.headingAvailable && locationManager.locationServicesEnabled) 
    {
        locationManager.headingFilter = kCLHeadingFilterNone; 
        [locationManager startUpdatingHeading];
    }

и после этого CLLocationManager вызывает методы делегата

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

    // Use the true heading if it is valid. 
    [lblAccuracy setText:[NSString stringWithFormat:@"%.1fmi",newHeading.headingAccuracy]]; 
}

Но эта кодировка работает на устройстве, а не в симуляторе ...

Счастливого кодирования ..

2 голосов
/ 19 июля 2012

--- Мое решение ---

То, что я сделал, добавьте [self.locationManager startUpdatingLocation] до или после [self.locationManager startUpdatingHeading]; (когда служба определения местоположения отключена и повторно-Включить в настройках).Я не уверен, что это хорошее решение, но это то, что я сделал, чтобы оно работало, если у вас есть какое-нибудь лучшее решение, пожалуйста, поделитесь.

1 голос
/ 04 ноября 2011

У меня были некоторые проблемы с менеджером местоположения, и я обнаружил, что для меня это помогло отключить iPhone от компьютера при тестировании.Каким-то образом предупреждение о калибровке появляется только после отключения iPhone.

0 голосов
/ 24 марта 2016

Работаем над этой проблемой сейчас. Я могу получать обновления от Core Motion при использовании SpriteKit. Речь идет о возможности вызывать функцию непрерывно, например, один раз за кадр (1/60 секунды) или каждые несколько кадров. Без использования SpriteKit в документации говорится, что вызовы обновлений должны быть закрыты, что, как я полагаю, будет происходить в их собственном потоке и будет зависеть от вас.

Существует алгоритм для преобразования показаний магнитометра в фактические градусы относительно истинного севера. Изобразите график, который выглядит как функция переменного тока во временной области, и вы увидите, что интерполяция данных - это простой вопрос применения уравнений Максвелла. Вот пример на Honeywell

0 голосов
/ 03 марта 2016

Когда службы определения местоположения отключены, didUpdateHeading delegate method возвращает только магнитный курс.Вы можете использовать его в соответствии с вашими потребностями.Согласно Apple docs ..

Чтобы начать доставку связанных с заголовком событий, назначьте делегата объекту менеджера местоположений и вызовите его метод startUpdatingHeading.Если обновления местоположения также включены, диспетчер местоположений возвращает значения истинного и магнитного курса.Если обновления местоположения не включены, диспетчер местоположений возвращает только значение магнитного курса.

0 голосов
/ 05 мая 2014

ИСТИННОЕ чтение требует знания магнитного отклонения для места, где вы используете компас. Из предыдущего обсуждения кажется, что функция, которая корректирует истинное направление от магнитного направления, нуждается в вашем местоположении для получения значения отклонения. Если вам не нравится использовать информацию GPS о местоположении в вашем коде, я предлагаю прочитать магнитные показания и исправить значение самостоятельно. Сначала необходимо получить вариацию для нужного местоположения, а затем применить следующую формулу: T = M ± V, где T - истинное направление, M - магнитное показание компаса, а V - вариация. Используйте «+» для Востока и «-» для Запада. Я обнаружил, что разрешающий веб-сайт предоставляет вариацию (магнитное склонение) для любого необходимого местоположения: http://www.geomag.nrcan.gc.ca/calc/mdcal-eng.php.

0 голосов
/ 21 января 2013

У меня была такая же проблема. Я переместил startUpdatingHeading в действие кнопки, затем переместил его обратно туда, где расположен CLLocationManager - где он работал нормально - и он начал возвращать только -1.

Я перезагрузил свой iPad, и он снова начал работать. Надеюсь, так и останется.

Редактировать: Нет, это не так. Мне пришлось использовать startUpdatingLocation тоже. Разве это не изнашивает батарею, хотя? Я установил желаемую точность на kCLLocationAccuracyThreeKilmeters, потому что я все равно не использую данные о местоположении.

...