2016-01-20 59 views
-1

我开发了一个android应用程序,它需要实时处理设备倾向。该设备倾斜在一个表面上Android设备方向,间距计算不一致

我想计算角度,因为我已使用project in github来计算音高值。但这种方法返回的音调值在多次测试中不准确。在音调值中,大部分时间都有一些误差。

而同样的程序通过另一部手机测试,它显示了不同的音调值在相同的位置(将手机放在桌子上)。

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

我曾经使用s6和一个加2设备。

+0

使用SensorListeners直接使用'onSensorChanged()' 供参考:http://developer.android.com/reference/android/hardware/SensorListener.html – zIronManBox

回答

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); 

,使之更加直观。这就是你如何通过虚拟改变顺序,因为你仍然有通过首先应用滚动,然后是间距,最后是偏航旋转定义的旋转矩阵,但是这个旋转是针对新的XYZ坐标系定义的。

公共抽象无效onSensorChanged当传感器值已经改变(INT传感器,浮动[]值) 加在调用的API级1

。值数组的长度和内容因所监视的传感器而异。有关可能的传感器类型的详情,请参阅SensorManager。

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

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

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

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

重要提示:当设备的屏幕方向改变时,轴被交换。要访问未打开的值,请在值[]中使用索引3,4和5。

SENSOR_ORIENTATION,SENSOR_ORIENTATION_RAW:

所有值都以度的角度。

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

values [1]:pitch,绕X轴旋转(-180 < = pitch < = 180),当z轴移动时朝着y轴。

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

请注意,偏航,俯仰和滚转的定义与X轴沿飞机长边(尾部到鼻子)的传统定义不同。

而手机之间的区别是预期的。