Question

J'ai essayé d'obtenir ma tête autour des capteurs d'orientation Android pour un certain temps. Je pensais que je l'ai compris. Puis je me suis aperçu que je ne l'ai pas. Maintenant, je pense que (l'espoir) J'ai un meilleur sentiment de nouveau, mais je ne suis pas encore à 100%. Je vais essayer de vous expliquer ma compréhension parcellaire de celui-ci et, espérons les gens vont être en mesure de me corriger si je me trompe dans les parties ou remplir des espaces vides.

J'imagine que je suis debout à 0 degrés de longitude (premier méridien) et 0 degrés de latitude (équateur). Cette situation est en fait dans la mer au large des côtes de l'Afrique, mais porte avec moi. Je tiens mon téléphone en face de mon visage pour que le fond des points de téléphone à mes pieds; J'Orientée vers le nord (en regardant vers Greenwich) ainsi donc le côté droit des points de téléphone est vers l'Afrique. Dans cette orientation (en référence au schéma ci-dessous) Je l'axe des X pointant vers l'Est, l'axe Z pointe sud et la pointe de l'axe Y vers le ciel.

Maintenant, les capteurs du téléphone vous permettent de travailler sur l'orientation (non lieu) du dispositif dans cette situation. Cette partie m'a toujours confus, probablement parce que je voulais comprendre comment quelque chose a travaillé avant qu'il n'accepté que le travail. Il semble que le téléphone fonctionne son orientation à l'aide d'une combinaison de deux techniques différentes.

Avant d'en arriver là, imaginez être debout en arrière sur ce morceau imaginaire de terrain à 0 degrés de latitude et la longitude debout dans la direction mentionnée ci-dessus. Imaginez que vous êtes les yeux bandés et vos chaussures sont fixés à un rond-point de jeux. Si quelqu'un vous bouscule dans le dos vous tomber en avant (vers le Nord) et mettre les deux mains pour briser votre chute. De même, si l'épaule bouscule quelqu'un vous laissé vous tomber sur votre main droite. Votre oreille interne a « capteurs de gravité » (youtube) Clip qui vous permettent de détecter si vous êtes en train de tomber vers l'avant / arrière, ou chute gauche / droite ou tomber (ou vers le haut !!). Par conséquent, les humains peuvent détecter l'alignement et la rotation autour du même axes X et Z comme le téléphone.

Maintenant, imaginez que quelqu'un vous tourne maintenant à 90 degrés sur le rond-point de sorte que vous êtes maintenant face à l'Est. Vous êtes mis en rotation autour de l'axe Y. Cet axe est différent parce que nous ne pouvons pas détecter biologiquement. Nous savons que nous sommes en biais d'un certain montant, mais nous ne savons pas la direction par rapport à pôle nord magnétique de la planète. Au lieu de cela nous avons besoin d'utiliser un outil externe ... un compas magnétique. Cela nous permet de déterminer dans quelle direction nous sommes confrontés. La même chose est vraie avec notre téléphone.

Maintenant, le téléphone dispose également d'un accéléromètre à 3 axes. Je NON idée comment ils fonctionnent réellement, mais la façon dont je le visualiser est d'imaginer la gravité comme constante et uniforme « pluie » qui tombe du ciel et d'imaginer les axes dans la figure ci-dessus comme des tubes qui peuvent détecter la quantité de pluie qui coule à travers. Lorsque le téléphone tient debout toute la pluie circulera à travers le « tube » Y. Si le téléphone est tourné progressivement de sorte que son écran fait face au ciel la quantité de pluie qui coule à travers Y diminuera à zéro alors que le volume à Z augmente de façon constante jusqu'à ce que le montant maximum de la pluie coule à travers. De même, si nous levons maintenant le téléphone sur le côté du tube X finira par percevoir le montant maximum de la pluie. Par conséquent, en fonction de l'orientation du téléphone en mesurant la quantité de pluie qui coule à travers les 3 tubes, vous pouvez calculer l'orientation.

