2

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

我已经翻译了 教程中的 JAVA 代码,以便我的 Compass 显示正确的 North 。

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);
        }
    }
4

1 回答 1

1

磁场传感器会包含大量噪声

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

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

对于“真”北与磁北

您可以查看从当前磁偏角接收到的偏移量,调整从传感器获得的读数。

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

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

关于补偿手机倾斜和俯仰的有趣答案:

可以补偿倾斜和俯仰的 Android 指南针

于 2016-05-22T14:05:38.393 回答