SL.pro
Блог · · 9 мин чтения

Как работают приложения-уровни: акселерометр телефона простыми словами

Телефон знает, где низ, благодаря крошечному датчику — MEMS-акселерометру. Этот датчик измеряет, как сила тяжести тянет телефон сразу по трём направлениям. Приложение-уровень читает эти три числа, делает небольшой тригонометрический расчёт и показывает вам угол. И так сотни раз в секунду, внутри чипа, который трудно разглядеть невооружённым глазом. В этой статье разберём, что там на самом деле происходит.

Главное вкратце
  • Акселерометр измеряет, как сила тяжести распределяется по трём осям. Когда телефон лежит неподвижно, он не измеряет движение.
  • Тангаж и крен получаются из формул арктангенса, применённых к этим трём показаниям гравитации.
  • Spirit Level Pro пропускает сырые показания через экспоненциальное скользящее среднее (alpha=0.15), чтобы пузырёк не дёргался.
  • MEMS-датчики уходят от температуры, поэтому калибруйте там, где работаете.
  • Когда телефон неподвижно прижат к поверхности, акселерометр справляется сам. Гироскоп не нужен.
Макроснимок крупным планом чипа трёхосевого MEMS-акселерометра Kionix из мобильного устройства
MEMS-акселерометр внутри телефона меньше рисового зёрнышка, но измеряет силу тяжести точно.

Что такое MEMS-акселерометр?

MEMS — это микроэлектромеханические системы. Чувствительный элемент внутри телефонного акселерометра совсем маленький, несколько сотен микрон в поперечнике, меньше крупинки соли. Он сидит на том же кремнии, что и обычная электроника чипа, и делается так же. Поэтому такие датчики дешёвые и стоят почти в каждом телефоне.

Механизм простой, если его представить. Внутри чипа крошечная масса висит на кремниевых пружинках, вытравленных прямо в кристалле. Когда чип наклоняется, сила тяжести чуть уводит массу в сторону. Это движение меняет зазор между гребёнчатыми металлическими выступами, а вместе с зазором меняется ёмкость между ними. Чип считывает это изменение и превращает его в значение ускорения, в единицах g.

Вот что и делает уровень возможным. Когда телефон лежит неподвижно, акселерометр читает не движение. Он читает, какая часть силы тяжести приходится на каждую из его трёх осей. Сила тяжести постоянна и известна. Если знать, как она делится между тремя осями, можно точно вычислить, как наклонён телефон.

Как трёхосевой акселерометр измеряет наклон?

У трёхосевого акселерометра есть свои направления: X идёт слева направо, Y — сверху вниз, Z — спереди назад. Положите телефон плашмя на стол, и сила тяжести почти целиком приходится на ось Z: Z показывает около 9,81 м/с², а X и Y — почти ноль. Наклоните телефон, и тяжесть перераспределится: меньше на Z, больше на X и Y, пропорционально углу.

Превратить эти три показания в углы — простая тригонометрия. Тангаж — это наклон вперёд-назад, крен — наклон влево-вправо, и оба берутся из арктангенса:

Тангаж = arctan( Y / sqrt(X² + Z²) ) Крен = arctan( X / sqrt(Y² + Z²) )

Эти две строки — вся математическая суть приложения-уровня. Подайте на вход три сырых значения, посчитайте — и получите тангаж и крен в радианах. Умножьте на 180/π, чтобы перевести в градусы. Это и есть число на экране.

Может возникнуть вопрос: почему в знаменателе квадратный корень из двух других осей, а не просто одна ось? Так показание остаётся стабильным при полном повороте. Если делить на одну ось, у вертикали расчёт ломается: эта ось падает до нуля, и вы делите почти на ничто. Совместная величина двух других осей этого избегает.

Отладочная плата трёхосевого MEMS-акселерометра Freescale Semiconductor на белом фоне
Трёхосевой акселерометр измеряет силу тяжести по осям X, Y и Z одновременно.
Посмотрите на физику в реальном времени

Spirit Level Pro показывает живые углы тангажа и крена со сглаживанием EMA, пятью пресетами допуска и калибровкой в одно касание. Загружать ничего не нужно.

Попробовать Spirit Level Pro бесплатно

Почему сырые данные датчика такие шумные?

Сырой сигнал акселерометра скачет сильнее, чем можно ожидать. Даже у совершенно неподвижного телефона показания слегка дрожат. Часть этого — электрический шум самого датчика, часть — вибрация, приходящая через поверхность, часть — ошибка округления при переводе аналогового сигнала в числа. Покажите этот сырой поток на экране, и пузырёк будет дёргаться без остановки, что для аккуратной работы бесполезно.

