Dual accelerometer driver что это

Обновлено: 02.07.2024

В статье рассмотрено принципы работы iPhone акселерометра, показаны примеры приложений, использующие акселерометр в качестве главного компонента, наведены рекомендации по использованию акселерометра. Также показано, как использовать акселерометр в веб-приложениях. Часть материалов была взята из статьи «Скроллинг при помощи акселерометра».

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

Акселерометр (от лат. accelero — ускоряю и μετρέω — измеряю) — прибор, измеряющий проекцию кажущегося ускорения. Кажущееся ускорение есть равнодействующая сил не гравитационной природы, действующая на массу и отнесённая к величине этой массы. Акселерометр может применяться как для измерения проекций абсолютного линейного ускорения, так и для косвенных измерений проекции гравитационного ускорения. Последнее свойство используется для создания инклинометров. Акселерометры входят в состав инерциальных навигационных систем, где полученные с их помощью измерения интегрируют, получая инерциальную скорость и координаты носителя. Электронные акселерометры часто встраиваются в мобильные устройства (в частности, в телефоны) и применяются в качестве шагомеров, датчиков для определения положения в пространстве, автоматического поворота дисплея и других целей. В игровых приставках акселерометры используются для управления без использования кнопок — путем поворотов в пространстве, встряхиваний и т. д.

Apple — не первая компания, которая внедрила акселерометр в мобильный телефон, но первая, у которой это получилось хорошо.

Как можно использовать акселерометр?

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

Несколько базовых примеров:

C помощью iBeer можно попить виртуальное пиво:

iBoobs — программа, которая не прошла отдел цензуры в Apple.

Обзор других программ можно посмотреть по ссылкам внизу.

Немного теории

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

В состоянии покоя, когда устройство не двигается, величина замеряемого ускорения равна силе тяжести и принята за единицу. Соотношения величин проекций этой силы на оси координат дают нам углы поворота устройства в пространстве. Если iPhone находится в движении, то величину ускорения, с которым разгоняется аппарат, можно посредством дополнительных преобразований вычислить на основе значений проекций.

Заметьте, это именно ускорение, а не скорость движения устройства. То есть, если ваш iPhone начнет падать на землю, то проекции величины ускорения примут значение 0 по всем осям — ваш iPhone будет в невесомости :) А если вы поднимаетесь с должным ускорением на лифте вверх, то значение силы тяжести на время ускорения увеличится.

Интерфейс акселерометра

Несколько фактов:
  • является частью UIKit фреймворка
  • предоставляет информацию по трем осям
  • можно настроить частоту обновления данных (приблизительно 10-100 Гц)
Классы:
Протокол:

Координатные оси

  • координата X (Roll) показывает информацию о повороте устройства влево или вправо;
  • координата Y (Pitch) дает нам следующую информацию: iPhone находится в вертикальном
    положении (-1), лежит в горизонтальной плоскости (0) или находится в
    вертикальном положении, только вверх ногами (+1);
  • координата Z (Face up/face down) показывает, в каком положении находится устройство: лицом вверх (-1,
    при нулевых значениях по другим осям), в вертикальном положении (0) или
    лицом вниз (+1).



Координатные оси iPhone акселерометра

Для случая произвольной ориентации iPhone данные о величине ускорения распределяются по осям согласно проекции вектора ускорения.

Проекция вектора силы тяжести на оси координат в произвольном положении iPhone


Расчет вектора при произвольном положении iPhone

Подключаем акселерометр в проект

Всю необходимую информацию аккумулирует объект класса UIAcceleration, возвращающий данные по всем осям, а также временной маркер, позволяющий определить относительное время замера указанных
величин. Напрямую подступиться к данным этого класса нельзя, эту информацию можно получить только через делегат UIAccelerometerDelegate, предоставляющего для реализации один единственный метод
accelerometer:didAccelerate:, в который возвращается объект класса UIAcceleration. Назначение делегата и инициализация вызовов метода accelerometer:didAccelerate: происходит при помощи класса UIAccelerometer.

Для того, чтобы подключить акселерометр, необходимо в методе applicationDidFinishLaunching написать следующий код:

