Типы датчиков

В этом разделе описываются оси датчиков, базовые датчики и составные датчики (активности, положения, некалиброванные и взаимодействия).

Оси датчика

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

Оси мобильных устройств

API датчика относится только к естественной ориентации экрана (оси не меняются местами при изменении ориентации экрана устройства).

Система координат сенсорного API для мобильных устройств

Рисунок 1. Система координат (относительно мобильного устройства), используемая API датчика

Автомобильные оси

В реализациях Android Automotive оси определяются относительно рамы кузова транспортного средства. Началом системы отсчета транспортного средства является центр задней оси. Система отсчета транспортного средства ориентирована таким образом, что:

  • Ось X направлена ​​вправо и расположена в горизонтальной плоскости, перпендикулярной плоскости симметрии транспортного средства.
  • Ось Y направлена ​​вперед и находится в горизонтальной плоскости.
Система координат сенсорного API для автомобильных устройств

Рисунок 2. Система координат (относительно автомобильного устройства), используемая API датчика

Система координат транспортного средства является правосторонней. Поэтому ось Z направлена ​​вверх.

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

Базовые датчики

Базовые типы датчиков названы в честь физических датчиков, которые они представляют. Эти датчики передают данные с одного физического датчика (в отличие от составных датчиков, которые генерируют данные из других датчиков). Примеры базовых типов датчиков включают:

  • SENSOR_TYPE_ACCELEROMETER
  • SENSOR_TYPE_GYROSCOPE
  • SENSOR_TYPE_MAGNETOMETER

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

Например, характеристики базового датчика могут отличаться от характеристик лежащего в его основе физического датчика в следующих случаях использования:

  • Микросхема гироскопа, рассчитанная на диапазон смещения 1 град/сек.
    • После заводской калибровки, температурной компенсации и компенсации смещения фактическое смещение датчика Android будет уменьшено, возможно, до точки, где смещение гарантированно будет ниже 0,01 град/сек.
    • В этой ситуации мы говорим, что датчик Android имеет смещение ниже 0,01 град/сек, даже если в техническом описании базового датчика указано 1 град/сек.
  • Барометр с потребляемой мощностью 100 мкВт.
    • Поскольку сгенерированные данные необходимо передавать из чипа в SoC, фактические затраты энергии на сбор данных с датчика барометра Android могут быть намного выше, например, 1000 мкВт.
    • В этой ситуации мы говорим, что датчик Android потребляет 1000 мкВт, хотя потребляемая мощность, измеренная на выводах чипа барометра, составляет 100 мкВт.
  • Магнитометр, потребляющий 100 мкВт при калибровке, но потребляющий больше во время калибровки.
    • Процедура калибровки может потребовать активации гироскопа, потребляющего 5000 мкВт, и запуска некоторого алгоритма, что обойдется еще в 900 мкВт.
    • В этой ситуации мы говорим, что максимальная потребляемая мощность датчика Android (магнитометра) составляет 6000 мкВт.
    • В этом случае более полезной мерой является среднее энергопотребление, и именно оно отображается в статических характеристиках датчика через HAL.

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

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER) возвращает неактивный датчик

Датчик акселерометра сообщает об ускорении устройства по трем осям датчика. Измеренное ускорение включает как физическое ускорение (изменение скорости), так и силу тяжести. Измерение сообщается в полях x, y и z sensor_event_t.acceleration.

Все значения указаны в единицах СИ (м/с^2) и измеряют ускорение устройства за вычетом силы тяжести вдоль трех осей датчика.

Вот примеры:

  • Норма (x, y, z) должна быть близка к 0 при свободном падении.
  • Когда устройство лежит на столе и его толкают с левой стороны вправо, значение ускорения x положительно.
  • Когда устройство лежит на столе, значение ускорения по оси z составляет +9,81 алло, что соответствует ускорению устройства (0 м/с^2) за вычетом силы тяжести (-9,81 м/с^2).
  • Когда устройство лежит на столе и его толкают к небу, значение ускорения превышает +9,81, что соответствует ускорению устройства (+A м/с^2) за вычетом силы тяжести (-9,81 м/с^2).

