Дополнительный фильтр (гироскоп + ускорение) с Android

Недавно я провел небольшое исследование, чтобы использовать акселерометр и гироскоп, чтобы использовать эти датчики для отслеживания смартфона без помощи GPS (см. этот пост) Внутреннее позиционирование Система на основе гироскопа и акселерометра

Для этой цели мне понадобится моя ориентация (угол (тангаж, крен и т. Д.)), Так что вот что я сделал до сих пор:

public void onSensorChanged(SensorEvent arg0) {
    if (arg0.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
    {
        accel[0] = arg0.values[0];
         accel[1] = arg0.values[1];
   accel[2] = arg0.values[2];
   pitch = Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0], 2))));

  tv2.setText("Pitch: " + pitch + "\n" + "Roll: " + roll);

   } else if (arg0.sensor.getType() == Sensor.TYPE_GYROSCOPE )
{
  if (timestamp != 0) {
  final float dT = (arg0.timestamp - timestamp) * NS2S;         
  angle[0] += arg0.values[0] * dT;
  filtered_angle[0] = (0.98f) * (filtered_angle[0] + arg0.values[0] * dT) + (0.02f)* (pitch);
   }        
   timestamp = arg0.timestamp;
 }
}

Здесь я пытаюсь наклонить (только для тестирование) от моего акселерометра (шаг), от интеграции gyroscope_X через время, фильтруя его дополнительным фильтром

filter_angle [0] = (0.98f) * (filter_angle [0] + gyro_x * dT) + (0.02f) * (pitch)

с dT начинаются примерно с 0,009 секунды

Но я не знаю, почему, но мой угол не совсем точен ... когда устройство p положение на столе (экран направлен вверх)

Pitch (angle fromm accel) = 1.5 (average) 
Integrate gyro = 0 to growing (normal it's drifting) 
filtered gyro angle = 1.2

и когда я поднимаю телефон на 90 ° (вижу, что экран обращен к стене передо мной)

Pitch (angle fromm accel) = 86 (MAXIMUM) 
Integrate gyro = he is out ok its normal 
filtered gyro angle = 83 (MAXIMUM)

Таким образом, углы никогда не достигают 90 ° ??? Даже если я попытаюсь поднять телефон еще немного ... Почему он не поворачивается до 90 °? Я ошибаюсь в расчетах? или качество сенсора - дерьмо?

Еще одна вещь, которая меня интересует, это то, что: с Android я не «считываю» значения сенсора, но получаю уведомления, когда они меняются. Проблема в том, что, как вы видите в коде, Accel и Gyro используют один и тот же метод ...поэтому, когда я вычисляю отфильтрованный угол, я возьму шаг измерения ускорения за 0,009 секунды, не так ли? Может быть, это причина моей проблемы?

Спасибо!

6
задан Community 23 May 2017 в 12:18
поделиться