В принципе, я хочу знать направление iPhone, указывающее с высокой точностью, я попробовал CLLocationManager: проблема в том, что CLHeading.magneticHeading возвращает double, например 36.44323, но затем, когда я начинаю поворачивать устройство, CLLocationManager только обновляет направление, когда оно достигает 1 градус, поэтому цифры читаются следующим образом: 36.44323, 37.44323, 38.44323 и т. Д. Возможно ли иметь больше точности?Можно ли получить точность менее точности в заголовке компаса iOS?
ответ
Не знаю, что я знаю, нет.
И не путайте точность с правильностью; просто потому, что он говорит, что 36.44323 не означает, что он является точным до 5 знаков после запятой. Оценки ошибок на этом значении могут быть ± 1 градус :(
Я не думаю, что компас на iPhone имеет достаточно высокую точность с любой реальной уверенностью, какое направление вы указываете на нужную вам точность.
Меня не волнует правильность номера, но меня интересует очень небольшое изменение в направлении устройства. Должна быть причина, по которой полученное число будет двойным, а не целочисленным, – sadegh
Если вы не заботитесь о точности, но интересуетесь небольшими изменениями в направлении, то вы можете посмотреть на CMMotionManager
. (deviceMotion
), который позволит вам получить attitude
устройства, в частности yaw
. Записывая разницу (скажем x
) между рысканием & магнитный заголовок в каждом обновлении заголовка вы можете получить приблизительный заголовок между обновлениями как yaw + x
. Вы получите более своевременные обновления от CMMotionManager
, так как вы можете сами установить deviceMotionUpdateInterval
.
Если я правильно помню, значение yaw
возвращается в радианах между -pi и пи так что вам нужно будет конвертировать обратно в градусах при расчете x
как CLLocationManager
вернется магнитный курс в градусах (от 0 до 360).
Возможно, вы захотите также внести коррективы в ориентацию устройства. Компас возвращает данные заголовка с верхней части устройства, поэтому, если вы находитесь в LandscapeLeft, вам нужно будет вычесть 90 ° из значения курса, landscapeRight вам нужно будет добавить 90 ° в значение курса, а для портретаUpsideDown потребуется настройка 180 ° ,
Вы должны использовать гироскоп, если вам нужна более высокая точность. Данные о движении устройства от CoreMotion должны помочь вам в этом. Компас действительно недостаточно точен.
CLLocationManager
headingFilter
до kCLHeadingFilterNone
или что-то меньшее, чем стандартная 1 градус.
это не повысит точность , он будет обновляться чаще –
Установили ли вы 'желаемое свойство 'на' CLLocationManager' 'kCLLocationAccuracyBestForNavigation'? Это будет использовать больше, чем просто магнитометр (например, гироскоп). Может быть, это даст вам лучшую точность? – larsacus
Да, проверено это, но результат тот же, я тоже сделал это без везения: 1 - установка заголовкаFilter до менее 1, а также установка его в kCLHeadingFilterNone, 2- создание отдельного потока для чтения данных CLLocationManager вручную между обновлениями и 3- для вызова stopUpdatingHeading в конце метода didUpdateHeading и повторного включения его с помощью отдельного потока, но результат не является надежным, так как для достижения стабильности требуется некоторое время. – sadegh