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 !
Vous devez vous connecter pour publier un commentaire.
Je ne peux que me répéter.
Vous obtenez la position par intégration de l'accélération linéaire à deux reprises, mais l'erreur est horrible. Il est inutile dans la pratique. En d'autres termes, que vous essayez de résoudre l'impossible.
Ce que vous pouvez faire est de suivre seulement l'orientation.
Le roulis, le tangage et le lacet sont le mal, ne les utilisez pas. Vérifiez dans la vidéo je l'ai déjà recommandé, à 38:25.
Voici un excellent tutoriel sur la façon de suivre l'orientation de gyroscopes et d'accéléromètres.
Les mêmes questions que vous pourriez trouver utiles:
la piste des petits mouvements de l'iphone avec pas de GPS
Qu'est-ce que le monde réel de l'exactitude de téléphone accéléromètres lorsqu'il est utilisé pour le positionnement?
comment calculer le téléphone du mouvement dans la direction verticale de repos?
iOS: Précision du déplacement dans l'Espace 3D
Comment utiliser l'Accéléromètre pour mesurer la distance pour le Développement d'Applications Android
La Distance parcourue par l'Accéléromètre
Comment puis-je trouver la distance parcourue avec le gyroscope et l'accéléromètre?
J'ai écrit un tutoriel sur l'utilisation de la Complémentaire Filtre pour oriëntation de suivi avec le gyroscope et l'accéléromètre: http://www.pieter-jan.com/node/11 peut-être que cela peut vous aider.
J'ai tester votre code et a constaté que, probablement, le facteur d'échelle n'est pas cohérente.
Convertir le terrain de 0-pi donne un meilleur résultat.
Dans mon test, le filtre sera d'environ 90 degrés.
j'ai essayé et cela vous donnera l'angle de 90...