Многие наслышаны о проблеме с неоткалиброванными датчиками в новом iPhone 5S – инструмент «уровень», встроенный в родной компас iOS 7 показывает отклонение в несколько градусов, если устройство положить на плоскую поверхность, например, стол.
Если кратко, то в той или иной степени проблема ориентации датчиков присутствовала всегда и на всех устройствах с iOS. Ранее проблему не наблюдали так часто в виду отсутствия встроенного в мобильную OS приложения позволяющего измерять уровень. Аналогичная проблема имеет место быть и на других мобильных устройствах оснащенных акселерометром, поскольку принципы везде заложены одинаковые – с этим не понаслышке должен быть знаком каждый разработчик, которому приходилось иметь дело с различными датчиками движения и ориентации.
Я разрабатываю приложения с использованием датчиков акселерометра, гироскопа и цифрового компаса, ровно с тех самых пор, как разработчикам стал доступен API, практически с самого начала – будучи автором одного из самых популярных компасов для iOS с проблемами калибровки акселерометра и точности других датчиков я столкнулся еще несколько лет назад.
Способ решения проблемы достаточно тривиален и уже заложен в большую часть, как прикладных, так и игровых приложений, которые тем или иным образом используют датчики гравитации, движения и магнитного поля – калибровка, о которой должен позаботиться любой уважающий себя и своих пользователей разработчик. В зависимости от того, насколько сложно приложение и какие задачи оно решает, с технической точки зрения разработчика, реализация решения может быть и простой и сложной. Но принцип одинаков для всех.
Приглашаю разработчиков и пользователей приложений разобраться, как это работает, откуда берутся эти ошибки, почему не стоит излишне беспокоиться о проблемах акселерометра и почему не нужно бежать бегом в магазин для замены «бракованного» устройства – новое устройство вряд ли будет намного лучше, а проблемы с ошибками датчиков решаются другими способами.
Как все было
Более четырех лет назад передо мной стояла задача разработки не обычного аналога двухмерного компаса, который поставлялся в комплекте с iOS, а компаса с использованием дополненной реальности, функционирующего в трехмерном пространстве и с высокой точностью совмещения виртуальных меток накладываемых на видео в реальном времени.
Чтобы совместить виртуальную метку объекта с его реальным положением на картинке получаемой с камеры, необходимо использовать все датчики движения имеющиеся в мобильном устройстве.
Акселерометр нужен для определения вектора гравитации или, выражаясь простым языком, чтобы узнать какая часть устройства смотрит вниз. Датчик цифрового компаса или магнетометр нужен для ориентации по сторонам света, чтобы узнать какой стороной устройство направлено на север. Позже появился гироскоп определяющий вращение устройства и, соответственно, позволяющий существенно повысить точность полноценной ориентации в трехмерном пространстве.
По мере разработки приложения и появления возможности использовать новые датчики практически сразу выявились индивидуальные недостатки присущие сенсорам.
Как оказалось во всех устройствах датчики выдают неодинаковые данные, различающиеся в пределах определенной погрешности, где-то отклонения больше, где-то меньше – при этом на показания сенсоров влияет целый ряд различных неочевидных факторов.
Изначальная реакция не имеющего опыта в этой сфере на тот момент была похожей на описанную в статьях про неправильно установленный сенсор в iPhone 5S, но дальнейшее изучение вопросов заставило изменить мнение и продолжить разработку не ожидая того, что производитель что-то может и будет исправлять, а учитывая особенности каждого из нужных сенсоров.
В результате из высокотехнологичной игрушки с проблемами с точностью получился достаточно точный пригодный для реального использования инструмент – главное, нужно знать, как им правильно пользоваться, что напрямую вытекает из особенностей каждого сенсора, о чем я в подробностях пишу ниже.
Акселерометр
Поскольку в отличие от стандартного компаса работающего только в одной ориентации мое приложение должно было работать в любой из возможных, то уже на ранних этапах, еще до появления гироскопа, обнаружилась одна весьма странная особенность акселерометра.
Оказалось, что помимо того, что в каждом устройстве акселерометр имеет небольшое отклонение, в рамках одного и того же физического устройства это отклонение различно для разной ориентации устройства – например, в обычной портретной ориентации отклонение от реальной оси гравитации может быть в 1°, при этом, при повороте на 180°, в перевернутой портретной может быть и 4°.
Решением стало добавление возможности калибровки акселерометра раздельно для каждой из шести возможных ориентаций, а появление гироскопа дало новые возможности – калибровка датчиков движения, соответственно, в том или ином виде, уже имеется в каждом приличном приложении, их использующем.
Разработчикам игр пришлось несколько полегче – в играх достаточно поддерживать одну-две ориентации устройства, но все равно невозможно просто обойти стороной необходимость дать пользователю возможность использования калибровки даже с использованием датчика гироскопа.
В «уровне» встроенном в компас iOS 7 калибровка осуществляется просто нажатием на экран – достаточно коснуться экрана и текущее положение устройства будет считаться опорным или «нулевым» положением.
Компас и GPS/GLONASS (хотя казалось бы)
До появления гироскопа датчиком отвечающим за ориентацию в плоскости горизонта по сторонам света был сенсор цифрового компаса – самый чувствительный ко внешним факторам из всех датчиков и, соответственно, имеющий наибольшие проблемы с точностью.
Калибровка компаса осуществляется постоянно на уровне драйвера по мере того, как устройство вращается – чем больше данных получит устройство, тем точнее будет результат, но все равно будет присутствовать погрешность.
Абсолютное решение проблемы точности компаса, к сожалению, практически невозможно только с помощью калибровки. Хотя точность она и повышает. В iOS 7 встроенный компас имеет еще более жестокую калибровку, чем в предыдущих версиях ОС. Теперь экран калибровки закрывает весь экран, пока пользователь не произведет необходимые действия. В старых версиях было сообщение небольшого размера, которое не перекрывало экран.
Даже калибровка компаса и постоянная фильтрация данных особо не помогут в условиях неоднородного магнитного поля – ведь обычно после калибровки компаса человек поворачивается вокруг собственной оси, а не вокруг оси устройства, что при повороте на 90° смещает устройство в пространстве примерно на полметра, где могут быть другие магнитные условия.
Вблизи сильных магнитных полей, металлических объектов, проводов под напряжением показания магнетометра нестабильны из-за весьма высокой чувствительности к электромагнитным излучению – особенно это заметно в помещениях и машинах, которые чем более и более современны тем более и более нашпигованы всевозможной электронной начинкой.
Плюс ко всему, если от компаса требуется показывать географический север, то в дело вступает точность определения местоположения с GPS и GLONASS, так как координаты используются для определения магнитного склонения или разницы между направлениями к магнитному и серверному полюсам в конкретной точке земного шара.
Магнитный компас хорошо и точно работает на улице в полевых условиях, где нет магнитных помех – но даже при этом калибровка компаса желательна при каждом измерении азимута.
Направление на северный полюс наиболее точно определяется при хорошей точности GPS, также обычно на улице.
Для дальнейшего повышения точности, где она требуется, например, если нужно правильно нацелить друг на друга антенны Wi-Fi или радиосвязи, или произвести какие-либо точные измерения, уже нужна более глубокая поддержка на стороне приложения, о чем ниже.
Гироскоп, гирокомпас и автомобильный режим
В помещении, в машине, в лодке или в любом другом средстве передвижения, а также когда требуется более высокая точность и стабильность ориентации обычный магнитный компас не подходит – нужна ориентация либо по курсу движения, либо по гироскопу.
Соответственно, в своем приложении я реализовал обе эти возможности – для использования в различных средствах передвижения есть «автомобильный» режим и режим «гирокомпаса» для всего остального.
С автомобильным режимом все просто – используется курс движения, что зависит только от точности GPS и GLONASS, и, соответственно, достаточно точно определяется направление во время движения пешком, на велосипедах авто, лодках, самолетах и так далее.
С гирокомпасом ситуация одновременно и легче, и несколько сложнее.
В режиме гирокомпаса можно точно задать начальное или поправить текущее направление используя какой-либо внешний ориентир – солнце, луну, звезды, географические объекты, поросшую мхом сторону дерева, сориентироваться при помощи карт или используя другие методы.
Делается это просто для пользователя. Маркер наложенный на видео в реальном времени или указующая на объект стрелка на циферблате компаса совмещается с реальным положением объекта или с направлением на него. Вся сложная математика основанная на тысячах строк формул остается незаметной на уровне приложения.
Примерно те же действия выполняют пилоты или персонал обслуживающий современные военные самолеты, суда – проверка и последующая калибровка систем инерциальной навигации осуществляется в начале рейса и во время него, что также облегчается фиксированным расположением датчиков, тогда, как наши мобильные устройства находятся почти в постоянном движении.
Казалось бы гирокомпас является идеальным решением проблемы точности компаса и ориентации по сторонам света, но здесь есть и свои подводные камни.
В промышленных и военных системах инерциальной навигации, в отличие от того, что на сегодня есть в мобильных устройствах, для точного определения положения в пространстве используются целый комплекс, массив датчиков, что позволяет компенсировать ошибки и погрешности в показаниях.
В мобильных устройствах обычно присутствует только по одному экземпляру каждого датчика, что делает невозможным компенсацию ошибок и приводит к накоплению ошибки.
Чем больше времени проходит с момента калибровки гирокомпаса, а точнее, если смотреть с технической точки зрения, с момента определения опорного «нулевого» положения, тем больше накопленная ошибка, которая выражается в периодическом смещении ориентации гироскопа.
Приведенное ниже видео иллюстрирует проблему.
На видео снят компас в режиме «гирокомпаса» настроенный точно на сервер запущен на устройстве, которое неподвижно лежит на столе. Несмотря на то, что устройство неподвижно с течением времени происходит смещение. На 00:09 смещается с 0° на 359°. На 01:21 уменьшается до 358°. На 03:03 мы уже видим азимут 357°.
Накопление ошибки происходит из-за дискретности датчиков, которые в некоторые моменты могут пропускать события, как, например, на видео выше на показания гироскопа влияют мельчайшие вибрации вентиляторов блоков питания в мониторе и компьютере находящимися рядом на столе. Датчики, конечно, прогрессируют со временем, получают более высокое разрешение, но дискретность данных остается. Соответственно, на показания могут влиять и такие незначительные вещи, как сердцебиение и пульс.
На микромеханические системы таких сенсоров влияют и такие неочевидные факторы, как окружающая температура – температура хоть и недоступна для обычных разработчиков, но она учитывается для коррекции данных датчиков на уровне драйверов самой ОС.
При этом ориентация по гироскопу намного точнее, чем по датчику компаса – при развороте на 180° сенсор сообщает, что поворот составил те же 180°, а не 150°, как, например, может сказать компас в условиях помех.
Просто стоит иметь в виду, что у гироскопа есть такая особенность и учитывать это при использовании устройства в качестве того или иного инструмента или при разработке ваших собственных приложений и игр.
А как же новый сопроцессор движения M7?
С анонсом M7 я надеялся, что мобильные устройства станут ближе к большим системам инерциальной навигации, но, к сожалению, этот новый сопроцессор решает немного другие задачи.
Прежде всего M7 предназначен для снижения расходов энергии батареи при использовании GPS и других сенсоров. Тратится меньше времени на обсчет данных со спутников за счет того, что этот обсчет не начинается с нуля при запуске приложения. Дополнительно данные от других сенсоров собираются в фоновом режиме, даже когда приложение не запущено, что также позволяет уменьшить расход заряда батареи.
Например, на видео иллюстрирующем ситуацию с накоплением ошибки в гироскопе, приведенном выше, компас в режиме гирокомпаса работает на новом iPhone 5S уже с использованием M7.
Можно ли доверять мобильным устройствам?
Ответ – да, зная и учитывая особенности используемых датчиков.
Разработчики сделают собственные выводы самостоятельно.
Пользователям же, которым было интересно дочитать до конца, позволю себе дать несколько советов.
Менять устройство нет особой необходимости. Оно может быть не лучше. Да и кто сказал, что поверхность используемого стола строго перпендикулярна к вектору гравитации?
В играх с тактильным управлением, если ошибка акселерометра или гироскопа явно заметна, ищите в настройках или в режиме паузы меню калибровки.
Во всех актуальных приложениях реализующих инструмент «уровень» должна быть калибровка задающая «нулевое» положение – естественно, она есть и во встроенном приложении.
Магнитный компас хорошо работает только в походах на природе. Не стоит ожидать от устройства совершения невозможного пытаясь абсолютно точно определить направление рядом с компьютером, колонками, батареей отопления или в каком-либо средстве передвижения. Используйте те специально предназначенные для этого приложения и режимы, которые максимально соответствуют задаче.
При использовании магнитного компаса помните, что показания актуальны только сразу после калибровки, пока устройство не было перемещено на какое-либо значительное расстояние – поворот на 90° по оси позвоночника уже может потребовать повторной калибровки.
При использовании приложений типа «уровень» или «гирокомпас» помните, что показания датчика актуальны в течение примерно одной-двух минут, что вполне достаточно, чтобы произвести измерение – во избежание накопления ошибки повторяйте калибровку перед каждым измерением для повышения точности измерений.
P.S. Овечаю на вопросы в комментариях :)
Автор: happybyte