Акселерометр и другие датчики — Class Overview ( описание класса )


Этот класс представляет собой датчик событий и содержит информацию такую ​​как тип датчика, отметки времени, точности и конечно данные датчика.

Definition of the coordinate system used by the SensorEvent API.

Координатная-система определяется по отношению к экрану телефона в стандартной ориентацией (см рисунок ниже ) . Оси не переключаются, когда экран устройства изменения ориентацию

Ось X горизонтально к экрану и указывает вправо, ось Y вертикальна и направлена ​​вверх экрана , а точки Z оси к внешней стороне передней части экрана. В этой системе координат за экраном находятся отрицательные значения Z.

 

Sensors coordinate-system diagram.
 

Примечание: Данная система координат отличается от той, которая используется в Android 2D API, где начало в левом верхнем углу.

 

Summary


Fields
public int accuracy Точность этого события.
public Sensor sensor Датчик сгенерировал это событие
public long timestamp Время в наносекундах от момента возникновения события
public final float[] values Длина и содержимое массива значений зависит от типа датчика (см. также SensorEvent для определения системы координат).
[Expand]

Inherited Methods
 From class java.lang.Object

Поля


public int accuracy

Добавлен в API level 3

Точность события. Смотри SensorManager для подробностей

public Sensor sensor

Добавлен в API level 3

Датчик сгенерировал это событие. Смотри SensorManager для подробностей

public long timestamp

Добавлено в  API level 3

Время в наносекундах от момента возникновения события

public final float[] values

Добавлено в API level 3

 

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

Sensor.TYPE_ACCELEROMETER: датчик ускорений

Все значения в системе единиц СИ (м / с ^ 2)

  • values[0]: Ускорение минус Gx по оси Х
  • values[1]: Ускорение минус Gy на оси Y.
  • values[2]: Ускорение минус Gz на оси Z.

Датчик этого типа измеряет ускорение действующее на устройство (Ad). Он делает это путем измерения сил, действующих на сам датчик (Fs), используя соотношение:

Ad = — ∑Fs / mass
В частности, сила тяжести всегда влияют на измеренное ускорение:

Ad = -g — ∑F / mass
По этой причине, когда устройство лежит на столе (и скорее всего не ускоряется), акселерометр считывает величины G = 9,81 м / с ^ 2

Точно так же, когда устройство находится в состоянии свободного падения и, следовательно, опасным ускорение по направлению к земле на 9,81 м / с ^ 2, ее акселерометр считывает величину 0 м / с ^ 2.

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

     public void onSensorChanged(SensorEvent event)
     {
          // alpha is calculated as t / (t + dT)
          // with t, the low-pass filter's time-constant
          // and dT, the event delivery rate

          final float alpha = 0.8;

          gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
          gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
          gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

          linear_acceleration[0] = event.values[0] - gravity[0];
          linear_acceleration[1] = event.values[1] - gravity[1];
          linear_acceleration[2] = event.values[2] - gravity[2];
     }

Примеры:

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

Sensor.TYPE_MAGNETIC_FIELD: магнитное поле

Все значения в микро-Тесла (uT) окружающего магнитного поля по оси X, Y и Z.

Sensor.TYPE_GYROSCOPE: датчик гироскоп

Все значения в радианах / сек и измерения скорости вращения вокруг местных X устройства, Y и Z оси. Система координат такое же, как используется для датчика ускорения. Вращение положительное в направлении против часовой стрелки. То есть, наблюдатель, смотрящий с некоторыми положительными место на х, у, г оси устройства расположены на происхождение будет отчитываться положительное вращение, если устройство, казалось, вращающиеся против часовой стрелки. Отметим, что это стандартные математические определения положительного вращения и не согласен с определением данного рулона ранее.

  • values[0]: Angular speed around the x-axis
  • values[1]: Angular speed around the y-axis
  • values[2]: Angular speed around the z-axis

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

     private static final float NS2S = 1.0f / 1000000000.0f;
     private final float[] deltaRotationVector = new float[4]();
     private float timestamp;

     public void onSensorChanged(SensorEvent event) {
          // This timestep's delta rotation to be multiplied by the current rotation
          // after computing it from the gyro sample data.
          if (timestamp != 0) {
              final float dT = (event.timestamp - timestamp) * NS2S;
              // Axis of the rotation sample, not normalized yet.
              float axisX = event.values[0];
              float axisY = event.values[1];
              float axisZ = event.values[2];

              // Calculate the angular speed of the sample
              float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);

              // Normalize the rotation vector if it's big enough to get the axis
              if (omegaMagnitude > EPSILON) {
                  axisX /= omegaMagnitude;
                  axisY /= omegaMagnitude;
                  axisZ /= omegaMagnitude;
              }

              // Integrate around this axis with the angular speed by the timestep
              // in order to get a delta rotation from this sample over the timestep
              // We will convert this axis-angle representation of the delta rotation
              // into a quaternion before turning it into the rotation matrix.
              float thetaOverTwo = omegaMagnitude * dT / 2.0f;
              float sinThetaOverTwo = sin(thetaOverTwo);
              float cosThetaOverTwo = cos(thetaOverTwo);
              deltaRotationVector[0] = sinThetaOverTwo * axisX;
              deltaRotationVector[1] = sinThetaOverTwo * axisY;
              deltaRotationVector[2] = sinThetaOverTwo * axisZ;
              deltaRotationVector[3] = cosThetaOverTwo;
          }
          timestamp = event.timestamp;
          float[] deltaRotationMatrix = new float[9];
          SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
          // User code should concatenate the delta rotation we computed with the current rotation
          // in order to get the updated rotation.
          // rotationCurrent = rotationCurrent * deltaRotationMatrix;
     }

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

