2009-07-09 13 views
1

Je travaille sur des gestes en utilisant des valeurs d'accélération (x, y, z) à partir d'un dispositif.Utilisation des Accéléromètre

Si je tiens l'appareil dans ma main dans une position de repos (x, y, z) = ((0,0,0)). Mais si je change la direction de l'appareil (toujours en position de repos), les valeurs sont changées en quelque chose comme ((766,766,821)). Comme tous les axes x, y, z sont modifiés par rapport à leurs orientations d'origine.

Y a-t-il un moyen (fonction trigonométrique OU autre) de résoudre ce problème?

+0

Vous devez dire quel type de sortie que vous require – teabot

+0

Voulez-vous dire: vous changez la direction de l'appareil et les numéros deviennent non-zéro même s'il ne bouge pas OU voulez-vous dire que vous changez la direction de l'appareil et les numéros sont éteints lorsque vous le déplacez de cette nouvelle position? – colithium

+0

Merci, si je change l'orientation de l'appareil, les valeurs sont modifiées (non nulles) même si l'appareil ne bouge pas. Sortie Je demande (x, y, z) d'être (0,0,0) si l'appareil ne bouge pas.Pour rendre l'orientation (directionnelle) indépendante, – Madni

Répondre

-1

Si l'appareil ne compense pas automatiquement l'accélération gravitationnelle, vous devez soustraire le vecteur (0,0, ~ 9,8m/s2) de la sortie de l'appareil.

