我开发了一个Android应用程序,它需要设备倾向于实时处理。设备倾斜在表面上
我想计算角度,为此我使用project in github来计算音高值。但是这种方法返回的音高值在多次测试中并不准确..在音高值中,大多数时候都有一些误差。
同一个程序在另一部手机上测试时,它在同一位置显示不同的音高值(将电话放在桌面上)。
有什么方法可以在多个设备上获得准确的音高值。
我使用过s6和一加2设备。
答案 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轴沿着平面的长边(从尾部到鼻子)。
预计手机之间存在差异。