Android设备方向,音高计算不一致

时间:2016-01-20 13:55:11

标签: android android-sensors android-orientation

我开发了一个Android应用程序,它需要设备倾向于实时处理。设备倾斜在表面上

我想计算角度,为此我使用project in github来计算音高值。但是这种方法返回的音高值在多次测试中并不准确..在音高值中,大多数时候都有一些误差。

同一个程序在另一部手机上测试时,它在同一位置显示不同的音高值(将电话放在桌面上)。

有什么方法可以在多个设备上获得准确的音高值。

我使用过s6和一加2设备。

1 个答案:

答案 0 :(得分:0)

通过首先应用滚动,然后应用俯仰,最后应用偏航旋转来定义旋转矩阵。如果你首先应用音高,然后滚动并再次最终偏航,你可以将手机放在相同的位置。这就是为什么你期望某个音调,但你得到的值不准确。

为了向自己证明这一点,通过按照特定顺序应用角度旋转将其置于某个随机位置来玩电话,然后尝试按不同的旋转顺序到达相同的位置(尝试的好位置是电话处于垂直位置,例如将电话放在脸前并向侧面倾斜一点。)

大多数时候你会使用像这样的代码

int rotation = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
if(rotation == 0) // Default display rotation is portrait
    SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_Y, R2);
else   // Default display rotation is landscape
    SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2);

使其更直观。这就是你虚拟会改变顺序的方式,因为你仍然通过首先应用roll定义旋转矩阵,然后是俯仰,最后是偏航旋转,但是这个旋转是针对新的定义的XYZ坐标系。

  

public abstract void onSensorChanged(int sensor,float [] values)   在API级别1中添加

     

传感器值更改时调用。值数组的长度和内容取决于所监视的传感器。有关可能的传感器类型的详细信息,请参阅SensorManager。

     

下面使用的坐标系的定义。

     

X轴指的是屏幕的水平轴(纵向模式下的小边缘,横向模式中的长边)并指向右侧。

     

Y轴指的是屏幕的垂直轴,指向屏幕的顶部(原点位于左下角)。

     

当设备背在桌子上时,Z轴指向天空。

     

重要说明:当设备的屏幕方向改变时,交换轴。要访问未填充的值,请在值[]中使用索引3,4和5.

     

SENSOR_ORIENTATION,SENSOR_ORIENTATION_RAW:

     

所有值都是以度为单位的角度。

     

值[0]:方位角,绕Z轴旋转(0 <=方位角<360)。 0 =北,90 =东,180 =南,270 =西

     

值[1]:间距,围绕X轴旋转(-180 <=间距<= 180),当z轴向y轴移动时具有正值。

     

值[2]:滚动,绕Y轴旋转(-90 <=滚动&lt; = 90),当z轴向x轴移动时为正值。

     

请注意,这种偏航,俯仰和滚转的定义不同于航空中使用的传统定义,其中X轴沿着平面的长边(从尾部到鼻子)。

预计手机之间存在差异。