Sensor.TYPE_LIGHT: датчик света

values[0]: Уровня внешней освещенности в люксах единиц СИ

Sensor.TYPE_PRESSURE: датчик давления

values[0]: Атмосферное давление в гПа (мбар)

Sensor.TYPE_PROXIMITY: датчик расстояния

values[0]: Датчик расстояния измеряется в сантиметрах

Note: Некоторые датчики поддерживает только двоичный вид измерения «близко или далеко». В этом случае датчик передает  максимальное значение диапазона в дальнем положении и минимум  в ближнем положении.

Sensor.TYPE_GRAVITY: датчик гравитации

Трехмерной вектор, указывающий направление и величину силы тяжести. Единицы измерения м / с ^ 2. Система координат такое же, как используется датчик ускорения.

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

Sensor.TYPE_LINEAR_ACCELERATION: датчик линейного ускорения

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

Из датчика силы тяжести и линейного ускорения  датчик  линейного ускорения  подчиняется следующим соотношениям:

acceleration = gravity + linear-acceleration

Sensor.TYPE_ROTATION_VECTOR: датчик — вектор вращения

Вектор вращения представляет ориентации устройства в виде комбинации угла и оси, в которой устройство имеет поворачивается на угол θ вокруг оси <x, z> y,.

Эти три элемента вращения вектора <x*sin(θ/2), y*sin(θ/2), z*sin(θ/2)>, например, что величина вектора вращения равна грех (θ / 2), и направление вращения вектора равен направление оси вращения.

 

Эти три элемента вектора вращения равны последние три компоненты единичного кватерниона <соз (θ / 2), х * грех (θ / 2), у * грех (θ / 2), г * грех (θ / 2)>.

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

Система координат определяется как прямое ортонормированный базис, где:

  • X определяется как векторное произведение YZ (Это по касательной к земле на текущее местоположение устройства и примерно пунктов Востока).
  • Y направлена ​​по касательной к земле на текущее местоположение устройства и указывает на магнитный север.
  • Z указывает на небо и перпендикулярно к земле.

 

World coordinate-system diagram.
 

values[0]: x*sin(θ/2)

values[1]: y*sin(θ/2)

values[2]: z*sin(θ/2)

values[3]: cos(θ/2) (optional: only if value.length = 4)

Sensor.TYPE_ORIENTATION: датчик ориентация

Все значения углов в degrees.

  • values ​​[0]: азимут, угол между магнитным севером направлении и Y-оси, вокруг оси (от 0 до 359). 0 = север, 90 = восток, 180 = юг, 270 = запад
  • values[1]: Pitch, вращение вокруг оси х (-180 до 180), с положительными значениями, когда оси движется по направлению к оси у.
  • values [2]: Roll, вращение вокруг оси у (-90 до 90), с положительными значениями, когда оси х движется по направлению к оси.

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

Примечание: Этот тип датчика существует по причинам совместимости, пожалуйста, используйте getRotationMatrix () в сочетании с remapCoordinateSystem () и GetOrientation () для вычисления этих значений вместо этого.

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

Sensor.TYPE_RELATIVE_HUMIDITY: датчик относительной влажности

values[0]: Относительная влажность окружающего воздуха в процентах

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

Точка Росы это температура, до которой данный объем воздух должен быть охлажден, при постоянном атмосферном давлении, для конденсации водяных паров в воду.

 

                    ln(RH/100%) + m·t/(Tn+t)
 td(t,RH) = Tn · ------------------------------
                 m - [ln(RH/100%) + m·t/(Tn+t)]
td — точка росы температура  °C
t — текущая температура °C
RH — действительная относительная влажнсть в  %
m= 17.62
Tn= 243.12 °C

Например

 h = Math.log(rh / 100.0) + (17.62 * t) / (243.12 + t);
 td = 243.12 * h / (17.62 - h);

Абсолютная влажность — содержание паров воды в единице объема воздуха в г/куб.м

 

                    RH/100%·A·exp(m·t/(Tn+t))
 dv(t,RH) = 216.7 · -------------------------
                           273.15 + t
dv — абсолютная влажность g/m3
t — текущая температура  °C
RH- актуальная относительная влажность %
m=17.62
Tn=243.12 °C
A=6.112 hPa

Например:

 dv = 216.7 *
 (rh / 100.0 * 6.112 * Math.exp(17.62 * t / (243.12 + t)) / (273.15 + t));

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