Метод setUpdateInterval устанавливать частоту обновления данных, kUpdateFrequency — коэффициент, который показывает, как часто нужно получать данные.

Кроме того, в заголовочном файле класса вашего делегата нужно указать протокол UIAccelerometerDelegate:

Логику обработки данных акселерометра нужно добавить в метод didAccelerate в классе делегата:

  • можно объявлять лишь один делегат для приложения
  • данные приходят асинхронно к основному потоку
  • Диапазон частоты — 10 -100 Гц.
  • Рекомендуемая частота для игр: 30-60 Гц, для определения ориентации — 10-30 Гц.

Для остановки получения значений необходимо вызвать следующий код:

Угол наклона


Геометрически можно показать работу акселерометра следующим образом:

Из рисунка видно, что угол может быть рассчитан с помощью функции арктангенса, т.е.:

float angle = atan2(y, -x);

Положения акселерометра можно посмотреть на рисунке:



С помощью информации об угле поворота можно менять ориентацию экрана:

Пример 1. Прокрутка с помощью акселерометра

Возьмем за точку отсчета положение нашего устройства в пространстве, при котором угол между задней стенкой и землей составляет 45 градусов. В этом случае проекции силы тяжести на ось Y будет составлять -0.7. Если мы отклоняем аппарат чуть ближе к вертикальному положению, то примем, что при достижении угла в 30 градусов от вертикали мы должны перелистнуть список к концу. И наоборот, при достижении угла в 30 и менее градусов от горизонтального положения, мы должны перелистнуть список к началу.
В первом случае абсолютная величина проекции силы тяжести на ось Y, направленная вдоль аппарата, станет равна 0.86. Те, кто не понял откуда взялось это значение, вспоминаем геометрию и вычисление проекции на ось координат вектора единичной длины. Во втором случае это же значение равно 0.5. Для реализации прокрутки мы воспользуемся методом scrollToRowAtIndexPath:atScrollPosition:animated: класса UITableView.

Фильтры

В основном, используются два фильтра — высокочастотный (high-pass) и низкочастотный (low-pass). Эти фильтры можно использовать для отсеивания эффектов «дрожания»,
медленных поворотов и т.д.

Низкочастотный фильтр используется для нахождения ориентации устройства, высокочастотный — для определения тряски.

Самый простой низкочастотный фильтр реализует следующий код:


Самый простой высокочастотный фильтр реализует следующий код:

Пример 2. AccelerometrGraph

Отличная программа для исследования работы акселерометра — показывает изменение значений по трем координатам. Можно скачать с официального сайта Apple.

В обычном режиме отображает именно ту информацию, которую получает. Также можно использовать фильтры, которые будут отсекать обыкновенные повороты, а реагировать лишь на тряску (что, в основном, и бывает нужно в реальных приложениях).

Пример 3. iBells



iBells (ссылка на appstore) — это развлекательная программа, которая реагирует на дейсвия пользователя и проигрывает звуки колокольчиков.

  • корректное реагирование на действия пользователей, т.е. именно в тот момент когда пользователь трясет устройства;
  • реализация минимальной задержки, в течении которой музыкальный файл не должен проигрываться (это нужно для того, чтобы исключить очень частые срабатывания).

Корректное реагирование на тряску можно добиться используя высокочастотный фильтр:

kFilteringFactor — коэффициент «заглушения» реакции на случайные колебания. Этот параметр нужно подбирать индивидуально в зависимости от требований.

Интервал измеряется просто:


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

Недавно я нашел еще один способ определить тряску:

Использование акселерометра в веб-приложениях

В Safari был добавлен новый метод onorientationchange, который срабатывает при изменении положения на 90%. Ниже приведен javascript код, с помощью которого можно менять положение (orientation) веб-страницы.

Примеры веб-страницы можно посмотреть здесь и здесь.

Акселерометр и симулятор

По понятным причинам тестировать приложения в симуляторе не представляется возможным. Для этого нужно использовать реальное устройство.

По ссылке можно посмотреть (а здесь скачать), как все таки можно передавать данные в симулятор. Но, так как там все равно используется реальное устройство, практической
пользы в этом нет. Just for fun.