Cependant, vous devrez également avoir l'orientation de l'appareil (angle d'Euler ou matrice de rotation). Si votre appareil ne fournit pas qu'il est fondamentalement impossible de dire si l'accélération signalée est causée par le déplacement réel de l'appareil (acc linéaire) ou par simple rotation (direction de changement de gravité).

Votre accélération compensée deviendra:

OutputAcc = InputAcc x RotMat - (0,0,9.8) 

De cette façon, votre OutputAcc vecor sera toujours dans un cadre coord local (.-À-dire Z est toujours)

+0

Merci! Je pense que cela rendra l'appareil gratuit. Connaissez-vous une implémentation de RotMat en C ?? Cordialement – Madni

+0

implémentation de RotMat en C/C++ – Madni

+0

Google pour les classes d'implémentation Vector et Matrix en C++. Obtenir le code pour multiplier un vecteur et une matrice ne devrait pas poser de problème. Obtenir les valeurs de rotation réelles de l'appareil est la partie délicate. – Radu094

1

Je trouve votre question peu claire. Que mesurez-vous exactement et qu'attendez-vous?

En général, un accéléromètre, s'il est maintenu en position fixe, mesure la gravité de la terre. Ceci est affiché comme accélération vers le haut, ce qui peut sembler étrange au début mais est tout à fait correct: lorsque la gravité accélère "vers le bas" et que le dispositif est dans une position fixe, une force dans la direction opposée doit être appliquée. La force dont vous avez besoin pour maintenir l'appareil dans une position fixe est cette force, qui a une accélération correspondante dans la direction «vers le haut». En fonction de votre appareil, cette accélération gravitationnelle peut être soustraite avant d'obtenir les valeurs dans le PC. Mais, si vous tournez l'accéléromètre, l'accélération gravitationnelle est toujours autour et pointe toujours dans la même direction «vers le haut». Si, avant de tourner l'accéléromètre, "haut" correspondrait à x il correspondra à un axe différent s'il est tourné de 90 °, disons et. Ainsi, l'accélération mesurée sur l'axe x et l'axe et changeront. Pour répondre à votre question, il est nécessaire de savoir comment votre accéléromètre présente les valeurs. Je doute que dans une position de repos les valeurs d'accélération mesurées sont (0, 0, 0).

+0

Je suis d'accord. La rotation d'un accéléromètre d'une position fixe à une autre devrait entraîner des valeurs de sortie différentes. – Key

+0

Merci, Les valeurs de l'accéléromètre à posion au repos sont \t x = 766; \t y = 766; \t z = 821; où x est horizontal et z est vertical qui est sous l'influence de la gravité. – Madni

1

Votre commentaire permet de clarifier la question. Ce que vous devez faire est Calibrer votre accéléromètre à chaque fois que les changements d'orientation. Il n'y a pas moyen de contourner cela. Vous pouvez en faire un élément d'interface utilisateur dans votre application ou, si cela correspond à vos usages, recalibrer à 0 si l'accélération est relativement constante pendant un certain temps (ne fonctionnera pas si vous mesurez de longues accélérations).

Le calibrage est intégré à l'API de l'appareil (consultez la documentation) ou à quelque chose que vous devez faire manuellement. Pour le faire manuellement, vous devez lire l'accélération actuelle et stocker ces 3 valeurs. Ensuite, chaque fois que vous prenez une lecture de l'appareil, soustrayez ces 3 valeurs de chaque valeur lue.

+0

Merci, Comment nous pouvons faire le calibrage. J'ai 3 valeurs quand l'appareil est à NE PAS bouger (i-e x = 766; y = 766; z = 821). Je le soustrais des événements actuels pour les rendre + - valeurs. Le problème est de changer l'orientation de l'appareil. Les valeurs (x, y, z) sont modifiées. Comment rendre l'orientation des valeurs libre – Madni

+0

Vous devez recalibrer chaque fois que vous changez radicalement l'orientation. Vous pouvez le faire automatiquement en utilisant la technique que j'ai suggérée. Autant que je sache, la plupart des accéléromètres standard ne s'ajustent pas dynamiquement pour l'orientation. – colithium

5

L'accélération due à la gravité sera toujours présente. Il semble que vous soustrayez cette valeur de l'un des axes lorsque le périphérique est dans une orientation particulière. Ce que vous devrez faire pour détecter les gestes est de détecter la petite différence qui apparaît momentanément de l'accélération due à la gravité lorsque les dispositifs commencent à bouger. Vous ne serez pas en mesure de détecter si l'appareil est immobile ou se déplace à une vitesse constante, mais vous serez en mesure de déterminer s'il tourne ou s'il accélère.

Les valeurs (x, y, z) vous donnent un vecteur qui indique la direction de l'accélération. Vous pouvez calculer la longueur (carrée de) de ce vecteur comme x^2 + y^2 + x^2. Si c'est la même chose que lorsque l'appareil est au repos, alors vous savez que l'appareil n'est pas accéléré, mais dans une certaine orientation. (Soit au repos, ou se déplaçant à une vitesse constante.

Pour détecter un mouvement, vous devez remarquer le changement momentané de la longueur de ce vecteur lorsque l'appareil commence à bouger, et à nouveau lorsqu'il est arrêté. Ce changement sera probablement minuscule par rapport à la gravité.

Vous devrez comparer l'orientation du vecteur d'accélération pendant le mouvement pour déterminer la direction du mouvement. Notez que vous ne serez pas capable de distinguer chaque geste. Par exemple, déplacer l'appareil vers l'avant (et s'arrêter là) a le même effet que d'incliner légèrement l'appareil, puis de le ramener à la même orientation.

Les gestes les plus faciles à détecter sont ceux qui modifient l'orientation de l'appareil. D'autres gestes, comme un mouvement de frappe, seront plus difficiles à détecter. Ils apparaîtront comme un changement dans la longueur du vecteur d'accélération, mais la quantité de changement sera probablement minuscule.

EDIT:

La discussion ci-dessus est pour les valeurs normalisées de x, y et z. Vous aurez besoin de déterminer les valeurs à soustraire des lectures pour obtenir le vecteur. D'un commentaire ci-dessus, il semble que 766 sont les valeurs "zéro" à soustraire. Mais ils peuvent être différents pour les différents axes de votre appareil. Mesurez les lectures avec les appareils orientés dans les six directions. C'est obtenir les valeurs maximum et minimum pour x, y et z. Les valeurs centrales devraient être à mi-chemin entre les extrêmes (et, espérons-le, 766).

Certains gestes auront des signatures révélatrices. Si vous laissez tomber l'appareil, vous réduisez momentanément le vecteur d'accélération, puis vous l'augmentez momentanément lorsque l'appareil est arrêté.

L'élévation de l'appareil augmentera momentanément le vecteur, avant de le diminuer momentanément. Un mouvement vers l'avant augmente le vecteur momentanément, mais inclinez-le légèrement vers l'avant, puis augmentez-le momentanément, mais incliné vers l'arrière lorsque l'appareil est arrêté.

La plupart du temps, la longueur du vecteur sera égale à l'accélération due à la gravité.