8

Я использую CoreMotion для получения заголовка ccompass, и я заметил некоторые проблемы с заголовком компаса.Неправильные значения заголовка компаса с 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.

Благодарим вас за чтение.

ответ

3

Использование CoreMotion через В результате ссылки на CoreLocation вы найдете то, что ищете.

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

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

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

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

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

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

+0

Благодарим вас за ответ. У меня есть крайний срок в понедельник для другого проекта, и я не могу проверить его прямо сейчас. Я проверю ваше предложение. Звучит неплохо. Я сообщу вам через несколько дней. Спасибо! – DasFuxx

+0

извините за задержку. iam тестирует его прямо сейчас =) – DasFuxx

+0

Что вы подразумеваете под «Использование CoreMotion через CoreLocation»?У меня есть аналогичная проблема, и это швы, идущие из CoreLocation, в основном правильны, но в CoreMotion, если мы устанавливаем опорный кадр на настоящий север, тогда данные движения устройства, кажется, прыгают и/или дрейфуют. – pzo