2010-11-23 41 views
2

J'ai récemment joué avec l'accéléromètre Android en utilisant le SDK Android et le SDK Adobe AIR pour Android sur mon Motorola Droid. Ce que j'ai remarqué, c'est que l'accéléromètre fonctionne très bien, mais je me demandais s'il était possible de compenser d'une façon ou d'une autre pour ne pas avoir à utiliser l'appareil en position horizontale. En d'autres termes, je veux utiliser l'accéléromètre pour contrôler mon affichage visuel, mais l'initialiser (ou le modifier d'une manière ou d'une autre) pour ne pas avoir à le tenir parfaitement à plat (pas très amusant de se pencher sur le téléphone). Est-ce que quelqu'un sait comment je peux tenir l'appareil confortablement dans ma main, disons 45 degrés, et utilise toujours l'accéléromètre pour fournir des lectures avant/arrière? Est-ce possible? Des exemples de ceci sont-ils disponibles?Utilisation de l'accéléromètre Android sans avoir l'appareil plat

+0

Salut, Je sais que c'est vieux, mais avez-vous trouvé un exemple par hasard? – xtrimsky

Répondre

1

Vous aurez besoin de maths de multiplication matricielle simple pour cela. "Calibrez" la rotation en prenant la matrice courante quand vous démarrez l'application et l'inversez, puis multipliez toutes les matrices suivantes avec elle - cela vous donnera le delta à la position de départ.

+0

Ça a l'air génial! Exactement ce que tu viens de dire? Je comprends les transformations et la multiplication matricielle. Mais quand vous vous référez à la "matrice actuelle quand je démarre l'application" et "toutes les matrices suivantes" faites-vous référence à l'accéléromètre ou l'affichage? Tout conduit sur un exemple? Merci EboMike! – Shawn

+0

Fondamentalement, lorsque vous interrogez l'accéléromètre, vous obtiendrez une matrice. (Cochez tous les exemples de code récents, ils finiront tous par une matrice.) Ils finissent par faire plus de magie juju pour obtenir des angles d'Euler, mais ne vont pas aussi loin - il suffit de prendre la matrice brute de l'accéléromètre et l'inverser). Ensuite, chaque fois que vous interrogez à nouveau l'accéléromètre, multipliez-le par la matrice initiale que vous avez stockée. Cela vous donnera une belle matrice delta - PUIS vous pouvez aller de l'avant et obtenir des angles euler. – EboMike

+0

Je suppose que vous voulez dire les valeurs x, y, z de l'accéléromètre, correct? Peut-être qu'un exemple de code aiderait à clarifier? Merci EboMike! – Shawn

0

J'avais écrit il y a longtemps une application qui traitait des rotations relatives. J'ai oublié ce que le code a fait, mais d'après ce que je peux voir, il semble que -

1) J'obtiens la matrice de rotation initiale en utilisant - SensorManager.getRotationMatrix (R, I, gravity.clone(), géomagnétique. cloner()); (La gravité et le géomagnétique sont les matrices d'accélération et les géomagnétiques.) Je ne sais pas pourquoi j'utilise des clones, mais il doit y avoir une raison.) 2) Maintenant, à tout moment, obtenez la matrice de rotation actuelle et appelez-la R. 3) Calculez l'inverse de la matrice initiale et appelez-la "initialInverse". 4) Multipliez R par initialInverse (ou inversement, vous devrez le comprendre). 5) Obtenez votre orientation finale en utilisant SensorManager.getOrientation (delta, valeurs)

Je suis désolé mais j'ai complètement oublié ce que fait le code ci-dessus. Je pense que je me souviens d'avoir lu les mots Euler Transformer quelque part quand j'ai écrit cette application, alors c'est ce que cela pourrait faire. Malheureusement, je ne peux pas vous donner le code complet puisque je vais probablement lancer cette application sur le marché. Cependant, si vous avez besoin de plus d'informations, s'il vous plaît faites le moi savoir - je vais regarder dans le code et revenir vers vous.

0

Je travaille sur un projet de nature similaire où la fonction accéléromètre n'est pas limitée par la position. Ma façon de le gérer est très simple, initialiser l'accéléromètre avec la lecture en cours par défaut. En d'autres termes, vous avez un bouton que vous appuyez une fois que vous avez le téléphone dans la bonne position, en appuyant sur le bouton, les lectures actuelles de l'accéléromètre (mesures de G) seront votre référence (valeurs zéro), et faire des changements vous allez au-dessus ou au-dessous de ces lectures ... J'espère que cela aide quelqu'un ... acclamations