Шум идёт из нескольких источников. Тепловой шум — это случайные электрические колебания от нагрева. Убрать его нельзя, он задаёт нижний предел того, насколько тихим вообще может быть датчик. Вибрационный шум приходит из окружения: компрессор холодильника, шаги, машины за окном. А ещё нулевая точка датчика сама по себе медленно уходит со временем. Для каждого источника нужно своё решение.

Обычное программное лекарство — фильтр нижних частот. Он пропускает медленные изменения, вроде настоящего наклона, и придерживает быстрые, вроде вибрации. Чаще всего это делают через экспоненциальное скользящее среднее, или EMA. Каждое новое показание берётся с долей alpha, а остальное переносится из предыдущего сглаженного значения:

сглаженное = alpha × новое_показание + (1 - alpha) × предыдущее_сглаженное

В Spirit Level Pro используется EMA с alpha=0.15. Мы пришли к этому числу, перебрав разные значения вручную. При alpha=0.05 показание было гладким как стекло, но медленным, и пузырёк отставал от телефона, когда его двигали. При alpha=0.3 он поспевал хорошо, но дёргался достаточно, чтобы поймать точное значение было трудно. Alpha=0.15 стоит посередине. Пузырёк живой, но не нервный.

Компромисс: чем выше alpha, тем быстрее экран следует за реальным наклоном, но тем больше проходит вибрации. Чем ниже alpha, тем сильнее сглаживание, но тем больше задержка. Alpha=0.15 уравновешивает эти две стороны и устанавливается примерно за 150 мс.

Какую роль играет гироскоп?

Гироскоп измеряет, как быстро телефон поворачивается, в градусах в секунду. Он не измеряет, куда телефон направлен. И это важно. Сам по себе гироскоп не скажет, ровно ли лежит телефон. Он знает только, вращается ли тот и как быстро. Для показания уровня, когда телефон держат неподвижно, у акселерометра уже есть всё нужное.

Гироскоп оправдывает себя, когда телефон в движении, через слияние датчиков. Акселерометры хорошо читают статический наклон, но при быстром движении становятся медленными и шумными. Гироскопы хорошо отслеживают быстрый поворот, но уходят: их мелкие ошибки со временем накапливаются. Комплементарный фильтр или фильтр Калмана смешивает оба: гироскоп берёт на себя быстрое движение, а акселерометр возвращает долговременное показание к истине.

Большинство приложений-уровней, включая Spirit Level Pro, обходятся без слияния датчиков, потому что задача статическая. Вы кладёте телефон, он успокаивается, вы читаете угол. Акселерометр справляется с этим сам. Слияние датчиков важнее там, где что-то летит, например когда дрон отслеживает собственное движение, а не когда вы проверяете полку.

Почему калибровка так важна?

Каждый MEMS-датчик выходит с завода с небольшим встроенным смещением. Это заводское отклонение, и оно одинаково для каждого показания: фиксированная величина в фиксированную сторону. Поэтому чип может показывать градус-другой мимо, даже когда телефон действительно лежит ровно. Это и есть главная причина, почему приложение-уровень выглядит неверным прямо из коробки.

Калибровка это исправляет: измеряет смещение на поверхности, которой вы доверяете как ровной, и сохраняет его. Spirit Level Pro хранит эти значения в localStorage под ключами calibrationPitch и calibrationRoll. С этого момента каждое показание вычитает сохранённые числа до того, как попасть на экран. Смещения больше нет.

Разница большая. Без калибровки телефон со смещением 1,5° показывает мимо на 1,5° на всём. Он может показать 0,0°, лёжа на реальном уклоне в 1,5°. Откалибруйте тот же телефон, и отклонение падает до пары десятых градуса. Это самый большой прирост точности, который вообще можно получить, а стоит он лишь пары секунд.

Как температура влияет на точность?

MEMS-датчики реагируют на температуру. Кремниевые пружинки, держащие пробную массу, расширяются и сжимаются, когда чип нагревается и остывает, а это сдвигает нулевую точку. Занесите телефон из тёплой машины в холодный гараж, и показание немного уйдёт, пока датчик не привыкнет к новой температуре. Сдвиг небольшой, но реальный.

Практический вывод простой: калибруйте при той температуре, при которой собираетесь работать. Калибровка в тёплом кабинете не удержится полностью в холодном гараже. Заморачиваться этим для каждой задачи не нужно. Для картин на стене или проверки полки уход слишком мал, чтобы его заметить. Для тонкой работы в пределах пары десятых градуса дайте телефону минуту-другую привыкнуть после резкой смены температуры, а потом калибруйте.

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

