当我的Android设备不平时,我该如何计算方位角,音高,方向?

gis*_*ing 12 android sensor orientation

我正在使用Android重力和磁场传感器通过SensorManager.getRotationMatrix和SensorManager.getOrientation计算方向.这给了我方位角,俯仰和方向数.当设备平放在桌子上时,结果看起来很合理.

但是,我在清单中禁用了纵向和横向之间的切换,因此getWindowManager().getDefaultDisplay().getRotation()始终为零.当我将设备旋转90度以使其垂直竖立时,我遇到了麻烦.有时这些数字似乎非常错误,我意识到这与万向节锁相关.但是,其他应用程序似乎没有这个问题.例如,我将我的应用与两个免费传感器测试应用程序(传感器测试仪(Dicotomica)传感器监测(R软件))进行了比较.当设备平坦时,我的应用程序同意这些应用程序,但当我将设备旋转到垂直位置时,可能会有很大差异.这两个应用程序似乎彼此一致,那么他们如何解决这个问题呢?

Hoa*_*yen 9

当设备不平坦时,您必须在呼叫remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);前打电话getOrientation.

azimuth通过返回getOrientation由正交获得投影设备单元Y axis进入世界East-North plane,然后计算所得到的投影矢量和北轴之间的角度.

现在我们通常将方向视为后置摄像头指向的方向.也就是说的方向-Z,其中Z是指出在屏幕的装置轴线.当设备处于平坦状态时,我们不会考虑方向并接受所提供的内容.但当它不平坦时,我们预计它是方向-Z.但是getOrientation计算方向Y axis,因此我们需要Y and Z axes在调用前交换getOrientation.这正是remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR)它做的,它保持X axis完整和地图Z to Y.

那么你怎么知道什么时候到remap.你可以通过检查来做到这一点

float inclination = (float) Math.acos(rotationMatrix[8]);
if (result.inclination < TWENTY_FIVE_DEGREE_IN_RADIAN 
            || result.inclination > ONE_FIFTY_FIVE_DEGREE_IN_RADIAN)
{
    // device is flat just call getOrientation
}
else
{
    // call remap
}
Run Code Online (Sandbox Code Playgroud)

上面的倾斜是设备屏幕和世界东北平面之间的角度.它显示了设备倾斜的程度.


Sto*_*lly 7

我认为当设备不平坦时定义方向角的最佳方法是使用更合适的角度坐标系统,即您获得的标准欧拉角SensorManager.getOrientation(...).我建议我在math.stackexchange.com上描述的那个.我也把一些代码,不会实现它的答案在这里.除了方位角的良好定义之外,它还具有俯仰角的定义,该角度恰好是由此给出的Math.acos(rotationMatrix[8])另一个答案中提到的角度.

您可以从我在第一段中给出的两个链接中获取完整的详细信息.但是,总之,来自SensorManager.getRotationMatrix(...)的旋转矩阵R

R矩阵定义的方程

其中(E x,E y,E z),(N x,N y,N z)和(G x,G y,G z)是指向东,北和重力方向的矢量.然后你想要的方位角由下式给出

定义方位角的方程