如何解释在 Android 中检测摇晃事件背后的数学原理?
How to interpret the math behind detecting a shake event in Android?
我在网上看到很多答案,它们都有类似的复制粘贴代码,但 none 确实对他们使用的数学有解释。我对 tutorialspoint 上的代码有一个 URL,这与我在 Whosebug 上看到的答案相同。但是有人可以向我解释这部分代码吗:
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
float delta = mAccelCurrent - mAccelLast;
// What is this doing?
mAccel = mAccel * 0.9f + delta;
if (mAccel > 12) {
Toast.makeText(getApplicationContext(), "Shake event detected", Toast.LENGTH_SHORT).show();
}
}
这条线应该做什么
mAccel = mAccel * 0.9f + delta;
0.9f 是从哪里来的,为什么我们要将它自相乘并加上 delta?我的物理不强,所以对我来说不是很明显。
https://www.tutorialspoint.com/how-to-detect-shake-event-in-android-app
我查看了代码,也在您链接的 tutorialspoint 页面上。我在算法中看到 3 个步骤:
mAccelCurrent
计算为当前加速度的绝对值
delta
计算为当前加速度绝对值与先前加速度绝对值之差。这样做是为了摆脱恒定的加速度值(重力)并放大摇晃运动(加速度的变化)。
mAccel
计算为 delta
的 exponential smoothing,一阶滤波,系数为 0.9,根据调用此函数的时间,可以高值或低值(如果被频繁调用,则为低值)。你说得对 0.1f
乘法看起来丢失了,但是如果你查看受保护的 void onCreate
函数中的代码,你会看到 mAccel
在 [=17= 处初始化].换句话说,mAccel
是 delta
的指数平滑的 10 倍。
- 然后将结果与 12 进行比较,12 在我看来是一个任意值。
如果您愿意,可以使用 0.1 乘法,这足以将与之比较的值减少 10 倍(1.2 而不是 12)
我在网上看到很多答案,它们都有类似的复制粘贴代码,但 none 确实对他们使用的数学有解释。我对 tutorialspoint 上的代码有一个 URL,这与我在 Whosebug 上看到的答案相同。但是有人可以向我解释这部分代码吗:
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
float delta = mAccelCurrent - mAccelLast;
// What is this doing?
mAccel = mAccel * 0.9f + delta;
if (mAccel > 12) {
Toast.makeText(getApplicationContext(), "Shake event detected", Toast.LENGTH_SHORT).show();
}
}
这条线应该做什么
mAccel = mAccel * 0.9f + delta;
0.9f 是从哪里来的,为什么我们要将它自相乘并加上 delta?我的物理不强,所以对我来说不是很明显。
https://www.tutorialspoint.com/how-to-detect-shake-event-in-android-app
我查看了代码,也在您链接的 tutorialspoint 页面上。我在算法中看到 3 个步骤:
mAccelCurrent
计算为当前加速度的绝对值delta
计算为当前加速度绝对值与先前加速度绝对值之差。这样做是为了摆脱恒定的加速度值(重力)并放大摇晃运动(加速度的变化)。mAccel
计算为delta
的 exponential smoothing,一阶滤波,系数为 0.9,根据调用此函数的时间,可以高值或低值(如果被频繁调用,则为低值)。你说得对0.1f
乘法看起来丢失了,但是如果你查看受保护的void onCreate
函数中的代码,你会看到mAccel
在 [=17= 处初始化].换句话说,mAccel
是delta
的指数平滑的 10 倍。- 然后将结果与 12 进行比较,12 在我看来是一个任意值。
如果您愿意,可以使用 0.1 乘法,这足以将与之比较的值减少 10 倍(1.2 而不是 12)