Неправильные значения направления компаса с CoreMotion

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

Сначала моя инициализация CoreMotion. У меня есть объект CMMotionManager, locationManager, который является экземпляром CMMotionManager.

// initialize CoreMotion
motionManager = [CMMotionManager new];
[motionManager setDeviceMotionUpdateInterval:1.0/30.0];
[motionManager setShowsDeviceMovementDisplay:YES];
[self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical];

Данные о местоположении обновляются каждые 1 / 30,0 секунды.

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

После калибровки компаса направление на север и юг верное в течение почти 2-5 секунд.

Сразу через пару секунд компас сходит с ума, и углы прыгают. В основном он парит под углом 10-20 градусов от исходного положения в обоих направлениях. Должен быть странный результат. Через 30-60 секунд время от времени юг и север меняются местами или показывают восток и запад.

На WWDC 2011 обсуждалась сессия о том, как они рассчитывают каждый датчик с другим, чтобы компенсировать эти проблемы. Что я упустил при настройке CoreMotion из-за огромных проблем с точными результатами определения курса?

Я протестировал компас на 3 устройствах (2 iPhone 4s и iPhone 4) в зданиях и за их пределами. Я был на полях, в маленьких и больших городах. Так происходит все время. В моих тестах образец компаса от Apple почти точен с точностью 90%. К сожалению, его исходный код не открыт от Apple.

Спасибо за чтение.


person SMP    schedule 06.02.2012    source источник


Ответы (1)


Используя CoreMotion от до CoreLocation, вы получите то, что ищете.

По умолчанию трубка выполняет калибровку, показанную на рисунке 8, чтобы отключить ее, замените locationManagerShouldDisplayHeadingCalibration: следующим образом:

- (BOOL)locationManagerShouldDisplayHeadingCalibration: (CLLocationManager *)manager {
    return NO; 
}

Из кода вашего вопроса не ясно, звоните ли вы startUpdateHeading. Если нет, сделайте так:

if( [CLLocationManager locationServicesEnabled] && [CLLocationManager headingAvailable]) {
    [myLocationManager startUpdatingLocation];
    [myLocationManager startUpdatingHeading];
}

Вы можете получить сумасшедшие результаты, если не включите фильтр заголовков, я бы порекомендовал вам это сделать. После этого вы просто получаете изменения заголовка в делегате вашего менеджера местоположения при вызове didUpdateHeading.

Также обратите внимание, что если телефон находится в альбомном режиме, вам необходимо отрегулировать заголовок на соответствующее количество градусов (+/- 90), так как заголовок всегда находится в справочной системе «Портрет».

person quellish    schedule 08.02.2012
comment
Спасибо за ваш ответ. У меня есть крайний срок для другого проекта в понедельник, и я не могу его сейчас протестировать. Я проверю ваше предложение. Звучит неплохо. Я дам вам знать больше через несколько дней. Спасибо! - person SMP; 11.02.2012
comment
что вы имеете в виду «Использование CoreMotion через CoreLocation»? У меня аналогичная проблема, и похоже, что заголовок из CoreLocation в основном правильный, но в CoreMotion, если мы устанавливаем опорный кадр на истинный север, данные о движении устройства, кажется, прыгают и / или дрейфуют. - person pzo; 30.01.2016