Le téléphone dispose également d'une boussole électronique qui se comporte comme une boussole normale - ses points « aiguille virtuelle » au nord magnétique. Applications fusionne les informations provenant de ces deux capteurs de sorte que chaque fois qu'un SensorEvent de TYPE_ORIENTATION est généré le réseau de values[3] a
Les valeurs [0]: azimutal - (l'est de palier de compas de non magnétiqueRTH)
Les valeurs [1]: Pitch, rotation autour de l'axe x (le téléphone est penché en avant ou en arrière)
Les valeurs [2]: Roll, rotation autour de l'axe y (le téléphone est penché sur son côté droit ou gauche)

Je pense (à savoir que je ne sais pas) la raison pour Android donne l'azimut (cap compas) plutôt que la lecture du troisième accéléromètre est que le roulement de la boussole est juste plus utile. Je ne sais pas pourquoi ils déconseillés ce type de capteur comme il semble maintenant que vous devez enregistrer un écouteur avec le système pour SensorEvents de type TYPE_MAGNETIC_FIELD. Les besoins de l'événement du tableau de value[] à bepassed en méthode SensorManger.getRotationMatrix(..) pour obtenir une matrice de rotation (voir ci-dessous) qui est ensuite passé dans la méthode SensorManager.getOrientation(..). Est-ce que quelqu'un sait pourquoi l'équipe Android dépréciée Sensor.TYPE_ORIENTATION? Est-ce une chose d'efficacité? C'est ce qui est impliqué dans l'un des commentaires à un question mais vous avez encore besoin d'enregistrer un autre type d'auditeur dans la section développement / samples / Compass / src / com / example / android / boussole / CompassActivity.java exemple.

Je vais maintenant parler de la matrice de rotation. (C'est là où je suis le plus incertain) Donc, ci-dessus, nous avons les trois chiffres de la documentation Android, nous allons les appeler A, B et C.

A = SensorManger.getRotationMatrix (..) La figure de la méthode et représente le système de coordonnées du monde

B = Système de coordonnées utilisé par l'API SensorEvent.

C = chiffre de méthode SensorManager.getOrientation (..)

Alors je crois comprendre que A représente le « système de coordonnées de monde » que je suppose fait référence aux emplacements de chemin sur la planète sont donnés à titre (latitude, longitude) couple avec une option (altitude). X est le "abscisse" de coordonnées, Y est le "ordonnée" coordonner. Z pointe vers le ciel et représente l'altitude.

Le téléphone système de coordonnées est représenté sur la figure B est fixe. Son axe Y indique toujours le haut. La matrice de rotation est constamment calculée par le téléphone et permet le mappage entre les deux. Alors, suis-je raison de penser que la matrice de rotation transforme le système de coordonnées de B à C? Ainsi, lorsque vous appelez la méthode SensorManager.getOrientation(..) vous utilisez le tableau de values[] avec des valeurs qui correspondent à la figure C. Lorsque le téléphone est pointé vers le ciel la matrice de rotation est la matrice d'identité (la matrice d'équivalent mathématique de 1) ce qui signifie aucun mappage est nécessaire que le dispositif est aligné avec le système de coordonnées du monde.

Ok. Je pense que je ferais mieux d'arrêter maintenant. Comme je l'ai dit avant que j'espère que les gens vont me dire où je l'ai foiré ou aidé les gens (ou les gens confus encore plus loin!)

Était-ce utile?

La solution

Vous pouvez consulter le One écran Un autre article Turn Deserves. Il explique pourquoi vous avez besoin de la matrice de rotation.

En un mot, les capteurs du téléphone utilisent toujours le même système de coordonnées, même lorsque l'appareil est mis en rotation.

Dans les applications qui ne sont pas verrouillées à une seule orientation, coordonnées de l'écran des modifications du système lorsque vous faites pivoter l'appareil. Ainsi, lorsque le dispositif est mis en rotation de son mode d'affichage par défaut, coordonner le capteur du système est plus le même que l'écran du système de coordonnées. La matrice de rotation dans ce cas est utilisé pour transformer A à C (B reste toujours fixe).

Voici un extrait de code pour vous montrer comment il peut être utilisé.

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// Register this class as a listener for the accelerometer sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
// ...and the orientation sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                    SensorManager.SENSOR_DELAY_NORMAL);

//...
// The following code inside a class implementing a SensorEventListener
// ...

float[] inR = new float[16];
float[] I = new float[16];
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] orientVals = new float[3];

double azimuth = 0;
double pitch = 0;
double roll = 0;

public void onSensorChanged(SensorEvent sensorEvent) {
    // If the sensor data is unreliable return
    if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        return;

    // Gets the value of the sensor that has been changed
    switch (sensorEvent.sensor.getType()) {  
        case Sensor.TYPE_ACCELEROMETER:
            gravity = sensorEvent.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomag = sensorEvent.values.clone();
            break;
    }

    // If gravity and geomag have values then find rotation matrix
    if (gravity != null && geomag != null) {

        // checks that the rotation matrix is found
        boolean success = SensorManager.getRotationMatrix(inR, I,
                                                          gravity, geomag);
        if (success) {
            SensorManager.getOrientation(inR, orientVals);
            azimuth = Math.toDegrees(orientVals[0]);
            pitch = Math.toDegrees(orientVals[1]);
            roll = Math.toDegrees(orientVals[2]);
        }
    }
}

Autres conseils

Roll est une fonction de la gravité, un ensemble de gravité met en rouleau de 90 degrés dans le registre x.

Emplacement est le même, un pas de 90 degrés vers le haut met la totalité du composant de gravité dans le registre y.

Yaw / cap / azimut n'a pas d'effet sur la gravité, il est toujours à angle droit par rapport à la gravité, par conséquent, peu importe la façon dont vous êtes face à la gravité sera imeasurable.

Ceci est la raison pour laquelle vous avez besoin d'une boussole pour évaluer, peut-être qui fait sens?

Jetez un oeil à ceci: Stackoverflow.com: Q.5202147

Vous semblez être le plus souvent droite jusqu'à ce que les 3 schémas A, B, C. Après que vous avez vous-même confus.

J'avais cette question donc je cartographié ce qui se passe dans des directions différentes. Si le dispositif est monté dans la mode paysage, par exemple dans une voiture monter les « degrés » de la boussole semblent courir 0-275 (dans le sens horaire va) au-dessus 269 (entre l'ouest et au nord), il compte à rebours de -90 à 0, puis vers l'avant de 0 à 269. 270 devient -90

Toujours Dans le paysage, mais avec l'appareil couché sur le dos de mon capteur donne 0-360. et en mode portrait, il court à la fois 0-360 couché sur le dos et debout en mode portrait.

L'espoir qui aide quelqu'un

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top