Didacticiel getRotationMatrix et getOrientation
J'ai été aux prises avec l'obtention de la véritable orientation de mon appareil à l'aide de getOrientation. L'obtention de l'accéléromètre et du champ magnétique, les lectures par TYPE_ACCELEROMETER et TYPE_MAGNETIC_FIELD est simple qu'est l'obtention de l'orientation via TYPE_ORIENTATION. Mais l'obtention de l'orientation selon le monde coordonner au système à l'aide de getOrientation. Il y a un certain nombre de bons tutoriels là ici et ici mais je n'ai pas encore de mettre tout cela ensemble. À cette fin, j'ai été le développement d'une application que tout simplement cracher de l'Accéléromètre, du Champ Magnétique, raw Orientation de données, et l'Orientation de données à partir de getOrientation. J'ai joint le code, mais il échoue constamment sur mon téléphone. Des suggestions?
package com.sensorall;
import com.sensorall.R;
import android.hardware.*;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class OrientationAccelerometer extends Activity {
SensorManager sensorManager;
float[] mGravs = new float[3];
float[] mGeoMags = new float[3];
float[] mRotationM = new float[16];
float[] mInclinationM = new float[16];
float[] mOrientation = new float[3];
float[] mOldOreintation = new float[3];
String[] mAccelerometer = new String[3];
String[] mMagnetic = new String[3];
String[] mRotation = new String[16];
String[] mInclination = new String[16];
String[] mOrientationString = new String[3];
String[] mOldOreintationString = new String[3];
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.orientationaccelerometer);
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
} /* End onCreate activity */
private SensorEventListener sensorEventListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
/* Get the Sensors */
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
System.arraycopy(event.values, 0, mGravs, 0, 3);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
System.arraycopy(event.values, 0, mGeoMags, 0, 3);
break;
case Sensor.TYPE_ORIENTATION:
System.arraycopy(event.values, 0, mOldOreintation, 0, 3);
break;
default:
return;
}
//If mGravs and mGeoMags have values then find rotation matrix
if (mGravs != null && mGeoMags != null) {
//checks that the rotation matrix is found
boolean success = SensorManager.getRotationMatrix(mRotationM, mInclinationM, mGravs, mGeoMags);
if (success) {
/* getOrientation Values */
SensorManager.getOrientation(mRotationM, mOrientation);
for(int i=0; i<2; i++){
mAccelerometer[i] = Float.toString(mGravs[i]);
mMagnetic[i] = Float.toString(mGeoMags[i]);
mOrientationString[i] = Float.toString(mOrientation[i]);
mOldOreintationString[i] = Float.toString(mOldOreintation[i]);
}
/* Make everything text to show on device */
TextView xaxisAccelerometerText = (TextView)findViewById(R.id.xaxisAccelerometer);
xaxisAccelerometerText.setText(mAccelerometer[0]);
TextView yaxisAccelerometerText = (TextView)findViewById(R.id.yaxisAccelerometer);
yaxisAccelerometerText.setText(mAccelerometer[1]);
TextView zaxisAccelerometerText = (TextView)findViewById(R.id.zaxisAccelerometer);
zaxisAccelerometerText.setText(mAccelerometer[2]);
TextView xaxisMagneticText = (TextView)findViewById(R.id.xaxisMagnetic);
xaxisMagneticText.setText(mMagnetic[0]);
TextView yaxisMagneticText = (TextView)findViewById(R.id.yaxisMagnetic);
yaxisMagneticText.setText(mMagnetic[1]);
TextView zaxisMagneticText = (TextView)findViewById(R.id.zaxisMagnetic);
zaxisMagneticText.setText(mMagnetic[2]);
TextView xaxisOrientationText = (TextView)findViewById(R.id.xaxisOrientation);
xaxisOrientationText.setText(mOrientationString[0]);
TextView yaxisOrientationText = (TextView)findViewById(R.id.yaxisOrientation);
yaxisOrientationText.setText(mOrientationString[1]);
TextView zaxisOrientationText = (TextView)findViewById(R.id.zaxisOrientation);
zaxisOrientationText.setText(mOrientationString[2]);
TextView xaxisOldOrientationText = (TextView)findViewById(R.id.xaxisOldOrientation);
xaxisOldOrientationText.setText(mOldOreintationString[0]);
TextView yaxisOldOrientationText = (TextView)findViewById(R.id.yaxisOldOrientation);
yaxisOldOrientationText.setText(mOldOreintationString[1]);
TextView zaxisOldOrientationText = (TextView)findViewById(R.id.zaxisOldOrientation);
zaxisOldOrientationText.setText(mOldOreintationString[2]);
}else{
/* Make everything text to show on device even if getRotationMatrix fails*/
String matrixFailed = "Rotation Matrix Failed";
TextView xaxisAccelerometerText = (TextView)findViewById(R.id.xaxisAccelerometer);
xaxisAccelerometerText.setText(mAccelerometer[0]);
TextView yaxisAccelerometerText = (TextView)findViewById(R.id.yaxisAccelerometer);
yaxisAccelerometerText.setText(mAccelerometer[1]);
TextView zaxisAccelerometerText = (TextView)findViewById(R.id.zaxisAccelerometer);
zaxisAccelerometerText.setText(mAccelerometer[2]);
TextView xaxisMagneticText = (TextView)findViewById(R.id.xaxisMagnetic);
xaxisMagneticText.setText(mMagnetic[0]);
TextView yaxisMagneticText = (TextView)findViewById(R.id.yaxisMagnetic);
yaxisMagneticText.setText(mMagnetic[1]);
TextView zaxisMagneticText = (TextView)findViewById(R.id.zaxisMagnetic);
zaxisMagneticText.setText(mMagnetic[2]);
TextView xaxisOrientationText = (TextView)findViewById(R.id.xaxisOrientation);
xaxisOrientationText.setText(matrixFailed);
TextView yaxisOrientationText = (TextView)findViewById(R.id.yaxisOrientation);
yaxisOrientationText.setText(matrixFailed);
TextView zaxisOrientationText = (TextView)findViewById(R.id.zaxisOrientation);
zaxisOrientationText.setText(matrixFailed);
TextView xaxisOldOrientationText = (TextView)findViewById(R.id.xaxisOldOrientation);
xaxisOldOrientationText.setText(mOldOreintationString[0]);
TextView yaxisOldOrientationText = (TextView)findViewById(R.id.yaxisOldOrientation);
yaxisOldOrientationText.setText(mOldOreintationString[1]);
TextView zaxisOldOrientationText = (TextView)findViewById(R.id.zaxisOldOrientation);
zaxisOldOrientationText.setText(mOldOreintationString[2]);
}
}
}
};
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(sensorEventListener);
}
}
source d'informationauteur John Kossik | 2011-08-12
Vous devez vous connecter pour publier un commentaire.
La suite travaillé avec moi:
Utilisation null pour je
Oui 4 pas 3. Cependant, vous utilisez uniquement 3.
Ce code a fonctionné pour moi.
C'est probablement ce qui ne s'applique pas à votre code, mais en termes de l'utilisation de getRotationMatrix() en général, il est susceptible de résoudre d'autres problèmes.
Je ne suis pas sûr si c'était un problème de gestion des versions de mon côté, mais j'ai vérifié le code source de la
getRotationMatrix()
méthode et, contrairement à ce que dit la documentation sur leR[]
etI[]
paramètres, ils NE peut pas être null. Après avoir déclaré monR
etI
comme ceci:float[] r = new float[9];
float[] i = new float[9];
La méthode fonctionne correctement.
SensorManager.getRotationMatrix(r,i,gravity,geomagnetic)
-->true
...étrange erreur de documentation.
En réponse à votre application nécessitant une force de fermeture, il me semble que vous êtes en train de faire trop sur le thread de l'INTERFACE utilisateur, trop souvent. Vous êtes de la réception de données à partir de 3 différents capteurs avec un retard de
SENSOR_DELAY_NORMAL
. Alors que cela devrait être autour de 5 lectures/sec, je l'ai vu peut être plus de 20 lectures par seconde (puisque le capteur délai n'est qu'une suggestion de retard). Si vous POURRIEZ être la réception de plus de 60 lectures par seconde pour tous les 3 capteurs. pour chaque lecture, vous êtes à la mise à jour de 12TextView
's, de sorte que vous pourriez faire plus de 720 UI mises à jour par seconde. Ce la cause de mon téléphone à un accident en tant que bien. Essayez de vous fixer un minimum de temps entre les mises à jour de l'INTERFACE utilisateur:Vous pouvez stocker les données sur le rapide des intervalles pour l'utiliser si vous en avez besoin, mais de ralentir l'INTERFACE utilisateur des mises à jour.
La réception des événements à ne pas suivre un programme linéaire des flux d'exécution.
Afin d'éviter des problèmes, c'est une bonne recommandation de placer le code lié à la réception de capteur événements dans une exclusion mutuelle bloc.
Je veux dire:
Espère que cette aide.