В этом разделе описываются оси датчиков, базовые датчики и составные датчики (активность, положение, некалиброванные и взаимодействие).
Оси датчика
Значения событий датчиков от многих датчиков выражаются в определенном кадре, который является статичным относительно устройства.
Оси мобильных устройств
API датчика относится только к естественной ориентации экрана (оси не меняются местами при изменении ориентации экрана устройства).
Автомобильные оси
В реализациях Android Automotive оси определяются относительно рамы кузова автомобиля. Началом системы координат автомобиля является центр задней оси. Система отсчета транспортного средства ориентирована так, что:
- Ось X направлена вправо и находится в горизонтальной плоскости, перпендикулярной плоскости симметрии автомобиля.
- Ось Y направлена вперед и находится в горизонтальной плоскости.
Система отсчета транспортного средства представляет собой правостороннюю систему координат. Следовательно, ось 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, что соответствует ускорению устройства (+А м/с^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
. См. константы SENSOR_STATUS_*
SensorManager
для получения дополнительной информации о возможных значениях для этого поля.
Гироскоп нельзя эмулировать на основе магнитометров и акселерометров, так как это приведет к снижению локальной согласованности и отзывчивости. В его основе должен лежать обычный чип гироскопа.
Частота сердечных сокращений
Режим отчетности: при изменении
getDefaultSensor(SENSOR_TYPE_HEART_RATE)
возвращает датчик без пробуждения
Датчик сердечного ритма сообщает текущую частоту сердечных сокращений человека, прикасающегося к устройству.
Текущая частота сердечных сокращений в ударах в минуту (BPM) отображается в файле sensors_event_t.heart_rate.bpm
, а состояние датчика отображается в файле sensors_event_t.heart_rate.status
. См. константы SENSOR_STATUS_*
SensorManager
для получения дополнительной информации о возможных значениях для этого поля. В частности, при первой активации, если только не известно, что устройства нет на теле, поле статуса первого события должно быть установлено в SENSOR_STATUS_UNRELIABLE
. Поскольку этот датчик постоянно меняется, события генерируются тогда и только тогда, когда heart_rate.bpm
или heart_rate.status
изменились с момента последнего события. События генерируются не быстрее, чем каждый sampling_period
.
sensor_t.requiredPermission
всегда имеет SENSOR_PERMISSION_BODY_SENSORS
.
Свет
Режим отчетности: при изменении
getDefaultSensor(SENSOR_TYPE_LIGHT)
возвращает датчик без пробуждения
Датчик освещенности сообщает текущую освещенность в единицах СИ.
Об измерении сообщается в sensors_event_t.light
.
Близость
Режим отчетности: при изменении
Обычно определяется как датчик пробуждения.
getDefaultSensor(SENSOR_TYPE_PROXIMITY)
возвращает датчик пробуждения
Датчик приближения сообщает расстояние от датчика до ближайшей видимой поверхности.
До Android 4.4 датчики приближения всегда были датчиками пробуждения, активируя SoC при обнаружении изменения близости. После Android 4.4 мы советуем сначала реализовать версию этого датчика для пробуждения, поскольку именно он используется для включения и выключения экрана во время телефонных звонков.
Измерение указывается в сантиметрах в sensors_event_t.distance
. Обратите внимание, что некоторые датчики приближения поддерживают только двоичные измерения «ближнее» или «дальнее». В этом случае датчик сообщает свое значение sensor_t.maxRange
в «дальнем» состоянии и значение меньше, чем sensor_t.maxRange
в «Близком» состоянии.
Давление
Режим отчетности: Непрерывный
getDefaultSensor(SENSOR_TYPE_PRESSURE)
возвращает датчик без пробуждения
Датчик давления (также известный как барометр) сообщает об атмосферном давлении в гектопаскалях (гПа).
Показания калибруются с помощью
- Температурная компенсация
- Заводская калибровка смещения
- Калибровка заводской шкалы
Барометр часто используется для оценки изменений высоты. Для оценки абсолютной высоты в качестве ориентира необходимо использовать давление на уровне моря (меняющееся в зависимости от погоды).
Относительная влажность
Режим отчетности: при изменении
getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY)
возвращает датчик отсутствия пробуждения
Датчик относительной влажности измеряет относительную влажность окружающего воздуха и возвращает значение в процентах.
Типы композитных датчиков
Составной датчик генерирует данные путем обработки и/или объединения данных от одного или нескольких физических датчиков. (Любой датчик, не являющийся базовым, называется составным датчиком.) Примеры составных датчиков:
- Детектор шагов и значительного движения , которые обычно основаны на акселерометре, но могут быть основаны и на других датчиках, если энергопотребление и точность будут приемлемыми.
- Вектор вращения игры , основанный на акселерометре и гироскопе.
- Некалиброванный гироскоп , который аналогичен базовому датчику гироскопа, но калибровка смещения сообщается отдельно, а не корректируется при измерении.
Как и в случае с базовыми датчиками, характеристики составных датчиков основаны на характеристиках их конечных данных. Например, энергопотребление вектора вращения игры, вероятно, равно сумме потребляемой мощности чипа акселерометра, чипа гироскопа, чипа, обрабатывающего данные, и шин, транспортирующих данные. Другой пример: дрейф вектора игрового вращения зависит как от качества алгоритма калибровки, так и от физических характеристик сенсора.
В следующей таблице перечислены доступные типы составных датчиков. Каждый составной датчик опирается на данные одного или нескольких физических датчиков. Избегайте выбора других базовых физических датчиков для аппроксимации результатов, поскольку они усложняют работу пользователя.
Тип датчика | Категория | Основные физические датчики | Режим отчетности |
---|---|---|---|
Отношение | Акселерометр, гироскоп, НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬ магнитометр. | Непрерывный | |
Отношение | Акселерометр, магнитометр, НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬ гироскоп. | Непрерывный | |
Жест взгляда | Взаимодействие | Неопределенный | Один выстрел |
Отношение | Акселерометр, гироскоп (при наличии) или магнитометр (при отсутствии гироскопа) | Непрерывный | |
Некалиброванный | Гироскоп | Непрерывный | |
Активность | Акселерометр, гироскоп (при наличии) или магнитометр (при отсутствии гироскопа) | Непрерывный | |
Некалиброванный | Магнитометр | Непрерывный | |
Ориентация (устарело) | Отношение | Акселерометр, магнитометр, гироскоп (при наличии) | Непрерывный |
Взаимодействие | Неопределенный | Один выстрел | |
Отношение | Акселерометр, магнитометр, гироскоп | Непрерывный | |
Активность | Акселерометр (или другой, но очень малой мощности) | Один выстрел | |
Активность | Акселерометр | При изменении | |
Активность | Акселерометр | Особенный | |
Активность | Акселерометр | Особенный | |
Взаимодействие | Неопределенный | Один выстрел |
= Датчик малой мощности
Комбинированные датчики активности
Линейное ускорение
Основные физические датчики: акселерометр и (при наличии) гироскоп (или магнитометр, если гироскоп отсутствует).
Режим отчетности: Непрерывный
getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION)
возвращает датчик без пробуждения
Датчик линейного ускорения сообщает о линейном ускорении устройства в рамке датчика, не включая силу тяжести.
Концептуально вывод выглядит следующим образом: выходной сигнал акселерометра минус выходной сигнал датчика силы тяжести . Об этом сообщается в м/с^2 в полях x, y и z sensors_event_t.acceleration
.
Показания по всем осям должны быть близки к 0, когда устройство неподвижно.
Если устройство оснащено гироскопом, датчик линейного ускорения должен использовать в качестве входных данных гироскоп и акселерометр.
Если устройство не оснащено гироскопом, датчик линейного ускорения должен использовать в качестве входных данных акселерометр и магнитометр.
Значительное движение
Базовый физический датчик: акселерометр (или другой, но с низким энергопотреблением).
Режим отчетности: One-shot
Низкая мощность
Реализуйте только пробуждающую версию этого датчика.
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.
Обратите внимание: по историческим причинам угол крена положителен в направлении по часовой стрелке. (Математически говоря, оно должно быть положительным в направлении против часовой стрелки):
Это определение отличается от рыскания, тангажа и крена, используемых в авиации, где ось 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)
возвращает датчик без пробуждения
Некалиброванный датчик магнитного поля сообщает об окружающем магнитном поле вместе с оценкой точной калибровки. Все значения указаны в микротеслах (мкТ) и указаны в полях 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
подскочат, как только изменится оценка жесткого железа, и в остальное время они должны быть стабильными.
При измерениях необходимо применять калибровку мягкого железа и температурную компенсацию. Кроме того, необходимо реализовать надежную оценку, чтобы разумные оценки можно было сообщать в x_bias
, y_bias
и z_bias
. Если реализация не может оценить смещение, то этот датчик не должен быть реализован.
Если этот датчик присутствует, то должен присутствовать соответствующий датчик магнитного поля, и оба датчика должны иметь одинаковые значения sensor_t.name
и sensor_t.vendor
.
Угол шарнира
Режим отчетности: при изменении
getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE)
возвращает датчик пробуждения
Датчик угла шарнира измеряет угол в градусах между двумя составными частями устройства. Ожидается, что перемещение шарнира, измеряемое датчиком этого типа, изменит способы взаимодействия пользователя с устройством, например, разворачивая или открывая дисплей.
Взаимодействие композитных датчиков
Некоторые датчики в основном используются для обнаружения взаимодействия с пользователем. Мы не определяем, как должны быть реализованы эти датчики, но они должны быть маломощными, и производитель устройства несет ответственность за проверку их качества с точки зрения пользовательского опыта.
Жест пробуждения
Базовые физические датчики: не определены (все маломощные)
Режим отчетности: One-shot
Маломощный
Реализуйте только пробуждающую версию этого датчика.
getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE)
возвращает датчик пробуждения
Датчик жестов пробуждения позволяет пробуждать устройство на основе конкретного движения устройства. При срабатывании этого датчика устройство ведет себя так, как если бы была нажата кнопка питания, включая экран. Такое поведение (включение экрана при срабатывании этого датчика) может быть отключено пользователем в настройках устройства. Изменения в настройках не влияют на поведение датчика: только на то, включает ли платформа экран при его срабатывании. Фактический жест, который должен быть обнаружен, не указан и может быть выбран производителем устройства.
Этот датчик должен быть маломощным, так как он, скорее всего, будет активирован 24 часа в сутки, 7 дней в неделю.
Каждое событие датчика сообщает 1
в sensors_event_t.data[0]
.
Поднять жест
Базовые физические датчики: не определены (все маломощные)
Режим отчетности: One-shot
Маломощный
Реализуйте только пробуждающую версию этого датчика.
getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE)
возвращает датчик пробуждения
Датчик жеста захвата срабатывает, когда устройство берут в руки, независимо от того, где оно было до этого (стол, карман, сумка).
Каждое событие датчика сообщает 1
в sensors_event_t.data[0]
.
Жест взгляда
Базовые физические датчики: не определены (все маломощные)
Режим отчетности: One-shot
Маломощный
Реализуйте только пробуждающую версию этого датчика.
getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE)
возвращает датчик пробуждения
Датчик жестов взгляда позволяет кратковременно включать экран, чтобы пользователь мог просмотреть контент на экране в зависимости от определенного движения. При срабатывании этого датчика устройство на мгновение включит экран, чтобы пользователь мог просмотреть уведомления или другой контент, пока устройство остается заблокированным в неинтерактивном состоянии (дремоте), а затем экран снова выключится. Такое поведение (краткое включение экрана при срабатывании этого датчика) может быть отключено пользователем в настройках устройства. Изменения настроек не влияют на поведение датчика: только то, включает ли фреймворк кратковременно экран при его срабатывании. Фактический жест, который должен быть обнаружен, не указан и может быть выбран производителем устройства.
Этот датчик должен быть маломощным, так как он, вероятно, будет активирован 24 часа в сутки, 7 дней в неделю. Каждое событие датчика сообщает 1
в sensors_event_t.data[0]
.
Датчики IMU с ограниченными осями
Доступные в 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
.
Композитные ограниченные оси IMU
Базовые физические датчики: любая комбинация 3-осевого акселерометра, 3-осевого гироскопа, 3-осевого некалиброванного акселерометра и 3-осевого некалиброванного гироскопа.
Режим отчетности: Непрерывный
Составной датчик IMU с ограниченными осями эквивалентен датчику IMU с ограниченными осями, но вместо поддержки в HAL он преобразует данные 3-осевого датчика в эквивалентные варианты с ограниченными осями. Эти составные датчики доступны только для автомобильных устройств.
В следующей таблице показан пример преобразования стандартного 3-осевого акселерометра в составной акселерометр с ограниченными осями.
Значения SensorEvent для SENSOR_TYPE_ACCELEROMETER | Пример SENSOR_TYPE_ACCELEROMETER SensorEvent | Составное 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, измеряет направление, в котором указывает устройство относительно истинного севера, в градусах. Датчик курса включает в себя два значения SensorEvent
. Один для измерения курса устройства и один для точности предоставленного значения курса.
Значения курса, сообщаемые этим датчиком, должны находиться в диапазоне от 0.0
(включительно) до 360.0
(не включая), где 0
указывает на север, 90
на восток, 180
на юг и 270
на запад.
Точность этого датчика определяется на уровне 68 процентов. В случае, когда основное распределение является нормальным по Гауссу, точность составляет одно стандартное отклонение. Например, если датчик курса возвращает значение курса 60 градусов и значение точности 10 градусов, существует 68-процентная вероятность того, что истинный курс находится в диапазоне от 50 до 70 градусов.