7
votes

Filtre complémentaire (gyro + accél) avec Android

Récemment, j'ai fait des recherches pour utiliser à la fois l'accéléromètre + gyroscope pour utiliser ces sensibles pour suivre un smartphone sans l'aide du GPS (voir cet article) Système de positionnement intérieur basé sur gyroscope et accéléromètre

pour Cette fin, j'aurai besoin de mon orientation (angle (pitch, rouleau, etc.)) Alors ici ce que j'ai fait jusqu'à présent: xxx

ici, j'essaie d'inclure ( Juste pour tester) de mon accéléromètre (pitch), de l'intégration du gyroscope_x Time Filtrant le filtrage avec un filtre complémentaire

filtré_angle [0] = (0.98F) * (filtré_angle [0] + gyro_x * dt) + (0.02f) * (hauteur)

avec DT commence plus ou moins 0.009 secondes

mais je ne sais pas pourquoi mais mon angle ne sont pas Vraiment précis ... lorsque le périphérique est situé à plat sur la table (écran orienté vers le haut) xxx

et lorsque je soulevez le téléphone de 90 ° (voir l'écran à l'écran. mur en face de moi) xxx

de sorte que les angles ne atteignent jamais 90 ??? Même si j'essaie de soulever le téléphone un peu plus ... Pourquoi ne va-t-il pas avant 90 °? Mon calcul est-il faux? ou est la qualité de la merde de capteur?

Une autre chose que je me demande est que: avec Android, je ne "lit pas" la valeur du capteur mais je suis notifiée quand ils monnaie. Le problème est que comme vous le voyez dans le code L'ACCEL et GYRO partagent la même méthode .... Donc, lorsque je calcule l'angle filtré, je prendra la hauteur de l'accélél mesure 0,009 secondes avant, non? Est-ce peut-être la source de mon problème?

merci!


4 Réponses :


5
votes

6 commentaires

Merci pour votre aide et désolé de faire vos trucs répétés. En effet, le tutoriel Gentlnav est vraiment sympa! Je viens de le lire rapidement et il explique assez bien le DCM, je vais le lire plus avec précaution, j'ai trouvé une question similaire sur Stackoverflow où vous parlez du même tutoriel et vous dites que vous l'utilisez votre motion humaine. Cela signifie donc que vous parvenez à réussir à obtenir une bonne orientation à l'aide de DCM? Stackoverflow.com/questions/5314217/... < / a> merci


@Alexis Pas de problème et bonne chance! Oui, j'ai une implémentation C ++, mais il n'est pas trop difficile d'écrire la vôtre en Java pour Android. Peut-être que des applications existent malheureusement, je n'en savais pas. Est juste une orientation assez pour votre application?


Comme c'est juste un projet pour mon école, j'étais juste intéressé à savoir si c'était possible .. Après de nombreuses lectures, j'ai découvert que ce n'est pas :) ou si c'est une voie à venir mes compréhensions de maths ... Donc je suis Il suffit de changer un peu et d'essayer de jouer avec Gyro + Accel pour seulement obtenir une orientation :)


Je viens de trouver que: diydrones.com/profiles/blogs/a-simple-deadreckoning Il utilise le DCM + DateReckoning pour suivre un avion (il s'interroge deux fois pour obtenir la position, mais je n'ai pas indiqué comment il corrige le résultat)


@ALEXIS Je n'ai pas vérifié les détails mais il me semble que son algorithme est basé sur le GPS et l'IMU est utilisé pour "combler les lacunes". Oui, vous pouvez le faire avec le filtre Kalman, mais dans votre question, vous dites que vous n'avez pas / utilisez GPS.


@Ali merci pour votre explication, pouvez-vous me guider sur cette question? Stackoverflow.com/Questions/27137239/... < / a>




0
votes

Je teste votre code et j'ai constaté que le facteur d'échelle n'est probablement pas cohérent. Convertir le pitch sur 0-PI donne un meilleur résultat. Dans mon test, le résultat filtré est à environ 90 degrés.

pitch = (float) Math.toDegrees(Math.atan2(accel[1], Math.sqrt(Math.pow(accel[2], 2) + Math.pow(accel[0],   2))));
pitch = pitch*PI/180.f;

filtered_angle = weight * (filtered_angle + event.values[0] * dT) + (1.0f-weight)* (pitch);


0 commentaires

-1
votes

J'ai essayé et cela vous donnera angle 90 ... xxx


0 commentaires