3

我想检测设备是否朝上。(不成角度,但朝上与地面平齐)。
在某些面向上的设备上,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);
            }};

注意 #1
arg0.sensor.getMaximumRange() 为 Nexus 7 返回 19.6133。哪个传感器永远不会返回。

注意#2
如果你摇动设备,z_value 往往会稍微高一点(有时是 8~8.5)。如果您稳定地倾斜设备,z_value 不会达到 8(最大值)。

4

2 回答 2

2

显然该设备校准不佳。经过良好校准的设备应返回 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,这样你就不会不小心被零除。

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

于 2012-10-22T19:35:58.830 回答
-1

关于这种传感器的总体思路是避免使用它们,或者不以您的应用程序依赖真正精确测量的方式滥用它们。

这个传感器的问题基本上是它们的值范围确实不同,而且它们真的很嘈杂,所以它们需要由编码人员进行归一化,并且它们在准确性方面不能那么可靠。

我忘记了这次公开演讲的确切名称,但即使是 Google 和 Android 团队也建议不要在小数方面过分依赖它,或者不要期望很高的准确性;还要记住,这款智能手机和平板电脑的每一小部分都非常便宜,我们谈论的是通常不超过 1 美元的传感器。

尝试以您的代码只需要一般方向或轴的方式进行编码,如果您想要一个值,请确保它是一个整数并且始终进行粗略计算并且不要期望精度或小数。

还要记住,Android 不提供对这些值的规范化方法,因此您必须在代码中处理它。

于 2012-10-22T19:28:00.030 回答