目前我完全陷入大學鍛鍊。過去幾天我一直在努力嘗試,也做了大量的研究,但是我想要做一些不可能的事情,或者我在推理中遇到了一個可怕的錯誤。通過加速度計和磁場傳感器檢測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,無論我如何移動或搖晃我的電話。
我希望有人能給我提示我的代碼或我的想法有什麼問題。
在此先感謝!