Android 加速度计的方向感知

14

我正在测试两个不同设备(Elocity A7 和 Archos 7 Home tablet)的加速度计输出,但传感器似乎给出了不同的结果。我已经将其设置为横屏模式,但是在两台设备之间,x轴和y轴似乎相反。当垂直于地面时,x轴返回10,而Archos X轴则返回0。Elocity平板电脑运行的是Android 2.2,而Archos运行的是2.1。有人能指导我如何使这两个设备之间的加速度计方向保持同步吗?

4个回答

16

实际上,加速度计轴相对于设备的默认方向。

以下是如何处理它的方法:

static void canonicalOrientationToScreenOrientation(
         int displayRotation, float[] canVec, float[] screenVec) 
{ 
    final int axisSwap[][] = { 
    {  1,  -1,  0,  1  },     // ROTATION_0 
    {-1,  -1,  1,  0  },     // ROTATION_90 
    {-1,    1,  0,  1  },     // ROTATION_180 
    {  1,    1,  1,  0  }  }; // ROTATION_270 

    final int[] as = axisSwap[displayRotation]; 
    screenVec[0]  =  (float)as[0] * canVec[ as[2] ]; 
    screenVec[1]  =  (float)as[1] * canVec[ as[3] ]; 
    screenVec[2]  =  canVec[2]; 
} 

此解决方案由NVidia提供。请查看他们的白皮书以获取有关Android加速度计的更多详细信息。


抱歉,您在canVec和on screenVec上添加了什么?我假设displayrotation是用于PROTRAIT或LANDSCAPE常量,对吗? - Dante
2
更多详细信息,请查看此链接http://developer.download.nvidia.com/tegra/docs/tegra_android_accelerometer_v5f.pdf。 - Hartok

12

我想在Hartok的回答中补充一些内容,因为起初我无法理解...

我已经重写了这个方法:

public static float[] adjustAccelOrientation(int displayRotation, float[] eventValues) 
{ 
    float[] adjustedValues = new float[3];

    final int axisSwap[][] = {
    {  1,  -1,  0,  1  },     // ROTATION_0 
    {-1,  -1,  1,  0  },     // ROTATION_90 
    {-1,    1,  0,  1  },     // ROTATION_180 
    {  1,    1,  1,  0  }  }; // ROTATION_270 

    final int[] as = axisSwap[displayRotation]; 
    adjustedValues[0]  =  (float)as[0] * eventValues[ as[2] ]; 
    adjustedValues[1]  =  (float)as[1] * eventValues[ as[3] ]; 
    adjustedValues[2]  =  eventValues[2];

    return adjustedValues;
}

这其实就是同样的东西,只不过使用了更加用户友好的变量名,并且我重新创建了float内部,因为我需要这样做... 只需调用此函数,将getRotation和event.values float数组输入其中,检查其返回的float数组的值并选择您喜欢的数字即可...

希望这能对某些人有所帮助!


抱歉,但我该在displayRotation整数上放什么?我已经从public void onSensorChanged(SensorEvent event)调用了名为event的SensorEvent。我错过了什么?我应该添加什么? - Dante
2
你需要显示旋转。 (WindowManager) this.getSystemService(WINDOW_SERVICE).getDefaultDisplay().getRotation() - user1504495

7
据我所知,这是由于设备的默认方向。例如,新的Android平板电脑使用Honeycomb系统时,当像在手机上一样横向握持时,其方向为竖屏模式。

http://developer.android.com/reference/android/hardware/SensorEvent.html

在安卓文档中提到了以下信息:
坐标系相对于手机屏幕的默认方向确定。设备的屏幕方向改变时,坐标轴不会交换。
X轴是水平的,指向右侧;Y轴是垂直的,指向上方;Z轴指向屏幕正面的外部。在这个系统中,屏幕后面的坐标具有负的Z值。
也许其中一个设备也将横向作为纵向(默认)方向?
希望对您有所帮助。

4
正如先前所述,不同设备的默认屏幕方向可能会有所不同。加速度计坐标始终与设备的默认方向相匹配。对于屏幕坐标,其行为不同。随着设备旋转,屏幕坐标也会旋转,以便(0, 0)始终是屏幕当前左上角。在默认方向为纵向的设备上锁定方向为纵向,将确保传感器坐标沿着与屏幕坐标相同的轴线运行,而不管旋转如何。另一方面,在默认方向为横向的设备上锁定屏幕方向为纵向将导致传感器轴线与屏幕轴线运行方向不同。
本文:http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html更深入地解释了这一点,并提供了解决该问题的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接