Показания калибруются с использованием:

  • Температурная компенсация
  • Онлайн-калибровка смещения
  • Калибровка весов онлайн

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

Акселерометр также сообщает, насколько точными, по его ожиданиям, будут его показания, через sensors_event_t.acceleration.status . См. константы SENSOR_STATUS_* SensorManager для получения дополнительной информации о возможных значениях этого поля.

Температура окружающей среды

Режим отчетности: по изменению

getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE) возвращает неактивный датчик

Этот датчик показывает температуру окружающей среды (комнаты) в градусах Цельсия.

Датчик магнитного поля

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD) возвращает неактивный датчик

SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD

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

Результаты измерений отображаются в полях x, y и z sensors_event_t.magnetic , все значения указаны в микротеслах (мкТл).

Магнитометр также сообщает, насколько точными, по его ожиданиям, будут его показания через sensors_event_t.magnetic.status . См. константы SENSOR_STATUS_* SensorManager для получения дополнительной информации о возможных значениях этого поля.

Показания калибруются с использованием:

  • Температурная компенсация
  • Заводская (или онлайн) калибровка мягким железом
  • Онлайн-калибровка твердого железа

Гироскоп

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_GYROSCOPE) возвращает неактивный датчик

Датчик гироскопа сообщает скорость вращения устройства вокруг трех осей датчика.

Вращение положительно в направлении против часовой стрелки (правило правой руки). То есть наблюдатель, смотрящий из некоторого положительного места на оси x, y или z на устройство, расположенное в начале координат, сообщил бы о положительном вращении, если бы устройство казалось вращающимся против часовой стрелки. Обратите внимание, что это стандартное математическое определение положительного вращения, и оно не согласуется с аэрокосмическим определением крена.

Результаты измерений отображаются в полях x, y и z sensors_event_t.gyro , все значения указаны в радианах в секунду (рад/с).

Показания калибруются с использованием:

  • Температурная компенсация
  • Компенсация масштаба на заводе (или в сети)
  • Онлайн-калибровка смещения (для устранения дрейфа)

Гироскоп также сообщает, насколько точными должны быть его показания, через sensors_event_t.gyro.status . См. константы SensorManager SENSOR_STATUS_* для получения дополнительной информации о возможных значениях этого поля.

Гироскоп не может быть эмулирован на основе магнитометров и акселерометров, так как это приведет к снижению локальной согласованности и отзывчивости. Он должен быть основан на обычном чипе гироскопа.

Частота сердечных сокращений

Режим отчетности: по изменению

getDefaultSensor(SENSOR_TYPE_HEART_RATE) возвращает неактивный датчик

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

Текущая частота сердечных сокращений в ударах в минуту (BPM) сообщается в sensors_event_t.heart_rate.bpm , а состояние датчика сообщается в sensors_event_t.heart_rate.status . Для получения дополнительной информации о возможных значениях этого поля см. константы SensorManager SENSOR_STATUS_* . В частности, при первой активации, если только известно, что устройство не находится на теле, поле состояния первого события должно быть установлено в SENSOR_STATUS_UNRELIABLE . Поскольку этот датчик является датчиком изменения, события генерируются тогда и только тогда, когда heart_rate.bpm или heart_rate.status изменились с момента последнего события. События генерируются не чаще, чем каждый sampling_period .

Фреймворк автоматически переопределяет sensor_t.requiredPermission на соответствующее разрешение для поддержания совместимости. Фреймворк использует разрешение SENSOR_PERMISSION_READ_HEART_RATE для Android 16 и выше и разрешение SENSOR_PERMISSION_BODY_SENSORS для Android 15 и ниже.

Свет

Режим отчетности: по изменению

getDefaultSensor(SENSOR_TYPE_LIGHT) возвращает неактивный датчик

Датчик освещенности сообщает текущую освещенность в единицах СИ (люкс).

Результаты измерений регистрируются в sensors_event_t.light .

Близость

Режим отчетности: по изменению

Обычно определяется как датчик пробуждения.

getDefaultSensor(SENSOR_TYPE_PROXIMITY) возвращает датчик пробуждения

Датчик приближения сообщает расстояние от датчика до ближайшей видимой поверхности.

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