iPhone и Android: железо датчиков разное?

Разное, и это заметно по тому, как ощущается приложение. Apple строит собственный стек обработки движения. В iPhone, начиная с 6s, стоит сопроцессор движения Apple, который обрабатывает данные датчиков отдельно от главного процессора. Флагманы Samsung Galaxy опираются на компоненты STMicroelectronics, где на одном кристалле собраны трёхосевой акселерометр и трёхосевой гироскоп. В телефонах Google Pixel применялись датчики Bosch и TDK InvenSense, в зависимости от года.

После калибровки флагманский iPhone и флагманский Android выходят примерно на одном уровне. Разница, которая действительно имеет значение, — между флагманом и бюджетным Android. В бюджетных телефонах стоит более дешёвый MEMS с меньшим разрешением, и его сырой сигнал шумнее. Калибровка всё равно подтягивает их близко, и для большинства бытовых задач результат нормальный.

Что выделяет iPhone в приложении-уровне, так это не столько акселерометр, сколько сам сопроцессор движения. Он продолжает собирать данные датчиков с высокой частотой, даже когда приложение не на переднем плане, так что у фильтра сглаживания больше замеров для работы. Во многом поэтому iPhone здесь ощущается таким плавным, даже против Android-телефонов с датчиками на бумаге не хуже.

Частые вопросы

Как приложения-уровни работают на телефоне?

Они читают MEMS-акселерометр телефона, который измеряет, как сила тяжести тянет по трём осям (X, Y, Z). Наклоните телефон, и тяжесть перераспределится между осями. Приложение считает по формулам арктангенса тангаж и крен, сглаживает результат, чтобы успокоить шум датчика, и показывает его как пузырёк или число. Всё это идёт сотни раз в секунду.

Насколько точен акселерометр телефона для роли уровня?

Откалиброванный флагман показывает с точностью до пары десятых градуса. Бюджетные Android-телефоны без калибровки показывают хуже, потому что их датчики дешевле и сильнее различаются от экземпляра к экземпляру. Самый важный фактор — калибровка: она убирает заводское смещение и подтягивает близко почти любой телефон. Для большинства бытовых и рабочих задач откалиброванного телефона среднего уровня достаточно.

Использует ли приложение-уровень гироскоп?

Для неподвижного телефона — нет. Акселерометр сам даёт угол наклона. Гироскоп измеряет скорость вращения, а не положение, поэтому не скажет, ровно ли лежит телефон, только как быстро он поворачивается. Некоторые приложения смешивают оба датчика для более плавных показаний в движении, но чтобы прижать телефон к стене и прочитать угол, акселерометр справляется сам.

Почему приложение-уровень показывает немного неверно даже на ровной поверхности?

Обычно дело в заводском смещении. У каждого MEMS-чипа есть небольшое встроенное отклонение, из-за которого он показывает не ноль, даже когда телефон лежит ровно. Калибровка на поверхности, которой вы доверяете, его убирает. Другие причины — температурный уход, чехол, который приподнимает один край телефона над поверхностью, или пыль под телефоном. Калибровка на чистом стеклянном столе после резкой смены температуры решает большую часть проблем.

Полная картина

Приложения-уровни работают, потому что физика за ними надёжна. Сила тяжести постоянна, акселерометр измеряет её постоянно, а тригонометрия превращает три числа в угол. Путь от чувствительного элемента до пузырька — это фиксированная математика на всём протяжении. Никаких догадок в ней нет.

Одно приложение-уровень лучше другого не из-за железа. Каждый флагман уже поставляется с датчиками, которых более чем достаточно. Разница в программе: насколько хорошо отфильтрован сырой поток, как калибровка сохраняется и применяется, насколько пресеты допуска ложатся на реальные задачи. Сделайте это правильно — и дешёвый MEMS-чип не уступит специальным инструментам, которые стоят куда дороже.

Понимание того, как работает датчик, ещё и делает вас лучшим пользователем. Калибруйте при рабочей температуре. Снимайте чехол для точных показаний. Дайте числу секунду устояться, прежде чем ему довериться. Каждая из этих привычек идёт прямо из понимания того, что делает железо.

Попробуйте Spirit Level Pro бесплатно

Работает на любом телефоне или планшете. Загрузка не нужна. Функции Pro — от $10 разово.

Открыть Spirit Level Pro

Аккаунт не нужен · Работает офлайн · 20 языков