Сглаживание Шумного Компаса (Android) - PullRequest
0 голосов
/ 27 ноября 2018

У меня опыт AR, когда я хотел бы использовать компас телефона, чтобы направить игрока на истинный север, но у меня возникают проблемы с сглаживанием показаний компаса на устройствах Android.Код, с которым я экспериментировал до сих пор, записывает определенное количество чтений в очередь, копирует очередь в список, а затем, как только список заполнен, он принимает среднее значение всех чтений.Отсюда я хотел бы масштабировать чтение между -1 и 1, где 0 представляет Юг.Затем я хочу, чтобы эти данные использовались для поворота изображения компаса на слое графического интерфейса.

Данные далеко не такие гладкие, как хотелось бы, но вот код, который у меня есть:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CompassSlider : MonoBehaviour
{
    public float reading;
    public Queue<float> data;
    private float[] dataList;
    public int maxData = 100;
    public int count;
    public float sum, average;

    public float dampening = 0.1f;
    public float rotationToNorth;

    // Use this for initialization
    void Start()
    {
        data = new Queue<float>();
        dataList = new float[maxData];
    }

    // Update is called once per frame
    void Update()
    {
        Input.location.Start();
        Input.compass.enabled = true;

        count = data.Count;

        if (data.Count > 0)
        {
            data.CopyTo(dataList, 0);
        }

        if (data.Count == maxData)
        {
            for (int i = 0; i < data.Count; i++)
            {
                sum += dataList[i];
            }
            if (Mathf.Abs(dataList[maxData - 1]) > 0)
            {
                average = sum / maxData;
                sum = 0;
                data.Clear();
                dataList = new float[maxData];

            }
        }

        if (data.Count >= maxData)
        {
            data.Dequeue();
        }

        reading = Mathf.Round(Input.compass.trueHeading);
        data.Enqueue(reading);

        if (count == maxData) {
            rotationToNorth = average / 180;
            rotationToNorth = (Mathf.Round(rotationToNorth * 10)) / 10;
            rotationToNorth = rotationToNorth - 1;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...