Измерение сообщается в сантиметрах в sensors_event_t.distance . Обратите внимание, что некоторые датчики приближения поддерживают только двоичное измерение "near" или "far". В этом случае датчик сообщает свое значение sensor_t.maxRange в состоянии "far" и значение меньше sensor_t.maxRange в состоянии "near".

Давление

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_PRESSURE) возвращает неактивный датчик

Датчик давления (также известный как барометр) сообщает об атмосферном давлении в гектопаскалях (гПа).

Показания калибруются с использованием

  • Температурная компенсация
  • Заводская калибровка смещения
  • Калибровка заводских весов

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

Относительная влажность

Режим отчетности: по изменению

getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY) возвращает неактивный датчик

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

Композитные типы датчиков

Композитный датчик генерирует данные путем обработки и/или объединения данных от одного или нескольких физических датчиков. (Любой датчик, который не является базовым датчиком, называется композицией.) Примеры композицийных датчиков включают в себя:

Как и в случае с базовыми датчиками, характеристики составных датчиков определяются характеристиками их конечных данных. Например, энергопотребление вектора вращения игры, вероятно, равно сумме энергопотреблений чипа акселерометра, чипа гироскопа, чипа, обрабатывающего данные, и шин, передающих данные. В качестве другого примера, дрейф вектора вращения игры зависит как от качества алгоритма калибровки, так и от физических характеристик датчика.

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

Тип датчика Категория Базовые физические датчики Режим отчетности

Вектор вращения игры

Отношение

Акселерометр, гироскоп, НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ магнитометр

Непрерывный

Вектор геомагнитного вращения Датчик низкого питания

Отношение

Акселерометр, магнитометр, НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ гироскоп

Непрерывный

Жест взгляда Датчик малой мощности

Взаимодействие

Неопределенный

Один выстрел

Гравитация

Отношение

Акселерометр, гироскоп (если есть) или магнитометр (если гироскоп отсутствует)

Непрерывный

Гироскоп некалиброванный

Некалиброванный

Гироскоп

Непрерывный

Линейное ускорение

Активность

Акселерометр, гироскоп (если есть) или магнитометр (если гироскоп отсутствует)

Непрерывный

Магнитное поле некалиброванное

Некалиброванный

Магнитометр

Непрерывный

Ориентация (устарело)

Отношение

Акселерометр, магнитометр, гироскоп (если имеется)

Непрерывный

Жест «поднять» Датчик малой мощности

Взаимодействие

Неопределенный

Один выстрел

Вектор вращения

Отношение

Акселерометр, магнитометр, гироскоп

Непрерывный

Значительное движение Датчик малой мощности

Активность

Акселерометр (или другой, но с очень низким энергопотреблением)

Один выстрел

Счетчик шагов Датчик малой мощности

Активность

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

На смену

Детектор шагов Датчик малой мощности

Активность

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

Особенный

Детектор наклона Датчик малой мощности

Активность

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

Особенный

Жест пробуждения Датчик малой мощности

Взаимодействие

Неопределенный

Один выстрел

Датчик малой мощности = Датчик низкого энергопотребления

Датчики активности композитные

Линейное ускорение

Базовые физические датчики: акселерометр и (если имеется) гироскоп (или магнитометр, если гироскоп отсутствует)

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION) возвращает неактивный датчик

Датчик линейного ускорения регистрирует линейное ускорение устройства в рамке датчика, не включая силу тяжести.

Концептуально вывод: вывод акселерометра минус вывод датчика силы тяжести . Он отображается в м/с^2 в полях x, y и z sensors_event_t.acceleration .

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

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

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

Значительное движение

Базовый физический датчик: акселерометр (или другой, с низким энергопотреблением)

Режим отчетности: Однократный

Низкая мощность

Реализуйте только пробуждающую версию этого датчика.

getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION) возвращает датчик пробуждения

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

