1

在 Android 中,我使用加速度计和磁场传感器来计算空间定位,如下面的代码所示。getRotationMatrix 方法生成具有方位角、俯仰角和滚动角的真实单位值。方位角和滚动给出 0 到 180 或 0 到 -180 范围内的值。然而,Pitch 给出的值是 0 到 90 或 0 到 -90。这对我的应用程序来说是个问题,因为在我的应用程序中,无论设备的方向如何,我都需要确定唯一的位置。使用滚动,您可以有 2 个具有相同值的位置。

我需要应用矩阵变换,将传感器值重新映射到范围从 0 到 360 度的值(实际上,360 无效,因为它与 0 相同,任何接近 360 的值都会产生一个像 359.99999 的数字。 .)

我不是数学家,也不知道如何使用矩阵,更不用说在 Android 中使用它们了,但我知道这是获得 0 到 360 度转换所需要的。如果矩阵也处理方位角和滚动,这样它们也会产生从 0 到 360 的值,但如果这不可能,那很好,因为仍然可以从它们的传感器值中得出唯一的位置。有什么建议我如何创建这个矩阵转换?

@Override
public void onSensorChanged(SensorEvent event)
{
  try
  {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
      accelerometerValues = event.values;
    else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
      magneticFieldValues = event.values;

    if ((accelerometerValues != null) && (magneticFieldValues != null))
    {

      float[] R = new float[9];
      float I[] = new float[9];

      boolean success = SensorManager.getRotationMatrix(R, I, accelerometerValues, magneticFieldValues);

      if (success)
      {
        float[] values = new float[3];
        SensorManager.getOrientation(R, values);

        // Convert from radians to degrees if preferred.
        values[0] = (float) Math.toDegrees(values[0]); // Azimuth
        values[1] = (float) Math.toDegrees(values[1]); // Pitch
        values[2] = (float) Math.toDegrees(values[2]); // Roll
      }
    }
  }
  catch (Exception ex)
  {
  }
}

编辑: 当您将设备旋转 360 度时,音高的原始事件值不会为您提供唯一值,因此我非常怀疑任何矩阵变换都会产生我所追求的结果。也许我使用了错误的传感器。

4

0 回答 0