Android:加速度传感器中的z值范围在不同设备上不同

2024-05-03

我想检测设备是否面朝上。 (不是成角度,而是平放在地面上)。
在某些面朝上的设备上,z 值将返回 9~10 之间的值。 (大多数设备)
然而,在 Nexus 7 上,对于面朝上,z 值将返回 6~8 之间的值。

我的代码是:

if(z_value > 9.0) {
    // device facing up
}
else {
    // device is in angled
}

但是,上面的代码不再起作用。由于 Nexus7 未达到 z_value 9。

如何检测设备是否(完全)朝上。 (不要求 z_value > 0)

我的完整代码如下:

@Override
protected void onStart() {
    super.onStart();
    try {
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
        if(sensorList.size() > 0){
            accelerometerPresent = true;
            accelerometerSensor = sensorList.get(0);  
        }
        else{
            accelerometerPresent = false;  
        }
        if(accelerometerPresent){
            sensorManager.registerListener(accelerometerListener, accelerometerSensor, SensorManager.SENSOR_DELAY_UI);
        }
    } catch(Exception e) {}
}

private SensorEventListener accelerometerListener = new SensorEventListener(){

            @Override
            public void onAccuracyChanged(Sensor arg0, int arg1) {}

            @Override
            public void onSensorChanged(SensorEvent arg0) {
                float z_value = arg0.values[2];
                Log.d("test", "z:" + z_value);
            }};

Note #1
对于 Nexus 7,arg0.sensor.getMaximumRange() 返回 19.6133。哪个传感器永远不会返回。

Note #2
如果摇动设备,z_value 往往会稍高一些(有时为 8~8.5)。 如果您稳定地倾斜设备,z_value 不会达到 8(最大值)。


显然该设备校准不佳。校准良好的设备应返回 9.81m/s^2,即重力加速度。

您可以做什么:将 z 值与 x 和 y 值进行比较。如果 z 值占主导地位,则设备朝上。例如:

if (z/sqrt(x^2+y^2+z^2+1.0e-6) > 0.9) { // Facing up

我添加了这个词1.0e-6这样你就不会意外地除以零。

这种启发式方法需要测试和调整,但我想您已经明白了。祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:加速度传感器中的z值范围在不同设备上不同 的相关文章

随机推荐