安卓倾斜补偿指南针

3
我正在为我正在进行的项目制作一个指南针应用程序,该应用程序可在崎岖地形上使用。我已经使用了标准的TYPE_ACCELEROMETERTYPE_MAGNETIC_FIELD传感器,并且它似乎给出了相当准确的读数。然而,当我围绕y和z轴倾斜手机时,即使手机指向相同的方向(恒定的z轴),Heading读数也会发生变化。
有人知道如何补偿这一点吗?示例代码将不胜感激。
这是我目前正在使用的代码:
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]);
        }
      }
}

感谢您的帮助,
亚当

你的意思是说在旋转时,它被某种装置牢固地固定着,但仍然会稍微移动吗?还是说漂移比稍微移动更明显? - Jay Snayder
当围绕y轴旋转时,返回的值将从160到200不等,即使手机指向相同的方向。这比轻微漂移更重要。 - Adam Davies
手机是平放还是竖立的? - Hoan Nguyen
2个回答

2

使用 TYPE_GRAVITY,如果不可用,则使用低通滤波器或卡尔曼滤波器过滤加速度计。TYPE_GRAVITY 比低通滤波器提高了多达 10 度的精度。


没起作用。事实上,它甚至让情况变得更糟。考虑到谷歌正在投入大量精力进行增强现实技术的开发,你本以为聪明的谷歌工程师们会为这种操作提供一个简单的API。 - Adam Davies
手机的位置应该是平放在桌子上,远离所有磁干扰。假设它的方向[0]为150度,当我将其绕y轴旋转约60度左右时,即使没有绕z轴旋转,方向[0]的读数也会发生多达40度的变化。 - Adam Davies
当你说绕着 y 轴旋转时,是指手机被举起,y 轴保持不变吗? - Hoan Nguyen
由于传递给getRotationMatrix的加速度计值在旋转时不近似于重力,因此值会发生变化。您需要使用低通滤波器或卡尔曼滤波器来过滤加速度计。不要使用加速度计值,而是使用TYPE_GRAVITY,它是带有滤波的加速度计。 - Hoan Nguyen
有所改善。错误降至10*,我想我只能接受了。谢谢Hoan Nguyen。 - Adam Davies
显示剩余2条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接