На данный момент я полностью зациклен на университетских упражнениях. Я очень старался последние несколько дней, а также провел много исследований, но либо я пытаюсь сделать что-то невозможное, либо я страдаю от ужасной ошибки в рассуждениях.
Какая у меня цель? - Я хочу реализовать приложение для 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, независимо от того, как я двигаю или встряхиваю телефон.
Я надеюсь, что кто-нибудь сможет мне подсказать, что не так в моем коде или в моем мышлении.
Заранее спасибо!