public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
gravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
geomagnetic = event.values;
if (mGravity != null && geomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, gravity, geomagnetic);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
myAzimut = orientation[0]; // myAzimut is The geomagnetic inclination angle in radians.
}
}
}
Was genau?aber funktioniert bei mir nicht
public class WinkelmessActivity extends AppCompatActivity {
private SensorManager sensorManager;
// Gravity rotational data
private float gravity[];
// Magnetic rotational data
private float magnetic[]; //for magnetic rotational data
private float accels[] = new float[3];
private float mags[] = new float[3];
private float[] values = new float[3];
// azimuth, pitch and roll
private float azimuth;
private float pitch;
private float roll;
TextView xValue, zValue, yValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_winkelmess);
SensorManager sManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sManager.registerListener(mySensorEventListener, sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
sManager.registerListener(mySensorEventListener, sManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_NORMAL);
xValue = (TextView) findViewById(R.id.xValue);
zValue = (TextView) findViewById(R.id.zValue);
yValue = (TextView) findViewById(R.id.yValue);
}
private SensorEventListener mySensorEventListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
accels = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mags = event.values;
if (mags != null && accels != null) {
gravity = new float[9];
magnetic = new float[9];
boolean success = SensorManager.getRotationMatrix(gravity, magnetic, accels, mags);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(gravity, orientation);
azimuth = orientation[0]; // myAzimut is The geomagnetic inclination angle in radians.
azimuth = orientation[0];
Math.toDegrees(azimuth);
xValue.setText("X: " + event.values[0]);
}
}
}
};
}
Ich habe keine Ahnung aber vielleicht geht das ja:der wert am Handy geht trotzdem nur von 0 bis 10, wenn ich das Handy um 45grad drehe
Vielleicht solltest Du nichtder wert am Handy geht trotzdem nur von 0 bis 10, wenn ich das Handy um 45grad drehe :/
event.values[0]
sondern azimuth
ausgeben und vielleicht solltest Du auch den Rückgabewert von Math.toDegrees
verwenden... private SensorEventListener mySensorEventListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_MAGNETIC_FIELD:
mags = event.values.clone();
break;
case Sensor.TYPE_ACCELEROMETER:
accels = event.values.clone();
break;
}
if (mags != null && accels != null) {
gravity = new float[9];
magnetic = new float[9];
SensorManager.getRotationMatrix(gravity, magnetic, accels, mags);
float[] outGravity = new float[9];
SensorManager.remapCoordinateSystem(gravity, SensorManager.AXIS_X, SensorManager.AXIS_Z, outGravity);
SensorManager.getOrientation(outGravity, values);
azimuth = values[0] ;
pitch = values[1] ;
roll = values[2] ;
mags = null;
accels = null;
xValue.setText("X: " + Math.toDegrees(azimuth));
yValue.setText("Y: " + Math.toDegrees(pitch));
zValue.setText("Z: " + Math.toDegrees(roll));
}
}
};
}
Soweit ich weiß müssten Werte zwischen -10 und 10 zurück kommen.Du bekommst Werte zwischen -90 und +90
Der Beschleunigungssensor gibt Werte von -10 bis 10 zurückwarum sollten bei einem Winkel Werte zwischen -10 und 10 rauskommen?
Math.toDegrees gibt einen Winkel zurück.Der Beschleunigungssensor gibt Werte von -10 bis 10 zurück
Dann dürfte ja alles funktionieren …?Math.toDegrees gibt einen Winkel zurück.
if (mags != null && accels != null) {
gravity = new float[9];
magnetic = new float[9];
SensorManager.getRotationMatrix(gravity, magnetic, accels, mags);
float[] outGravity = new float[9];
SensorManager.remapCoordinateSystem(gravity, SensorManager.AXIS_X, SensorManager.AXIS_Z, outGravity);
SensorManager.getOrientation(outGravity, values);
roll = values[2] ;
mags = null;
accels = null;
double degree = Math.toDegrees(roll);
if (degree < 0) {
degree *= -1;
zValue.setText(Math.round(degree) + "°");
}
else {
zValue.setText(Math.round(degree) + "°");
}
}
}
};
}
dankedouble degree = Math.abs(Math.toDegrees(roll));
nicht gedreht => degrees = 0°; 90 - degrees = 90 °
um 45 grad (nach links oder rechts) gedreht: degrees = 45 °; 90 - degrees = 45 °
um 90 grad gedreht: degrees = 90 °; 90 - degrees = 0°
Wenn Du Werte größer 90° nicht zulassen willst, dann
90 - Math.min(90, degrees)
Bei mir schauen die Accelerometerwerte so aus, wenn das Schmierphone auf dem Tisch liegt :
Anhang anzeigen 11371
Bin mir nicht ganz sicher aber 9,8 müsste die g-Kraft nahe der Erdoberfläche/NN sein,
X und Y dürften 0 sein - und der Z-Rotation Vector Sensor-Wert dürfte ebenfalls 0 sein, wenn mein Tisch gerade wäre?
Alle anderen dürften stimmen.
Das haben doch viele Handys.Hast da aber viele Sonsoren
Ja, und?genau so habe ich es gemeint mihe7. Wenn ich das jetzt aber verwende, und das Handy nach links drehe geht der Wert von 90 auf 0 dann 1 , 2 , 4 usw bis 90
Evtl. bin ich heut zu doof, aber ich kann da gar nichts rauslesen.hoffe konnte es etwas besser darstellen
Die Beschleunigung.Misst ein Accelerometer Geschwindigkeitsarbeit, Beschleunigung, Lage oder potentielle bzw kinetische Energie??
Das hat Dir der Mephisto gesagt (Sorry)Die Beschleunigung.
Wer sonst?Das hat Dir der Mephisto gesagt
Warum nicht?Aber dann macht es doch keinen Sinn diese in Grad umrechnen zu wollen...
Ich noch keinen ausgebaut aber beschrieben ist, dass Beschleunigungskräfte gemessen werden. Wikipedia beschreibt, dass es sich wohl um MEMS-Sensoren handelt, die über "Federn" die Beschleunigung messen. Wenn man sich das durchliest: irre, das Zeug.Ist das wirklich kein Lagesensor?
Evtl. bin ich heut zu doof, aber ich kann da gar nichts rauslesen.
Bitte folgende Infos:
Handy in 3 Uhr Lage: ausgegeben wird Winkel x, ich möchte Winkel y
Handy in 1:30 Uhr Lage: ausgegeben wird Winkel x, ich möchte Winkel y
Handy in 0 Uhr Lage: ausgegeben wird Winkel x, ich möchte Winkel y
Handy in 10:30 Uhr Lage: ...
Handy in 9 Uhr Lage: ...
Handy in 7:30 Uhr Uhr Lage: ...
..
Die Seite des Handys, die man am Ohr hat, zeigt auf der Uhr dabei nach außen. Die Ausgabe, bitte ohne weitere Umrechnungen angeben.
roll = values[2];
mags = null;
accels = null;
double degree = Math.toDegrees(roll);
double mapped = 90 - Math.min(90, degree);
double newvalue = mapped - 180;
zValue.setText(Math.round(mapped) + "°");
if (mapped > 90){
newvalue *= -1;
zValue.setText(Math.round(newvalue) + "°");