向前倾斜还是向后倾斜? TYPE_ROTATION_VECTOR

Pitched forward or backwards? TYPE_ROTATION_VECTOR

我正在尝试从 Sensor.TYPE_ROTATION_VECTOR 获取音高,但我不知道如何解释结果。

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

图像中的线条表示从侧面观察并倾斜到不同角度的 phone。 top/middle phone垂直于地面

我需要一个类似于方位角的值(从 -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]) ) ;

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

来自 Android 文档:

values[2] : angular speed (w/o drift compensation) around the Z axis in 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;
  //...