2010-01-19 6 views
4

Je veux créer une application capable de détecter le nombre de rotation lorsque l'utilisateur fait pivoter l'appareil iPhone. Actuellement, j'utilise l'API Compass pour obtenir l'angle et essayer de nombreuses façons de détecter le spin. Ci-dessous la liste des solutions que j'ai essayé: 1/Créer 2 pièges à angle (pièce sur le tour complet) sur le tour complet pour détecter si l'angle que nous obtenons de la boussole les a transmis ou non. 2/Somme toute la distance angulaire entre les mises à jour de la boussole (dans la fonction updateHeading). Essayons de diviser l'angle somme à 360 => nous pourrions obtenir le numéro de spinDétecter la rotation de l'iPhone?

Le problème est: lorsque le téléphone est tourné trop vite, la boussole ne peut pas rattraper la vitesse du téléphone, et il nous revient l'angle avec le dernier temps (pas continuellement comme dans la rotation réelle).

Nous essayons également d'utiliser l'accéléromètre pour détecter rotation. Cependant, cette méthode ne peut pas fonctionner lorsque vous faites pivoter le téléphone sur un plan plat.

Si vous avez une solution ou une expérience sur cette question, s'il vous plaît aidez-moi.

Merci beaucoup.

Répondre

0

Vous pouvez utiliser la vélocité de l'accélération pour déterminer la vitesse à laquelle le téléphone tourne et l'utiliser pour remplir les blancs jusqu'à ce que le téléphone soit arrêté, à quel point vous pouvez interroger à nouveau la boussole.

3

L'iPhone4 contient un gyrocompas MEMS, c'est donc l'itinéraire le plus direct.

Comme vous l'avez remarqué, le magnétomètre a une réponse lente. Cela peut être réduit en utilisant un algorithme d'anticipation qui utilise la lenteur pour faire une supposition éclairée sur ce que la direction actuelle est vraiment.

Tout d'abord, vous devez déterminer la performance réelle du capteur. Pour ce faire, vous devez le faire tourner à une vitesse précise à chacune de plusieurs vitesses de rotation, et enregistrer le comportement de la boussole. La plate-forme de rotation devrait avoir un moyen de lire la position instantanée.

À des vitesses plus lentes, vous observerez un certain retard fixe. Au fur et à mesure que la vitesse augmente, le décalage augmente jusqu'à ce qu'il se rapproche de 180 degrés, point auquel la boussole se retourne soudainement. À des vitesses plus élevées, tout ce que vous verrez est retourné, bien qu'il puisse sembler ne pas retourner lorsque les flips se répètent à la même valeur. À certaines de ces vitesses plus élevées, la boussole peut sembler tourner vers l'arrière, à l'opposé du sens de rotation.

Obtenir une table de rotation peut être un problème, et s'assurer qu'il n'affecte pas le champ magnétique local (rendant la boussole inutile) est un défi. La table idéale sera faite d'aluminium, et si vous devez utiliser une table en acier (la plus courante), vous devrez monter le téléphone sur une plate-forme non magnétique pour l'éloigner le plus possible de l'acier.

Un atelier d'usinage local sera un bon point de départ: les machines CNC sont facilement capables de faire ce qui est nécessaire. Une fois que vous obtenez les données de performance de la boussole, vous devrez construire un modèle des lectures observées par rapport à l'orientation et au taux de rotation réels. Inversez le modèle et appliquez-le aux lectures pour obtenir une estimation des lectures réelles. Une implémentation d'algorithme simple consistera à conserver un historique des lectures et à conserver une liste de la différence entre les lectures séquentielles. Puisque nous savons qu'il y a un décalage de la boussole, quand une valeur de différence est non nulle, nous saurons que la valeur actuelle a un certain degré d'imprécision dû au décalage.L'étape suivante consiste à créer une liste de lectures "corrigées", où le décalage connu des valeurs réelles antérieures est utilisé pour générer une valeur mise à jour qui est utilisée pour créer une valeur mise à jour ajoutée à la dernière valeur dans la liste 'corrigée', et est stockée en tant que nouvelle valeur. Lorsque la correction cumulée (la différence entre les dernières valeurs dans la liste réelle et la liste corrigée dépasse 360 ​​degrés, cela signifie que nous ne savons essentiellement pas où pointe la boussole.) Espérons que ce point ne sera pas atteint, car La plupart des mouvements de rotation doivent cependant être d'une durée assez courte

Cependant, puisque votre but est seulement de compter les rotations, vous serez à moins d'une rotation complète jusqu'à ce que l'erreur accumulée atteigne une valeur considérablement plus élevée. Vous ne savez pas quelle sera cette valeur, car elle dépend à la fois du décalage réel de la boussole et du taux de rotation réel, mais si vous vous souciez seulement d'un petit nombre de rotations (5 environ), vous devriez pouvoir obtenir des résultats utilisables.

+0

Je voudrais pouvoir vous donner plus d'un upvote pour une réponse aussi complète. –

0

Si vous utilisez un iPhone 4, le problème a été résolu et vous pouvez utiliser Core Motion pour obtenir des données de rotation. Pour les dispositifs antérieurs, je pense qu'une approche intéressante serait d'essayer de détecter wobbling lorsque le périphérique tourne, en utilisant UIAccelerometer sur un intervalle de rapport très fine. Vous pourriez être en mesure d'obtenir des motifs raisonnables détectés à partir du mouvement perpendiculaire au plan de rotation.