Обнаружение наклона и дрожания устройства Android с помощью акселерометра и датчиков магнитного поля

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

Какая у меня цель? - Я хочу реализовать приложение для Android (android: minSdkVersion = "8"), которое позволяет отправлять сообщения обратной связи (положительные или отрицательные) через OSC. Отправка обратной связи должна быть возможна не только путем нажатия некоторых кнопок (это было довольно просто ;-), но также путем встряхивания и наклона устройства.

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

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

Моя идея, основанная на частом поиске в Google, заключалась в том, чтобы прислушиваться к событиям акселерометра и магнитного поля и использовать матрицу вращения для вычисления дельт между углами. Определенная дельта на оси x будет интерпретироваться как наклон (кивание), а определенная дельта на оси y будет дрожать. Поскольку я пока не пришел к хорошему результату, я спрашиваю себя, правильный ли это подход ?!

В настоящее время мой SensorEventListener выглядит так:

/**
 * TYPE_ACCELEROMETER
 * <ul>
 * <li>SensorEvent.values[0] Acceleration force along the x axis (including
 * gravity) in m/s2</li>
 * <li>SensorEvent.values[1] Acceleration force along the y axis (including
 * gravity) in m/s2</li>
 * <li>SensorEvent.values[2] Acceleration force along the z axis (including
 * gravity) in m/s2</li>
 * </ul>
 * 
 * TYPE_MAGNETIC_FIELD
 * <ul>
 * <li>SensorEvent.values[0] Geomagnetic field strength along the x axis in
 * µT</li>
 * <li>SensorEvent.values[1] Geomagnetic field strength along the y axis in
 * µT</li>
 * <li>SensorEvent.values[2] Geomagnetic field strength along the z axis in
 * µT</li>
 * </ul>
 */
@Override
public void onSensorChanged(SensorEvent event) {
    now = event.timestamp;

    // Handle the events for which we registered
    switch (event.sensor.getType()) {
    case Sensor.TYPE_ACCELEROMETER:
        System.arraycopy(event.values, 0, valuesAccelerometer, 0, 3);

        // no magnetic field data
        if (isArrayZeroFilled(valuesMagneticField)) {
            return;
        }

        // if rotation matrix cannot be retrieved
        if (!SensorManager.getRotationMatrix(null, rotationMatrix,
                valuesAccelerometer, valuesMagneticField))
            return;

        SensorManager.getOrientation(rotationMatrix, valuesOrientation);

        // valuesOrientation
        // values[0]: azimuth, rotation around the Z axis.
        // values[1]: pitch, rotation around the X axis.
        // values[2]: roll, rotation around the Y axis.

        zRotation = valuesOrientation[0];
        xRotation = valuesOrientation[1];
        yRotation = valuesOrientation[2];

        float xRotationDelta = Math.abs(xRotation - lastXRotation);
        System.out.println("x rotation delta " + xRotationDelta);

        float yRotationDelta = Math.abs(yRotation - lastYRotation);
        System.out.println("y rotation delta " + yRotationDelta);

        float zRotationDelta = Math.abs(zRotation - lastZRotation);
        System.out.println("z rotation delta " + zRotationDelta);

        break;

    case Sensor.TYPE_MAGNETIC_FIELD:
        System.arraycopy(event.values, 0, valuesMagneticField, 0, 3);
        break;
    }
}

Как ни странно, дельты y и z всегда равны 0,0, независимо от того, как я двигаю или встряхиваю телефон.

Я надеюсь, что кто-нибудь сможет мне подсказать, что не так в моем коде или в моем мышлении.

Заранее спасибо!


person Ramona Zeppelin-Punkt    schedule 19.12.2013    source источник


Ответы (1)


Этот код поможет вам обнаружить дрожание: 1

person gregm    schedule 25.06.2014