Complémentaires filtre (Gyro + accel) avec Android

Récemment, j'ai fait quelques recherches à la fois utiliser l'accéléromètre + Gyroscope à l'utilisation de ces encore senser pour suivre un smartphone sans l'aide du GPS (voir ce post)
L'intérieur du Système de Positionnement basé sur le Gyroscope et l'Accéléromètre

Pour cela j'aurai besoin de mon orientation (angle de tangage, de roulis, etc..)) alors voici ce que j'ai fait jusqu'à présent:

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

Ici, je suis en train d'angle (juste pour le test) de mon accéléromètre (pitch), à partir de l'intégration de la gyroscope_X dans le temps de la filtrer avec une complémentarité filtre

filtered_angle[0] = (0.98 f) * (filtered_angle[0] + gyro_x * dT) + (0.02 f)* (hauteur)

avec dT commencer plus ou moins de 0,009 secondes

Mais je ne sais pas pourquoi, mais mon point de vue ne sont pas vraiment précis...lorsque l'appareil est en position à plat sur la table (Écran orienté vers le haut)

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

et quand je lève le téléphone de 90° (voir l'écran est orienté vers le mur en face de moi)

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

Donc les angles de ne jamais atteindre 90 ??? Même si j'essaie de soulever le téléphone un peu plus...
Pourquoi ne pas aller jusqu'à 90° ? Sont mon calcul de mal? ou est la qualité du capteur de la merde?

UNE autre chose que je me demande c'est qui: avec Android, je n'ai pas "lu" la valeur de la sonde mais je suis averti lorsqu'elles changent. Le problème est que, comme vous le voyez dans le code de l'Accel et du Gyroscope de partager la même méthode.... alors, quand je calcule le filtrée angle, je vais prendre de la hauteur de l'accel mesure de 0,009 secondes avant, non ? C'est peut-être la source de mon problème?

Merci !

InformationsquelleAutor Alexis | 2011-09-26