L'accélération à partir d'un périphérique du système de coordonnées dans le système de coordonnées absolues
De mon appareil Android je peux lire un tableau linéaire des valeurs de l'accélération (dans le dispositif du système de coordonnées) et un tableau de l'orientation absolue des valeurs (dans la Terre du système de coordonnées). Ce dont j'ai besoin est d'obtenir le linéaire des valeurs de l'accélération dans le dernier coord. système d'.
Comment puis-je convertir?
MODIFIER après Ali répondre en commentaire:
Bon, donc si je comprends bien, lorsque je mesure l'accélération linéaire, la position de complètement le téléphone n'a pas d'importance, parce que les lectures sont donnés dans la Terre du système de coordonnées. droit?
Mais je viens de faire un test où j'ai mis le téléphone dans différentes positions et a obtenu l'accélération dans les différents axes. Il y a 3 paires de photos - les premières à montrer comment j'ai mis l'appareil (désolé pour ma Peinture "le maître de compétences") et le deuxième spectacle de lectures à partir des données fournies par le linéaire de l'acc. capteur:
- appareil mis sur le côté gauche
- appareil couché sur le dos
- dispositif permanent
Et maintenant - pourquoi, dans le troisième cas, l'accélération se produit le long de l'axe Z (n'Y) depuis la position de l'appareil n'a pas d'importance?
- A le téléphone fixe (complètement immobile) lorsque vous avez effectué les mesures? Ce qui est sur l'axe vertical? Que signifie, par exemple -14 moyenne?
- pendant les mesures, j'ai été en déplaçant le téléphone très rapide le long de l'axe Ouest-Est (comme indiqué sur ceux de la Peinture dessins) pour créer l'accélération des lectures (-14 est l'accélération en m/s*s). Et comme illustré ici link les mesures du système de coordonnées EST le téléphone lui-même.
- OK, maintenant je comprends votre expérience. Je vais corriger ma réponse.
- OK, c'était mon erreur, je suis terriblement désolé. J'ai fixé ma réponse. Aussi, j'ai upvoted votre question.
- qu'est-ce que le graphique de l'outil que vous utilisez?
- c'est juste MS Excel
- comment avez-vous réussi à le créer? êtes-vous à l'aide de tout logiciel micros le capteur de la lecture et de la création de graphiques?
- programmé pour enregistrer les lectures de fichier sur le périphérique, et juste importés manuellement dans excel. rien de fantaisie
- Ah oui! merci quand même 🙂
- Il serait effectivement préférable d'utiliser le Capteur.TYPE_GAME_ROTATION si seulement un système de coordonnées absolues est souhaité, en négligeant le vrai nord géomagnétique?
Vous devez vous connecter pour publier un commentaire.
J'ai enfin réussi à le résoudre! Donc, pour obtenir vecteur accélération dans la Terre du système de coordonnées vous avez besoin de:
float[16]
de sorte qu'il pourrait être utilisée plus tard parandroid.opengl.Matrix
classe) à partir deSensorManager.getRotationMatrix()
(à l'aide deSENSOR.TYPE_GRAVITY
etSENSOR.TYPE_MAGNETIC_FIELD
capteurs de valeurs de paramètres),android.opengl.Matrix.invertM()
sur la matrice de rotation de l'inverser (pas de transposer!),Sensor.TYPE_LINEAR_ACCELERATION
capteur pour obtenir une accélération linéaire des vecteurs (dans l'appareil coord. sys.),android.opengl.Matrix.multiplyMV()
à multiplier la matrice de rotation par une accélération linéaire du vecteur.Et là vous l'avez! J'espère que je vais gagner un temps précieux pour les autres.
Merci pour Edward Falk et Ali pour les conseils!!
Sensor.TYPE_ROTATION_VECTOR
ici developer.android.com/reference/android/hardware/...?GeomagneticField.getDeclination()
SENSOR.TYPE_GRAVITY
dansSensorManager.getRotationMatrix()
? La documentation (developer.android.com/reference/android/hardware/..., float[], float[], float[])) dit d'utiliser les valeurs de laTYPE_ACCELEROMETER
Basé sur @alex réponse, voici l'extrait de code:
Selon la documentation vous obtenez l'accélération linéaire dans le téléphone du système de coordonnées.
Vous pouvez transformer n'importe quel vecteur à partir du téléphone système de coordonnées à la Terre du système de coordonnées en le multipliant avec la matrice de rotation. Vous pouvez obtenir la matrice de rotation de getRotationMatrix().
(Peut-être qu'il y a déjà une fonction de faire cette multiplication pour vous, mais je ne fais pas de programmation Android et je ne suis pas familier avec son API.)
Un bon tutoriel sur la matrice de rotation est le Direction le Cosinus de la Matrice IMU: Théorie manuscrit. Bonne chance!
OK, tout d'abord, si vous essayez de faire de vraies de navigation par inertie sur Android, vous avez votre pain sur la planche pour vous. Pas cher peu de capteur utilisé dans les téléphones intelligents sont tout simplement pas assez précis. Bien que, il y a eu d'intéressants travaux sur intertial de navigation sur de petites distances, comme à l'intérieur d'un bâtiment. Il y a probablement d'articles sur le sujet, vous pouvez creuser. Google "Interface de Motion Conférence des Développeurs" et vous pourriez trouver quelque chose d'utile: c'est une conférence qui Invensense mettre sur un couple de mois.
Deuxième, non, accélération linéaire est dans les coordonnées de périphérique, pas de coordonnées du monde. Vous aurez à convertir vous-même, ce qui suppose de connaître le dispositif de la 3-d orientation.
Ce que vous voulez faire est d'utiliser une version d'Android qui prend en charge les capteurs virtuels TYPE_GRAVITY et TYPE_LINEAR_ACCELERATION. Vous aurez besoin d'un appareil avec les gyros à obtenir raisonnablement précis et des lectures précises.
En interne, le système combine les gyroscopes, accéléromètres et magnétomètres dans le but de venir avec de vraies valeurs pour l'orientation du périphérique. Ce partage de manière efficace l'accéléromètre de l'appareil dans sa gravité et l'accélération des composants.
Donc ce que vous voulez faire est de mettre en place le capteur auditeurs pour TYPE_GRAVITY, TYPE_LINEAR_ACCELERATION, et TYPE_MAGNETOMETER. L'utilisation de la gravité et un magnétomètre données entrées pour SensorManager. getRotationMatrix() afin d'obtenir la matrice de rotation qui va transformer les coordonnées du monde dans les coordonnées de périphérique ou vice versa. Dans ce cas, vous aurez besoin de la "versa" partie. C'est, de convertir l'accélération linéaire d'entrée de coordonnées du monde en les multipliant par la transposition de l'orientation de la matrice.
getRotationMatrix()
fourni avec la gravité et le champ magnétique de données) et de l'accélération linéaire du vecteur V (à partir de lin. acc. le capteur de l'appareil coord. sys.) comme ceci: UN=RV. Mais je n'ai pas obtenu de bons résultats. J'ai mis le téléphone en position debout (c'est l'axe Y vers le haut) et déplacé en haut et en bas. Lin. acc. la sonde doit indiquer le mouvement dans l'axe Y, tandis que le vecteur transformé en Z de l'axe. Mais j'en ai trouvé vecteur V et vector A. Alors..?