使用旋转矩阵将欧拉单位转换为360度

时间:2013-02-20 06:10:50

标签: android sensor

在Android中,我使用加速度计和磁场传感器来计算空间定位,如下面的代码所示。 getRotationMatrix方法生成具有方位角,俯仰和滚动的实际单位的值。方位角和滚动给出的值范围为0到180或0到-180。然而,间距给出0到90或0到-90的值。这对我的应用程序来说是一个问题,因为在我的应用程序中,无论设备如何定位,我都需要确定唯一的位置。使用roll,您可以拥有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度时,音高的原始事件值不会为您提供唯一值,因此我非常怀疑任何矩阵变换将产生我所追求的结果。也许我使用了错误的传感器。

0 个答案:

没有答案