Я делаю игру в Unity, где основной камерой игры управляет ориентация телефона. Проблема у меня в том, что данные гироскопа очень шумные и делают камеру вращаться очень нервно. Я попробовал на другом телефоне, чтобы убедиться, что аппаратное обеспечение не является проблемой (Galaxy s6 и Sony Xperia T2).Как сгладить вход гироскопа?
Я попытался следующим, но никто не похож на работу:
-Slerp между текущим вращением и новым отношением (слишком много джиттера не зависима от того, что я умножить Time.deltaTime на)
//called at each update
transform.rotation = Quaternion.Slerp(transform.rotation, new Quaternion(-Input.gyro.attitude.x, -Input.gyro.attitude.y,
Input.gyro.attitude.z, Input.gyro.attitude.w), 60 * Time.deltaTime);
усредненные образцы последних гироскопов (либо Euleur углов среднее или Quaternion average, в обеих случаях по-прежнему не дают слишком много джиттера, независимо от того, сколько образцов я отслеживаю)
//called at each update
if (vectQueue.Count >= 5)
{
vectQueue.Enqueue(Input.gyro.attitude.eulerAngles);
vectQueue.Dequeue();
foreach (Vector3 vect in vectQueue) {
avgr = avgr + vect;
}
avgr = new Vector3(avgr.x/5, avgr.y/5,avgr.z/5);
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(avgr),Time.deltaTime*100);
}
else
{
vectQueue.Enqueue(Input.gyro.attitude.eulerAngles);
}
-Round данные гироскопа (лучшее решение до сих пор, чтобы предотвратить дрожание, но очевидно, что это не является гладким на всех)
-Применить высокий/фильтр низких частот (кажется, не делать ничего)
public float alpha = 0.5f;
//called at each update
v1 = Input.gyro.attitude.eulerAngles;
if (v2== null)
{
v2 =v1;
v3 = Input.gyro.attitude.eulerAngles;
}
else
{
v3 = (1 - alpha) * v3 + (1 - alpha)*(v1 - v2);
v2 = v1;
transform.Rotate(v3);
}
-Красный код вставки от таких людей, как this; но дрожание слишком сильно во всех случаях.
Итак, теперь я нахожусь в точке, где, я думаю, я попытаюсь изучить фильтры калмана и реализовать его в единстве, но, очевидно, я предпочел бы решение черного ящика, чтобы сэкономить время.
Я попробовал это, и это, но вы даже не потрудились опубликовать один код того, что вы пробовали. Может быть, кто-то может заметить ошибку в вашем коде? Вам необходимо опубликовать свой код фильтра. – Programmer
@ Программист обновлен фрагментами кода. – user2997154
Я изучаю это. Также добавьте теги к своим вопросам. Тег C# подходит для этого, чтобы сделать ваш код более удобочитаемым – Programmer