Ссылки и дополнительные материалы

P. S. Автор статьи Александр Краковецкий (sashaeve), пожалуйста дайте ему инвайт спасибо Speakus за инвайт.


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

Чтобы понять, на какие точности углов мы можем рассчитывать, нужно приложить некоторое количество усилий.

TL;DR: Описан небольшой скрипт для Octave/MATLAB, позволяющий оценить ошибки расчёта углов ориентации по измерениям МЭМС акселерометров и магнитометров. На входе скрипта — параметры датчиков из даташитов (и/или погрешности калибровки). Статья может быть полезна тем, кто начинает использовать инерциальные датчики в своих устройствах. Небольшой ликбез по датчикам прилагается. Ссылка на гитхаб тоже.

Сходу примем такие условия:

    Мы хотим оценить углы ориентации неподвижного устройства.

Ориентацию подвижного устройства просто по формулам не посчитать, нужно использовать хитрые алгоритмы.

1. Краткий ликбез

Углы ориентации


Будем понимать под углами ориентации объекта углы Эйлера — крен (roll), тангаж (pitch), рыскание (yaw), связывающие собственную систему координат XYZ объекта и локальную систему координат восток-север-верх (ENU — East North Up). Углы roll, pitch, yaw обозначают поворот, который нужно совершить осям XYZ чтобы перейти в оси ENU. Соответственно, нулевые углы означают, что ось X объекта смотрит на восток, ось Y объекта смотрит на север, ось Z — вверх.

Порядок поворота осей — начиная с последнего угла: сначала на yaw (вокруг оси Z), потом на pitch (вокруг оси Y), потом на roll (вокруг оси X).

Акселерометр

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

Примем следующую модель измерений триады ортогональных (взаимно перпендикулярных) акселерометров:

где – измеряемое ускорение в ССК (собственной системе координат) XYZ, – матрица перекоса осей и масштабных коэффициентов акселерометра, – вектор истинного ускорения в ССК XYZ, – вектор смещения нуля акселерометра, – шум измерений.

Матрица перекоса осей и масштабных коэффициентов выглядит следующим образом:

где элементы, расположенные по главной диагонали () — это масштабные коэффициенты и их погрешности по трём осям акселерометра, а остальные элементы матрицы — перекосы осей акселерометра.

Акселерометр MPU-9250

  • Смещение нуля акселерометра — Zero-G Initial Calibration Tolerance ( для компонент , для компоненты ) — для расчётов переводим в единицы домножив на
  • Погрешность масштабного коэффициента — Initial Tolerance () — выражается в процентах. Для расчётов надо перевести в разы, домножив на
  • Перекосы осей — Cross Axis Sensitivity () — также умножаем на
  • Спектральная плотность мощности шума акселерометра — Noise Power Spectral Density — переводим числитель в домножая все на
  • Полоса пропускания — Low Pass Filter Response — приведены границы, в пределах которых её можно изменять. Установим максимальную полосу. Все равно ошибки будут определяться не шумами;

Акселерометр ADIS16488A:

  • Смещение нуля — Bias Repeatability () — переводим в домножая на
  • Погрешность масштабного коэффициента — (Sensitivity) Repeatability () — переводим из процентов в разы;
  • Перекосы осей — Misalignment Axis to frame () — в градусах, переводим в разы (радианы, поскольку величины малые);
  • Спектральная плотность мощности шума — Noise Density — переводим числитель в
  • Полоса пропускания — — выберем такой же, как у MPU-9250;

Магнитометр

Датчик, который измеряет проекцию индукции магнитного поля на ось чувствительности. Магнитометру свойственны искажения hard-iron и soft-iron. Hard-iron искажение — это аддитивный эффект, когда к измеряемому полю добавляется постоянная составляющая. Причиной может быть, например, действие постоянного магнита или собственное смещение нуля датчика. Искажение soft-iron — мультипликативный эффект, отражающий изменение направления и/или ослабление вектора магнитной индукции. Этот эффект может быть вызван наличием металлического предмета в непосредственной близости от магнитометра или же собственными искажениями датчика — погрешностью масштабного коэффициента или перекосом его оси чувствительности.
Примем модель измерений триады магнитометров:

где – измерения магнитометра в ССК XYZ, – диагональная матрица перекоса осей и масштабных коэффициентов (которая описывает эффект soft–iron), – вектор истинной магнитной индукции в ССК, – смещение нулей магнитометра (описывает эффект hard–iron), – шум измерений.
Матрица перекоса осей и масштабных коэффициентов магнитометра:

элементы, расположенные на главной диагонали () — масштабные коэффициенты и их погрешности по трём осям магнитометра, остальные элементы матрицы — перекосы осей магнитометра. Все элементы матрицы также учитывают эффект soft-iron.

Магнитометр MPU-9250

В даташите нужных нам параметров нет, поэтому предположим, что магнитометр откалиброван и возьмем следующие числа:

  • смещение нуля —
  • погрешность масштабных коэффициентов —
  • перекосы осей — предположим, что они такие же, как у акселерометров —
  • шум на выходе —

Магнитометр ADIS16488A

  • Смещение нуля — Initial Bias Error — будем считать, что мы его откалибровали до ;
  • Погрешность масштабного коэффициента — Initial Sensitivity Tolerance
  • Перекосы осей — Misalignment Axis to axis — в градусах, переводим в разы (радианы, так как величина маленькая);
  • Спектральная плотность мощности шума — Noise Density — переводим в
  • Полоса пропускания — возьмем для модели значение

Расчет углов ориентации

Благодаря наличию на Земле силы тяжести, акселерометры «чувствуют» направление вниз. Их измерения используются для расчета углов крена и тангажа. Формулы для расчёта можно найти тут. Третий — угол рыскания (а в данном случае — магнитного азимута), может быть определен благодаря наличию у Земли магнитного поля. Вектор индукции магнитного поля измеряется магнитометрами и их измерения участвуют в расчете угла рыскания. Нужно отметить, что в расчёте магнитного азимута используются измерения магнитометра, пересчитанные в плоскость. Здесь можно найти формулу для расчёта магнитного азимута.

где — функция полного арктангенса, , , — измерения акселерометра по трём осям в ССК, , — измерения магнитометра по осям X', Y' (измерения магнитометров пересчитаны в плоскость).

2. Ошибки оценивания углов ориентации

Описание алгоритма


    Сформируем массивы случайных углов Эйлера roll, pitch, yaw. Они будут задавать наборы вариантов истинной ориентации объекта в модели.

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

3. Результаты — расчет погрешностей оценки углов

Для двух датчиков, которые мы взяли для примера — ADIS16488A и MPU-9250, получены предельные ошибки оценивания углов ориентации при совместном влиянии погрешностей акселерометра и магнитометра.

В таблице ниже — максимальные значения полученных ошибок:

Совместное влияние погрешностей акселерометра и магнитометра на ошибки оценивания углов ориентации:

    Вот так выглядят ошибки оценивания крена в зависимости от значений крена и тангажа:

Как можно заметить - величина ошибок растёт с приближением к границе диапазонов измерений углов. Почему?

Это можно понять из рисунка ниже.


Допустим мы поворачиваем ось чувствительности Z () акселерометра так, чтобы проекция силы тяжести на эту ось стала меньше (). Значение проекции силы тяжести плюс погрешность акселерометра дадут область возможных значений измерения (розовая область). Погрешность оценки угла при этом возрастает (). Таким образом, при уменьшении проекции вектора силы тяжести на ось чувствительности ошибка акселерометра начинает вносить бОльшую ошибку в оценку угла.

Поиграем с входными параметрами чтобы понять чем определяются ошибки

Влияние только погрешностей акселерометра (магнитометр считаем идеальным) на ошибки оценивания углов ориентации:

  • Влияние погрешностей акселерометра на ошибки оценивания крена от крена и тангажа
  • Влияние погрешностей акселерометра на ошибки оценивания тангажа от крена и тангажа
  • Влияние погрешностей акселерометра на ошибки оценивания магнитного азимута от крена и тангажа

Читайте также: