加速度计值的行为类似于倾斜计



我为下面的accelxyz得到的值不符合预期。

它似乎充当倾斜传感器而不是加速度计。

当我把手机扔到空中接住它时,accel值的变化不超过 10%。相比之下,当我随机旋转手机时,我得到了 50-100% 的更大变化!

什么可以解释这一点?我只是想检测手机何时处于自由落体状态(和/或影响某些东西)。

SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE);
Sensor sensor = sm.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);
    sm.registerListener(
        sel = new SensorEventListener(){
            @Override public void onAccuracyChanged(Sensor arg0, int arg1) {}
            @Override public void onSensorChanged(SensorEvent arg0) {
                        double x = se.values[0];
                        double y = se.values[1];
                        double z = se.values[2];
                        double accel = Math.sqrt(
                                            Math.pow(x, 2) +    
                                            Math.pow(y, 2) + 
                                            Math.pow(z, 2));
            }
        }, 
        sensor, 
        SensorManager.SENSOR_DELAY_NORMAL
   );

(作为一个附带问题,x、y 和 z 的值似乎比它们应该高得多,accel静止不动时平均约为 50-80?不应该在9.8左右吗?

x,y和z值似乎对手机方向的变化非常敏感,但根本不代表加速度。我错过了什么吗??

手机仍然躺在背上的示例值:加速度 = 85.36, x = 6.8, y = 45.25 z = 30.125

我必须替换

Sensor sensor = sm.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);

Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

可能是因为当您投掷手机时,它几乎是相同的平面或角度并且处于低速时,当您转动手机时,它会迅速改变其航向和方向,从而为结果提供更高的值。加速度计对于多功能设备来说可能用词不当,您可能真正想要从中获得结果的功能有一个选择参数。

将手机放在背面时,X 和 Y 传感器应该接近零,Z 传感器应该接近 9.8。 9.8当然是由于重力。

我的第一个问题是手机有问题,并建议在另一部手机上尝试相同的代码。

但是我注意到数学中存在一些错误,但尚未弄清楚是什么。

有了你提到的x,y,z的值,结果(平方和的平方根)计算为54.78,而不是你在帖子中提到的85.36。

我对Java很陌生,所以我不容易发现可能出错的地方,也没有机会在手机上尝试这段代码,但我认为数学很简单,可以确定结果是错误的。(或者至少我希望如此)。

要检查的另一件事(假设您弄清楚了数学问题)是,当您将手机抛向空中时,微小的变化可能只是由于响应时间慢。加速度计输出可能只是变化太慢,所以当手机落地时,输出不会有太大变化。 可以通过使用 SENSOR_DELAY_GAME 或 SENSOR_DELAY_FASTEST 而不是正常来改善响应。

顺便说一下,这不应该是arg0.values[]而不是se.values[]吗? SE从何而来? 传感器值进入onSensorChanged的参数(在本例中为arg0),因此我无法弄清楚它们应该如何结束于se。 (但话又说回来,Java中有很多东西我仍然不明白)

最新更新