Android Compass不指向North并且不断变化

时间:2016-05-22 11:40:14

标签: c# android xamarin xamarin.android rotateanimation

所以,我一直在努力在我的Android Compass中修复这个bug 2天了。 基本上我正在尝试使用Xamarin.Android构建一个Qibla指南针。第一步应该是建立一个指向北方的指南针。

  

我已经从我的指南针的this教程中翻译了JAVA代码,以显示正确的北方。

I am simply rotating my Relative Layout which contains my Compass Image whenever Sensor reading Changes.

我试过直觉调整代码,但这个简单的指南针并不喜欢呆在一个地方。我只是试图将我的指南针图像的北方与磁北方对齐。

然而,我的指南针从未显示正确的北方,北方也在不断变化。

  

要检查我的设备Compass确实有效,我从Playstore测试了一个应用程序,它运行得很顺利。

我的活动:

public class QiblaDirectionActivity : Activity, ISensorEventListener
//all the right inherits done

我的设计代码片段:

            <RelativeLayout
            android:layout_width="wrap_content"
            android:id="@+id/qiblaRL"
            android:layout_height="wrap_content">
            <ImageView
                android:id="@+id/qiblaCompass"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:scaleType="fitCenter"
                android:layout_centerInParent="true"
                android:src="@drawable/compass" />
            <ImageView
                android:id="@+id/qiblaArrow"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:scaleType="fitCenter"
                android:layout_centerInParent="true"
                android:src="@drawable/needle" />
        </RelativeLayout>

我的后端:

 float currentCompassDegree = 0f;
 public void OnSensorChanged(SensorEvent e)
    {
       //I have checked the accuracy its high
        RotateAnimation ra = new RotateAnimation(currentCompassDegree,-e.Values[0], Dimension.RelativeToSelf, 0.5f, Dimension.RelativeToSelf, 0.5f);
        ra.Duration = 120;
        ra.FillAfter = true;
        qiblaRL.StartAnimation(ra);

        currentCompassDegree = -e.Values[0];

    }

我在这里注册我的听众:

protected override void OnResume()
    {
        base.OnResume();
        if (_sensorManager != null)
        {

            var mF = _sensorManager.GetDefaultSensor(SensorType.MagneticField);
            _sensorManager.RegisterListener(this, mF, SensorDelay.Ui);
            qiblaAdvice.Text= "(Align Device Properly)";
        }
        else
        {
            qiblaAdvice.Text = "(Device doesn't support Compass)";
        }



    }

我在这里取消注册:

   protected override void OnPause()
    {
        base.OnPause();

        if (_sensorManager != null)
        {
            _sensorManager.UnregisterListener(this);
        }
    }

1 个答案:

答案 0 :(得分:1)

磁场传感器会包含很多噪音

您需要对其进行采样和平滑。

这是一个答案,有人将高通滤波器样本从Apple / iOS转换为Android以获取加速度计读数,但我将其用于其他平滑目的,您可以将其从三个轴上剥离。就像我做过的那样:

对于&#34; true&#34;北与磁北

您可以查看从 当前偏差中获得的偏移量,并调整您从传感器获得的读数。

关于这一点有很多问题/答案,这里只有一个:

  

来自真北的磁场水平分量的偏角,以度为单位(即正值表示磁场从真北向东旋转很多)。

有关补偿手机Tilt和Pitch的有趣答案:

Android Compass that can Compensate for Tilt and Pitch