Неправильные значения заголовка компаса с CoreMotion - PullRequest
8 голосов
/ 06 февраля 2012

Я использую 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, которая показывает мне текущий курсный компас, обновляемый при каждом интервале обновления. Пока приложение запускается, мне всегда приходится делать магические 8 для калибровки компаса.

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

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

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

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

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

1 Ответ

4 голосов
/ 09 февраля 2012

Использование CoreMotion - CoreLocation даст вам то, что вы ищете.

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

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

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

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

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

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

...