Obtenez de quaternions sur Android gyroscope?
L'officiel du développement de la documentation suggère la manière suivante, d'obtenir le quaternion de la 3D, la vitesse de rotation du vecteur (wx, wy, wz)
.
//Create a constant to convert nanoseconds to seconds.
private static final float NS2S = 1.0f / 1000000000.0f;
private final float[] deltaRotationVector = new float[4]();
private float timestamp;
public void onSensorChanged(SensorEvent event) {
//This timestep's delta rotation to be multiplied by the current rotation
//after computing it from the gyro sample data.
if (timestamp != 0) {
final float dT = (event.timestamp - timestamp) * NS2S;
//Axis of the rotation sample, not normalized yet.
float axisX = event.values[0];
float axisY = event.values[1];
float axisZ = event.values[2];
//Calculate the angular speed of the sample
float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);
//Normalize the rotation vector if it's big enough to get the axis
//(that is, EPSILON should represent your maximum allowable margin of error)
if (omegaMagnitude > EPSILON) {
axisX /= omegaMagnitude;
axisY /= omegaMagnitude;
axisZ /= omegaMagnitude;
}
//Integrate around this axis with the angular speed by the timestep
//in order to get a delta rotation from this sample over the timestep
//We will convert this axis-angle representation of the delta rotation
//into a quaternion before turning it into the rotation matrix.
float thetaOverTwo = omegaMagnitude * dT / 2.0f;
float sinThetaOverTwo = sin(thetaOverTwo);
float cosThetaOverTwo = cos(thetaOverTwo);
deltaRotationVector[0] = sinThetaOverTwo * axisX;
deltaRotationVector[1] = sinThetaOverTwo * axisY;
deltaRotationVector[2] = sinThetaOverTwo * axisZ;
deltaRotationVector[3] = cosThetaOverTwo;
}
timestamp = event.timestamp;
float[] deltaRotationMatrix = new float[9];
SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
//User code should concatenate the delta rotation we computed with the current rotation
//in order to get the updated rotation.
//rotationCurrent = rotationCurrent * deltaRotationMatrix;
}
}
Ma question est:
Il est tout à fait différente de l'accélération cas, où le calcul de l'accélération résultante, en utilisant les accélérations le LONG de les 3 axes du sens.
Je suis vraiment confus pourquoi la résultante de la vitesse de rotation peut aussi être calculée avec la sous-rotation taux de AUTOUR de les 3 axes. Il ne fait pas de sens pour moi.
Pourquoi cette méthode - trouver le composite la vitesse de rotation de son ampleur, le même travail?
OriginalL'auteur Sibbs Gambling | 2013-09-03
Vous devez vous connecter pour publier un commentaire.
Depuis votre titre n'est pas vraiment correspondre à vos questions, je vais essayer de répondre autant que je le peux.
Gyroscopes ne pas donner une orientation absolue (comme le ROTATION_VECTOR) mais seulement vitesses de rotation autour de ces axes, elles sont construites à "tourner" autour de. Cela est dû à la conception et à la construction d'un gyroscope. Imaginez la construction ci-dessous. Le golden chose est en rotation et en raison de la les lois de la physique il ne veut pas changer sa rotation. Maintenant, vous pouvez faire pivoter l'image et de mesure de ces rotations.
Maintenant, si vous voulez obtenir quelque chose comme la "rotation en cours de l'état", à partir du Gyroscope, vous devez commencer avec une rotation initiale, l'appeler
q0
et constamment apporter de ceux minuscule de rotation des différences que le gyroscope est de mesure autour de l'axe:q1 = q0 + gyro0
,q2 = q1 + gyro1
, ...En d'autres termes: Le Gyroscope vous donne la différence qu'il a tourné autour de trois construits axe, de sorte que vous ne composez pas des valeurs absolues, mais de petits deltas.
Maintenant, c'est très général et laisse quelques questions en suspens:
En fonction de la représentation d'une rotation: Si vous utilisez une matrice de rotation, une simple multiplication de matrice devrait faire le travail, comme suggéré dans les commentaires (à noter que cette matrice de la multiplication à la mise en œuvre n'est pas efficace!):
Pour utiliser cette méthode, imaginer que
mRotationMatrix
détient l'état actuel, ces deux lignes:Si vous avez choisi d'utiliser les Quaternions, imaginez encore que
mQuaternion
contient l'état actuel:La multiplication des quaternions est décrit ici, l'équation (23). Assurez-vous que vous appliquez la multiplication correctement, car il n'est pas commutative!
Si vous voulez simplement savoir de la rotation de votre appareil (je suppose que c'est ce que vous voulez finalement), je recommande fortement l'ROTATION_VECTOR-Capteur. D'autre part les Gyroscopes sont assez précis pour la mesure de la vitesse de rotation et ont une très bonne réponse à la dynamique, mais souffrent de la dérive et de ne pas vous donner une orientation absolue (au nord magnétique ou selon la gravité).
Mise à JOUR: Si vous voulez voir un exemple complet, vous pouvez télécharger le code source pour un simple démo de l'application de https://bitbucket.org/apacha/sensor-fusion-demo.
L'image d'un cardan gyro est trompeuse parce que le gyroscope ne mesure l'orientation. Si vous faites pivoter le long d'un axe de cardan à une vitesse constante, correspondant à cardan axe de rotation à la même vitesse. Si vous lisez les angles de cardan, ceux-ci vont être littéralement angles d'Euler, sous réserve de la singularité qui est parfois appelé "gimbal lock" justement à cause de cette image. Les gyroscopes MEMS dans votre téléphone ne regardez pas comme ça, et ils ne sont en effet de mesurer la vitesse angulaire.
Comment effectuer la multiplication des quaternions dans android?
Un lien pour l'équation est donnée. Vous pouvez également consulter ma mise en œuvre dans le bitbucket.org/apacha/sensor-fusion-demo/src/...
OriginalL'auteur Alexander Pacha
Fait sens pour moi. Capteurs d'accélération, travaillent en général en ayant une quantité mesurable de changement lorsqu'une force est appliquée à l'axe mesuré. E. g. si la gravité est le tirant vers le bas sur le capteur de mesure de cet axe, il conduit l'électricité mieux. Alors maintenant, vous pouvez dire comment dur la gravité ou de l'accélération dans une certaine direction, est de tirer. Facile.
Pendant ce temps les gyros sont des choses que le spin (OK, ou rebondir et-vient dans une ligne droite comme un tordu conseil de plongée). Le gyroscope tourne, maintenant vous spin, le gyro va ressembler à ça tourne plus vite ou plus lentement selon la direction que vous filé. Ou si vous essayez de le déplacer, il résiste et essayer de continuer la façon dont il va. Donc, vous obtenez juste une modification de rotation de la mesure. Ensuite, vous devez trouver la force de le changer par l'intégration de tous les changements par rapport à la quantité de temps.
Généralement aucune de ces choses sont d'un seul capteur. Ils sont souvent de 3 différents capteurs disposés perpendiculairement les uns aux autres, et la mesure d'un autre axe. Parfois, tous les capteurs sont sur la même puce, mais ils sont encore des choses différentes sur la puce mesurée séparément.
Le problème, c'est que votre question est: pourquoi les gyros ne pas agir comme linéaire de capteurs de force. La réponse est qu'ils ne sont pas la même chose. Gyro spin (ou de vibrer avec force horizontale loin de la vibration mesurée comme un hack). C'est pourquoi tous les gyro mesures sont basées sur la rotation et non linéaire de la force le long d'un axe. La totalité du commentaire est d'essayer de vous expliquer ce que chaque chose est et comment ils sont différents. Pourquoi pensez-vous que vous pourriez mesurer autre chose que de la rotation hors d'un gyroscope?
OriginalL'auteur Lance Nanek