我正在使用
Android重力和磁场传感器通过SensorManager.getRotationMatrix和SensorManager.getOrientation来计算方向.这给了我方位角,俯仰和方位数.当设备平躺在桌子上时,结果看起来很明智.
但是,我已经在清单中禁用了纵向和横向之间的切换,所以getWindowManager().getDefaultDisplay().getRotation()始终为零.当我将设备旋转90度,使其处于垂直状态时,遇到麻烦.有时这个数字似乎是错误的,我已经意识到这与Gimbal lock有关.但是,其他应用似乎没有这个问题.例如,我将我的应用程序与两个免费的传感器测试应用(Sensor Tester (Dicotomica)和Sensor Monitoring (R’s Software))进行了比较.我的应用程序在平板设备上同意这些应用程序,但是当我将设备旋转到垂直位置时,可能会有显着差异.这两个应用程序似乎相互一致,那么他们如何解决这个问题呢?
解决方法
我认为,当设备不平坦时,定义定向角度的最佳方式是使用更适合的角度坐标系,即从SensorManager.getOrientation(…)获取的标准欧拉角度.我建议我描述一个
here on math.stackexchange.com.我还把一些代码实现它在
an answer here.除了方位角的一个很好的定义,它还有一个定义的俯仰角,这正是Math.acos给出的角度(rotationMatrix [8])在另一个答案这里提到.
您可以从我在第一段中给出的两个链接中获得完整的详细信息.但是,总而言之,来自SensorManager.getRotationMatrix(…)的旋转矩阵R是
其中(Ex,Ey,Ez),(Nx,Ny,Nz)和(Gx,Gy,Gz)是指向东,北和在重力方向上的向量.然后你想要的方位角由…给出