Примерами таких значимых движений являются:

  • Ходьба или езда на велосипеде
  • Сидя в движущемся автомобиле, автобусе или поезде

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

  • Телефон в кармане, а человек не двигается
  • Телефон лежит на столе, и стол немного трясется из-за проезжающего поблизости транспорта или работающей стиральной машины.

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

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

  • Целью этого датчика является экономия энергии.
  • Запуск события, когда пользователь не двигается (ложное срабатывание), требует больших затрат энергии, поэтому его следует избегать.
  • Невызов события, когда пользователь движется (ложный отрицательный результат), приемлем, если это не происходит повторно. Если пользователь ходит в течение 10 секунд, невызов события в течение этих 10 секунд неприемлем.

Каждое событие датчика регистрирует 1 в sensors_event_t.data[0] .

Детектор шагов

Базовый физический датчик: акселерометр (+ возможно другие, при условии низкого энергопотребления)

Режим отчетности: Специальный (одно событие на каждый выполненный шаг)

Низкая мощность

getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR) возвращает неактивный датчик

Детектор шагов генерирует событие каждый раз, когда пользователь делает шаг.

Временная метка события sensors_event_t.timestamp соответствует моменту, когда нога коснулась земли, создавая высокую вариацию ускорения.

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

Этот датчик должен быть маломощным. То есть, если обнаружение шагов невозможно выполнить аппаратно, этот датчик не должен быть определен. В частности, когда детектор шагов активирован, а акселерометр — нет, только шаги должны вызывать прерывания (а не каждое показание акселерометра).

sampling_period_ns не влияет на детекторы шагов.

Каждое событие датчика регистрирует 1 в sensors_event_t.data[0] .

Счетчик шагов

Базовый физический датчик: акселерометр (+ возможно другие, при условии низкого энергопотребления)

Режим отчетности: по изменению

Маломощный

getDefaultSensor(SENSOR_TYPE_STEP_COUNTER) возвращает неактивный датчик

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

Измерение отображается как uint64_t в sensors_event_t.step_counter и сбрасывается до нуля только при перезагрузке системы.

Временная метка события устанавливается на время, когда был сделан последний шаг для этого события.

Информацию о значении времени шага см. в разделе Тип датчика шагового детектора .

По сравнению с детектором шагов, счетчик шагов может иметь более высокую задержку (до 10 секунд). Благодаря этой задержке этот датчик имеет высокую точность; количество шагов после целого дня измерений должно быть в пределах 10% от фактического количества шагов. Как детектор шагов, так и счетчик шагов определяют, когда пользователь идет, бежит и поднимается по лестнице. Они не должны срабатывать, когда пользователь едет на велосипеде, ведет машину или находится в других транспортных средствах.

Аппаратное обеспечение должно гарантировать, что внутренний счетчик шагов никогда не переполнится. Минимальный размер внутреннего счетчика оборудования должен составлять 16 бит. В случае неизбежного переполнения (максимум каждые ~2^16 шагов) SoC может быть разбужен, чтобы драйвер мог выполнить обслуживание счетчика.

Как указано в разделе «Взаимодействие» , во время работы этого датчика он не должен мешать работе других датчиков, в частности акселерометра, который вполне может использоваться.

Если конкретное устройство не может поддерживать эти режимы работы, то этот тип датчика не должен сообщаться HAL. То есть, «эмулировать» этот датчик в HAL недопустимо.

Этот датчик должен быть маломощным. То есть, если обнаружение шагов невозможно выполнить на аппаратном уровне, этот датчик не должен быть определен. В частности, когда счетчик шагов активирован, а акселерометр — нет, прерывания должны вызываться только шагами (а не данными акселерометра).

Детектор наклона

Базовый физический датчик: акселерометр (+ возможно другие, при условии низкого энергопотребления)

Режим отчетности: Специальный

Маломощный

Реализуйте только пробуждающую версию этого датчика.

getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR) возвращает датчик пробуждения

Детектор наклона генерирует событие каждый раз при обнаружении события наклона.

Событие наклона определяется направлением 2-секундного окна средней гравитации, изменяющейся не менее чем на 35 градусов с момента активации или последнего события, сгенерированного датчиком. Вот алгоритм:

  • reference_estimated_gravity = среднее значение измерений акселерометра за первую секунду после активации или расчетное значение силы тяжести на момент последнего события наклона.
  • current_estimated_gravity = среднее значение измерений акселерометра за последние 2 секунды.
  • Срабатывает, когда angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees

Большие ускорения без изменения ориентации телефона не должны вызывать событие наклона. Например, резкий поворот или сильное ускорение во время вождения автомобиля не должны вызывать событие наклона, даже если угол среднего ускорения может отличаться более чем на 35 градусов. Обычно этот датчик реализуется с помощью только акселерометра. Другие датчики также могут использоваться, если они не увеличивают значительно потребление энергии. Это маломощный датчик, который должен позволять SoC переходить в режим ожидания. Не эмулируйте этот датчик в HAL. Каждое событие датчика сообщает 1 в sensors_event_t.data[0] .

Композитные датчики положения

Вектор вращения

Базовые физические датчики: акселерометр, магнитометр и гироскоп.

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR) возвращает неактивный датчик

Датчик вектора вращения сообщает об ориентации устройства относительно системы координат Восток-Север-Вверх. Обычно она получается путем интеграции показаний акселерометра, гироскопа и магнитометра. Система координат Восток-Север-Вверх определяется как прямой ортонормальный базис, где:

  • X указывает на восток и касается земли.
  • Y указывает на север и касается земли.
  • Z направлена ​​в небо и перпендикулярна земле.

Ориентация телефона представлена ​​вращением, необходимым для выравнивания координат Восток-Север-Вверх с координатами телефона. То есть, применение вращения к мировой системе координат (X,Y,Z) выровняет их с координатами телефона (x,y,z).

Вращение можно рассматривать как вращение телефона на угол тета вокруг оси rot_axis для перехода от исходной (выровненной по направлению Восток-Север-Вверх) ориентации устройства к текущей ориентации устройства. Вращение кодируется как четыре безразмерных компонента x, y, z, w единичного кватерниона:

  • sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
  • sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
  • sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
  • sensors_event_t.data[3] = cos(theta/2)

Где:

  • Поля x, y и z rot_axis — это координаты Восток-Север-Вверх единичного вектора длины, представляющего ось вращения.
  • theta — угол поворота

Кватернион является единичным кватернионом: он должен иметь норму 1 Невыполнение этого требования приведет к непредсказуемому поведению клиента.

Кроме того, этот датчик сообщает расчетную точность курса:

sensors_event_t.data[4] = estimated_accuracy (в радианах)

Ошибка направления должна быть меньше estimated_accuracy в 95% случаев. Этот датчик должен использовать гироскоп в качестве основного входа изменения ориентации.

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

Вектор вращения игры

Базовые физические датчики: акселерометр и гироскоп (магнитометр отсутствует)

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR) возвращает неактивный датчик

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

Подробнее о том, как задать sensors_event_t.data[0-3] , см. в разделе Датчик вектора вращения . Этот датчик не сообщает расчетную точность направления: sensors_event_t.data[4] зарезервирован и должен быть установлен на 0 .

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

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

Гравитация

Базовые физические датчики: акселерометр и (если имеется) гироскоп (или магнитометр, если гироскоп отсутствует)

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_GRAVITY) возвращает неактивный датчик

Датчик силы тяжести сообщает направление и величину силы тяжести в системе координат устройства.

Компоненты вектора силы тяжести указываются в м/с^2 в полях x, y и z sensors_event_t.acceleration .

Когда устройство находится в состоянии покоя, выходной сигнал датчика гравитации должен быть идентичен выходному сигналу акселерометра. На Земле величина составляет около 9,8 м/с^2.

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

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

Вектор геомагнитного вращения

Базовые физические датчики: акселерометр и магнитометр (без гироскопа)

Режим отчетности: Непрерывный

Маломощный

getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR) возвращает неактивный датчик

Вектор геомагнитного вращения аналогичен датчику вектора вращения, но использует магнитометр, а не гироскоп.

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

Подробную информацию о настройке sensors_event_t.data[0-4] см. в разделе Датчик вектора вращения .

Как и для датчика вектора вращения, ошибка курса должна быть меньше расчетной точности ( sensors_event_t.data[4] ) в 95% случаев.

Этот датчик должен быть маломощным, поэтому его необходимо реализовать аппаратно.

Ориентация (устарело)

Базовые физические датчики: акселерометр, магнитометр и (если имеется) гироскоп

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_ORIENTATION) возвращает неактивный датчик

