2013-12-19 2 views
0

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

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

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

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

Моя идея, основанная на многопользовательской ошибке, заключалась в том, чтобы прослушивать акселерометр и события магнитного поля и использовать матрицу вращения для расчета дельт между углами. Определенная дельта на оси х будет интерпретироваться как наклонение (кивка), и определенная дельта на 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; 
    } 
} 

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

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

Заранее благодарен!

ответ

-1

Этот код поможет вам определить тряску: 1

Смежные вопросы