【问题标题】:Android Tilt Compensated CompassAndroid 倾斜补偿指南针
【发布时间】:2013-05-01 05:44:26
【问题描述】:

我正在尝试为我正在从事的项目制作一个指南针应用程序,该应用程序可以在穿越崎岖地形时使用。我使用了标准的TYPE_ACCELEROMETERTYPE_MAGNETIC_FIELD 传感器,它似乎给出了相当准确的读数。但是,当我将手机围绕其 y 轴和 z 轴倾斜时,即使手机指向同一方向(恒定 z 轴),标题读数也会发生变化。

有谁知道如何弥补这一点?示例代码将不胜感激。

这是我目前正在使用的代码:

private void updateDirection() {
  float[] R = new float[16];
      float[] orientationValues = new float[3];

      if(SensorManager.getRotationMatrix (R, null, accelerometerValues, magneticValues)){

        SensorManager.getOrientation (R, orientationValues);

        orientationValues[0] = (float)Math.toDegrees (orientationValues[0]);
        orientationValues[1] = (float)Math.toDegrees (orientationValues[1]);
        orientationValues[2] = (float)Math.toDegrees (orientationValues[2]);

        if(orientationValues[0] < 0){
          orientationValues[0] = 360 + orientationValues[0];
        }

        final int trueNorthHeading = NavigationUtils.getTrueNorthBearing(currentLocation, orientationValues[0]);
        if(trueNorthHeading == currentHeading) {
      return;
    }

        int accuracy = 3;
        if(NavigationUtils.isSignificantHeadingChange(currentHeading, trueNorthHeading, accuracy, SIGNIFICANT_CHANGE_LIMIT)){

          int headingChangeDegrees = NavigationUtils.getStearageDegree(currentHeading, trueNorthHeading);
      currentHeading = trueNorthHeading;    

      navigationManager.headingUpdate(trueNorthHeading, Math.round(orientationValues[0]), headingChangeDegrees);

          Log.d("COMPASS", "North: values[0]: " + (int)orientationValues[0]);
        }
      }
}

感谢您的帮助,

亚当

【问题讨论】:

  • 您的意思是当您旋转它时,它被某种设备固定在适当位置时会发生轻微变化?还是比轻微的漂移更明显?
  • 当围绕 y 轴旋转时,即使手机指向同一个方向,返回的值也会从 160* 变为 200*。 Defo 比轻微的漂移更重要。
  • 手机是平放还是竖放?

标签: android android-sensors


【解决方案1】:

使用 TYPE_GRAVITY 代替,或者如果不可用,则使用低通滤波器或卡尔曼滤波器过滤您的加速度计。 TYPE_GRAVITY 将低通滤波器的精度提高了 10 度。

【讨论】:

  • 没用。事实上,它使情况变得更糟。考虑到他们在增强现实方面投入了多少精力,您可能会认为 Google 的聪明人会编写一个简单的 API 来完成这类事情。
  • 我不太明白您帖子中的问题到底是什么。是关于方位角的错误吗?你的手机在什么位置?
  • 手机要平放在桌子上,远离所有磁场干扰。假设它的方向[0] 是 150*,当我围绕 y 轴旋转它时,比如向左或向右旋转大约 60*,即使没有围绕z 轴。
  • 当你说绕y轴旋转时,你的意思是手机在y轴不变的情况下抬起?
  • 是的。因此,将手机平放,顶部远离您(就像您在看书一样),然后左右倾斜。
【解决方案2】:

试过这个Android getOrientation() method returns bad results,它似乎工作。

按照建议将过滤器应用于方向结果以及原始加速度计阵列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多