Примечание: Это старый тип датчика, который устарел в Android SDK. Он был заменен датчиком вектора вращения, который определен более четко. Используйте датчик вектора вращения вместо датчика ориентации, когда это возможно.

Датчик ориентации сообщает об ориентации устройства. Измерения сообщаются в градусах в полях x, y и z sensors_event_t.orientation :

  • sensors_event_t.orientation.x : азимут, угол между направлением на магнитный север и осью Y, вокруг оси Z ( 0<=azimuth<360 ). 0=север, 90=восток, 180=юг, 270=запад.
  • sensors_event_t.orientation.y : шаг, вращение вокруг оси X ( -180<=pitch<=180 ), с положительными значениями, когда ось Z движется к оси Y.
  • sensors_event_t.orientation.z : крен, вращение вокруг оси Y ( -90<=roll<=90 ), с положительными значениями, когда ось X движется к оси Z.

Обратите внимание, что по историческим причинам угол крена положителен в направлении по часовой стрелке. (С математической точки зрения он должен быть положительным в направлении против часовой стрелки):

Изображение ориентации относительно устройства

Рисунок 3. Ориентация относительно устройства

Это определение отличается от рыскания, тангажа и крена, используемых в авиации, где ось X проходит вдоль длинной стороны самолета (от хвоста к носу).

Датчик ориентации также сообщает, насколько точными, по его ожиданиям, будут его показания через sensors_event_t.orientation.status . См. константы SENSOR_STATUS_* SensorManager для получения дополнительной информации о возможных значениях этого поля.

Некалиброванные датчики

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

Акселерометр некалиброванный

Базовый физический датчик: акселерометр

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED) возвращает неактивный датчик

Некалиброванный датчик акселерометра сообщает об ускорении устройства по трем осям датчика без какой-либо коррекции смещения (заводское смещение и температурная компенсация применяются к некалиброванным измерениям), вместе с оценкой смещения. Все значения указаны в единицах СИ (м/с^2) и сообщаются в полях sensors_event_t.uncalibrated_accelerometer :

  • x_uncalib : ускорение (без компенсации смещения) по оси X
  • y_uncalib : ускорение (без компенсации смещения) по оси Y
  • z_uncalib : ускорение (без компенсации смещения) вдоль оси Z
  • x_bias : предполагаемое смещение по оси X
  • y_bias : предполагаемое смещение по оси Y
  • z_bias : расчетное смещение по оси Z

Гироскоп некалиброванный

Базовый физический датчик: Гироскоп

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) возвращает неактивный датчик

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

  • x_uncalib : угловая скорость (без компенсации дрейфа) вокруг оси X
  • y_uncalib : угловая скорость (без компенсации дрейфа) вокруг оси Y
  • z_uncalib : угловая скорость (без компенсации дрейфа) вокруг оси Z
  • x_bias : предполагаемый дрейф вокруг оси X
  • y_bias : расчетный дрейф вокруг оси Y
  • z_bias : предполагаемый дрейф вокруг оси Z

Концептуально некалиброванное измерение представляет собой сумму калиброванного измерения и оценки смещения: _uncalibrated = _calibrated + _bias .

Ожидается, что значения x_bias , y_bias и z_bias будут резко меняться, как только изменится оценка смещения, и они должны оставаться стабильными в остальное время.

Подробную информацию об используемой системе координат см. в определении датчика гироскопа .

К измерениям должны применяться заводская калибровка и температурная компенсация. Кроме того, должна быть реализована оценка дрейфа гироскопа, чтобы можно было сообщать разумные оценки в x_bias , y_bias и z_bias . Если реализация не может оценить дрейф, то этот датчик не должен быть реализован.

Если этот датчик присутствует, то соответствующий датчик гироскопа также должен присутствовать, и оба датчика должны иметь одинаковые значения sensor_t.name и sensor_t.vendor .

Магнитное поле некалиброванное

Базовый физический датчик: Магнитометр

Режим отчетности: Непрерывный

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED) возвращает неактивный датчик

