首页 > 解决方案 > 前倾还是后倾?TYPE_ROTATION_VECTOR

问题描述

我试图从 Sensor.TYPE_ROTATION_VECTOR 获得音高,但我不知道如何解释结果。

无论手机向前还是向后倾斜,俯仰值似乎都是相同的(向前 = 手机顶部远离用户面部,手机底部靠近用户面部)。

图像中的线条代表从侧面观察并倾斜到不同角度的手机。顶部/中间手机垂直于地面。

我需要一个类似于方位角的值(从 -180 到 +180 并且不重复)。

@Override
public void onSensorChanged(SensorEvent sensorEvent) {
  if (sensorEvent.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
    SensorManager.getRotationMatrixFromVector(rMat, sensorEvent.values);
    SensorManager.getOrientation(rMat, orientation);
    pitch = (int) (Math.toDegrees(orientation[1]) ) ;

在此处输入图像描述

标签: javaandroidrotationandroid-sensorspitch

解决方案


我最终添加了另一个 TYPE_ACCELEROMETER 传感器侦听器。我检查 values[2] 是否为正,并根据结果将音高计算为 0 到 360 之间的数字(从 12 点开始顺时针方向)。它工作正常,但它跳过了 355-5 和 175-185 之间的一些数字。如果您有更好的解决方案,请告诉我。

来自 Android 文档:

values[2] : 绕 Z 轴的角速度(无漂移补偿),单位 rad/s

boolean isPositive = true;

@Override
public void onSensorChanged(SensorEvent sensorEvent) {
  if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    isPositive = sensorEvent.values[2] > 0;
  }

  if (sensorEvent.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
    SensorManager.getRotationMatrixFromVector(rMat, sensorEvent.values);
    SensorManager.getOrientation(rMat, orientation);
    pitch = (int) (Math.toDegrees(orientation[1]) ) ;

    if(isPositive) //between 6 and 12 o'clock
      pitch = 270 - pitch;
    else //between 12 and 6 o'clock
      pitch = 90 + pitch;
  //...

推荐阅读