2016-10-19 6 views
1

Я делаю игру в 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; но дрожание слишком сильно во всех случаях.

Итак, теперь я нахожусь в точке, где, я думаю, я попытаюсь изучить фильтры калмана и реализовать его в единстве, но, очевидно, я предпочел бы решение черного ящика, чтобы сэкономить время.

+0

Я попробовал это, и это, но вы даже не потрудились опубликовать один код того, что вы пробовали. Может быть, кто-то может заметить ошибку в вашем коде? Вам необходимо опубликовать свой код фильтра. – Programmer

+0

@ Программист обновлен фрагментами кода. – user2997154

+0

Я изучаю это. Также добавьте теги к своим вопросам. Тег C# подходит для этого, чтобы сделать ваш код более удобочитаемым – Programmer

ответ

1

Нашли ошибку, любой из способов, о которых я говорил ранее, действителен при обычных обстоятельствах (используйте комбинацию для оптимальных эффектов). То, что вызывало безумный дрожание, было позицией камеры. Он был очень большим числом в качестве координат, и я предполагаю, что это испортило двигатель.

1

Всегда используйте шумоподавление при использовании аналогового входа, вы можете сделать это, вычислив разницу между значениями гироскопа в текущем кадре и значениями гироскопа в предыдущем кадре, а если разница больше, то желаемая величина (0.002 или 0.03 может быть хорошей) поверните камеру на значения гироскопа. Это, в конечном счете, решит вашу проблему, вызвав дрожь. Упование вы получите.

Смежные вопросы