Некалиброванный датчик магнитного поля сообщает об окружающем магнитном поле вместе с оценкой калибровки твердого железа. Все значения указаны в микротеслах (uT) и сообщаются в полях sensors_event_t.uncalibrated_magnetic :

  • x_uncalib : магнитное поле (без компенсации жесткого железа) вдоль оси X
  • y_uncalib : магнитное поле (без компенсации жесткого железа) вдоль оси Y
  • z_uncalib : магнитное поле (без компенсации жесткого железа) вдоль оси Z
  • x_bias : расчетное смещение твердого железа по оси X
  • y_bias : расчетное смещение твердого железа по оси Y
  • z_bias : расчетное смещение твердого железа вдоль оси Z

Концептуально некалиброванное измерение представляет собой сумму калиброванного измерения и оценки смещения: _uncalibrated = _calibrated + _bias .

Некалиброванный магнитометр позволяет алгоритмам более высокого уровня обрабатывать плохую оценку жесткого железа. Ожидается, что значения x_bias , y_bias и z_bias будут скакать, как только изменится оценка жесткого железа, и они должны быть стабильными в остальное время.

К измерениям необходимо применять калибровку soft-iron и температурную компенсацию. Кроме того, необходимо реализовать оценку hard-iron, чтобы можно было сообщать разумные оценки в x_bias , y_bias и z_bias . Если реализация не может оценить смещение, то этот датчик не должен быть реализован.

Если этот датчик присутствует, то должен присутствовать и соответствующий датчик магнитного поля, и оба датчика должны иметь одинаковые значения sensor_t.name и sensor_t.vendor .

Угол наклона петли

Режим отчетности: по изменению

getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE) возвращает датчик пробуждения

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

Взаимодействие композитных датчиков

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

Жест пробуждения

Базовые физические датчики: Не определено (все маломощные)

Режим отчетности: Однократный

Маломощный

Реализуйте только пробуждающую версию этого датчика.

getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE) возвращает датчик пробуждения

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

Этот датчик должен быть низкой мощностью, так как он, вероятно, будет активирован 24/7.

Каждое событие датчика сообщает 1 в sensors_event_t.data[0] .

Забрать жест

Основные физические датчики: неопределенные (что -нибудь низкая мощность)

Режим отчетности: один выстрел

Низкая мощность

Реализуйте только тревожную версию этого датчика.

getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE) возвращает датчик пробуждения

Датчик жеста пикапа запускается, когда устройство поднимается независимо от того, где оно было раньше (стол, карман, сумка).

Каждое событие датчика сообщает 1 в sensors_event_t.data[0] .

Взгляд жест

Основные физические датчики: неопределенные (что -нибудь низкая мощность)

Режим отчетности: один выстрел

Низкая мощность

Реализуйте только тревожную версию этого датчика.

getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE) возвращает датчик пробуждения

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

Этот датчик должен быть низкой мощностью, так как он, вероятно, будет активирован 24/7. Каждое событие датчика сообщает 1 в sensors_event_t.data[0] .

Ограниченные оси ИМУ датчики

Доступны от Android 13, ограниченные оси датчики IMU - это датчики, которые поддерживают варианты использования, где доступны не все три оси (x, y, z). Стандартные типы IMU в Android (например, SENSOR_TYPE_ACCELEROMETER и SENSOR_TYPE_GYROSCOPE ) Предположим, что все три оси поддерживаются. Однако не все форм-факторы и устройства поддерживают 3-осевые акселерометры и 3-осевые гироскопы.

Акселерометр с ограниченными осями

Основные физические датчики: акселерометр

Режим отчетности: непрерывный

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES) возвращает датчик без боя

Датчик с ограниченным количеством осей акселерометра эквивалентен TYPE_ACCELEROMETER , но поддерживает случаи, когда одна или две оси не поддерживаются.

Последние три значения событий датчика, сообщенные датчиком, представляют, поддерживается ли значение ускорения для оси x, y и z. Значение 1.0 указывает на то, что ось поддерживается, а значение 0 указывает, что оно не поддерживается. Производители устройств идентифицируют поддерживаемые оси во время сборки, и значения не изменяются во время выполнения.

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

Гироскоп с ограниченными осями

Основные физические датчики: гироскоп

Режим отчетности: непрерывный

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES) возвращает датчик без боя

