В этом разделе описываются оси датчиков, базовые датчики и составные датчики (активность, положение, неоткалиброванные и интерактивные).
Оси датчиков
Значения сенсорных событий от многих сенсоров выражаются в определенном кадре, который является статическим по отношению к устройству.
Оси мобильного устройства
Сенсорный API относится только к естественной ориентации экрана (оси не меняются местами при изменении ориентации экрана устройства).
Рисунок 1. Система координат (относительно мобильного устройства), используемая Sensor API
Автомобильные оси
В реализациях Android Automotive оси определяются относительно рамы кузова автомобиля. Началом системы отсчета транспортного средства является центр задней оси. Система отсчета транспортного средства ориентирована так, что:
- Ось X направлена вправо и находится в горизонтальной плоскости, перпендикулярной плоскости симметрии автомобиля.
- Ось Y направлена вперед и находится в горизонтальной плоскости.
Рисунок 2. Система координат (относительно автомобильного устройства), используемая Sensor 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
. Дополнительные сведения о возможных значениях этого поля см. в SensorManager
SENSOR_STATUS_*
.
Температура окружающей среды
Режим отчетности: при изменении
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
. Magnetic, а все значения указаны в микротеслах (uT).
Магнитометр также сообщает, насколько точными, по его мнению, будут его показания, через sensors_event_t.magnetic.status
. Magnetic.status. Дополнительные сведения о возможных значениях этого поля см. в SensorManager
SENSOR_STATUS_*
.
Показания калибруются с использованием:
- Температурная компенсация
- Заводская (или онлайн) калибровка мягкого железа
- Калибровка железа онлайн
Гироскоп
Режим отчетности: непрерывный
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_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, когда устройство неподвижно.
Если устройство оснащено гироскопом, датчик линейного ускорения должен использовать гироскоп и акселерометр в качестве входных данных.
Если устройство не имеет гироскопа, датчик линейного ускорения должен использовать в качестве входных данных акселерометр и магнитометр.
Значительное движение
Базовый физический датчик: акселерометр (или другой, но с низким энергопотреблением)
Режим отчетности: однократный
Малая мощность
Реализуйте только пробуждающую версию этого датчика.
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
. Дополнительные сведения о возможных значениях этого поля см. в SensorManager
SENSOR_STATUS_*
.
Некалиброванные датчики
Некалиброванные датчики дают более необработанные результаты и могут иметь некоторую погрешность, но также содержат меньше «скачков» из-за поправок, примененных во время калибровки. Некоторые приложения могут предпочесть эти неоткалиброванные результаты как более плавные и надежные. Например, если приложение пытается провести собственное слияние датчиков, введение калибровок может фактически исказить результаты.
Акселерометр не откалиброван
Базовый физический датчик: акселерометр
Режим отчетности: непрерывный
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)
возвращает датчик пробуждения
Датчик угла шарнира измеряет угол в градусах между двумя составными частями устройства. Ожидается, что движение шарнира, измеряемое датчиком этого типа, изменит способы взаимодействия пользователя с устройством, например, раскладывая или открывая дисплей.
Композитные датчики взаимодействия
Некоторые датчики в основном используются для обнаружения взаимодействий с пользователем. We don't define how those sensors must be implemented, but they must be low power and it's the responsibility of the device manufacturer to verify their quality in terms of user experience.
Wake up gesture
Underlying physical sensors: Undefined (anything low power)
Reporting-mode: One-shot
Low-power
Implement only the wake-up version of this sensor.
getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE)
returns a wake-up sensor
A wake up gesture sensor enables waking up the device based on a device specific motion. When this sensor triggers, the device behaves as if the power button was pressed, turning the screen on. This behavior (turning on the screen when this sensor triggers) might be deactivated by the user in the device settings. Changes in settings don't impact the behavior of the sensor: only whether the framework turns the screen on when it triggers. The actual gesture to be detected isn't specified, and can be chosen by the manufacturer of the device.
This sensor must be low power, as it's likely to be activated 24/7.
Each sensor event reports 1
in sensors_event_t.data[0]
.
Pick up gesture
Underlying physical sensors: Undefined (anything low power)
Reporting-mode: One-shot
Low-power
Implement only the wake-up version of this sensor.
getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE)
returns a wake-up sensor
A pick-up gesture sensor triggers when the device is picked up regardless of wherever it was before (desk, pocket, bag).
Each sensor event reports 1
in sensors_event_t.data[0]
.
Glance gesture
Underlying physical sensors: Undefined (anything low power)
Reporting-mode: One-shot
Low-power
Implement only the wake-up version of this sensor.
getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE)
returns a wake-up sensor
A glance gesture sensor enables briefly turning the screen on to enable the user to glance content on screen based on a specific motion. When this sensor triggers, the device will turn the screen on momentarily to allow the user to glance notifications or other content while the device remains locked in a non-interactive state (dozing), then the screen will turn off again. This behavior (briefly turning on the screen when this sensor triggers) might be deactivated by the user in the device settings. Changes in settings do not impact the behavior of the sensor: only whether the framework briefly turns the screen on when it triggers. The actual gesture to be detected isn't specified, and can be chosen by the manufacturer of the device.
This sensor must be low power, as it's likely to be activated 24/7. Each sensor event reports 1
in sensors_event_t.data[0]
.