Датчик с ограниченным дозом гироскопа эквивалентен TYPE_GYROSCOPE , но поддерживает случаи, когда одна или две оси не поддерживаются.

Последние три значения событий датчика, сообщаемые датчиком, представляют, поддерживается ли значение угловой скорости для оси x, y и z. Значение 1.0 указывает на то, что ось поддерживается, а значение 0 указывает, что оно не поддерживается. Производители устройств идентифицируют поддерживаемые оси во время сборки, и значения не изменяются во время выполнения.

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

Акселерометр с ограниченной осей некалиброванной

Основные физические датчики: акселерометр

Режим отчетности: непрерывный

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED) Возвращает датчик без боя

Акселерометр ограниченный оси Неизолиброванный датчик эквивалентен TYPE_ACCELEROMETER_UNCALIBRATED , но поддерживает случаи, когда одна или две оси не поддерживается.

Последние три значения событий датчика, сообщаемые датчиком, представляют, поддерживаются ли значения ускорения и смещения для оси x, y и z. Значение 1.0 указывает на то, что ось поддерживается, а значение 0 указывает, что оно не поддерживается. Производители устройств идентифицируют поддерживаемые оси во время сборки, и значения не изменяются во время выполнения.

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

Гироскоп ограниченных осей.

Основные физические датчики: гироскоп

Режим отчетности: непрерывный

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED) Возвращает датчик без боя

Джароскоп ограниченный осей неалиброванный датчик эквивалентен TYPE_GYROSCOPE_UNCALIBRATED , но поддерживает случаи, когда одна или две оси не поддерживается.

Последние три значения событий датчика, сообщаемые датчиком, представляют, поддерживаются ли угловая скорость и значения дрейфа для оси x, y и z. Значение 1.0 указывает на то, что ось поддерживается, а значение 0 указывает, что оно не поддерживается. Производители устройств идентифицируют поддерживаемые оси во время сборки, и значения не изменяются во время выполнения.

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

Composite Limited Axes Imu

Основные физические датчики: любая комбинация 3-осевого акселерометра, 3-осевого гироскопа, 3-осевого акселерометра неалиброванного и 3-осевого гироскопа.

Режим отчетности: непрерывный

Композитный ограниченный оси IMU-датчик эквивалентен ограниченному датчику IMU, но вместо того, чтобы поддерживаться в HAL, он преобразует 3-осевые данные датчика в эквивалентные варианты ограниченных осей. Эти композитные датчики включены только для автомобильных устройств.

В следующей таблице показан пример преобразования из стандартного 3-осевого акселерометра в акселерометр с ограниченным ограниченным составом.

Значения SensoreVent для sensor_type_accelerometer Пример SENSOR_TYPE_ACCELEROMETER SENSOREVEV Composite sensor_type_accelerometer_limited_axes sensorevent
значения[0]

-0,065

-0,065

Значения [1]

0,078

0,078

Значения [2]

9.808

9.808

Значения [3]

Н/Д

1.0

Значения [4]

Н/Д

1.0

Значения [5]

Н/Д

1.0

Автомобильные датчики

Датчики для поддержки автомобильных вариантов использования.

Заголовок

Основные физические датчики: любая комбинация GPS, магнитометра, акселерометра и гироскопа.

Режим отчетности: непрерывный

getDefaultSensor(SENSOR_TYPE_HEADING) возвращает датчик без боя

Доступный от Android 13, датчик заголовка измеряет направление, в котором устройство указывает относительно True North в градусах. Датчик заголовка включает в себя два значения SensorEvent . Один для измеренного заголовка устройства и один для точности предоставленного значения заголовка.

Значения заголовка, сообщенные этим датчиком, должны составлять от 0.0 (включительно) до 360.0 (эксклюзив), причем 0 указывает на север, 90 восток, 180 юг и 270 запад.

Точность этого датчика определяется при доверии 68 процентов. В случае, когда основное распределение является гауссовым нормальным, точность является одним из стандартных отклонений. Например, если датчик заголовка возвращает значение заголовка 60 градусов и значение точности 10 градусов, существует вероятность того, что истинный заголовок составляет от 50 градусов до 70 градусов.