Accelerometer daten umwandeln

Bitte aktiviere JavaScript!
Hallo bräuchte mal eure Hilfe.
Ich bin Anfänger und versuche momentan, mit hilfe vom Accelerometer einen Winkelmesser zu erstellen. Nun meine Frage, wie kann ich die Werte vom Accelerometer, in Grad umwandeln?

Kann mir da einer Helfen bitte.

Danke im vorraus. :)
 
A

Anzeige




Vielleicht hilft dir unser Java-Tutorial hier weiter —> (hier klicken)
Java:
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.
      }
   }
}
Quelle: https://stackoverflow.com/questions/39190283/accelerometer-values-to-degrees
 
der wert am Handy geht trotzdem nur von 0 bis 10, wenn ich das Handy um 45grad drehe :/

hier mal mein Code:
Java:
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]);

                }
            }
        }

    };
}
 
habs jetzt so hinbekommen:

mal ne andere Frage. wenn ich das Smartphone senkrecht nach oben halte, bekomme ich den Wert 0 , wenn ich jetzt links oder rechts gehe geht der Wert nach oben, alles normal soweit.
Wie bekomme ich es hin das wenn das Smartphone senkrecht nach oben steht, der Wert bei 90 beginnt und nach runter geht.


Java:
  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));

            }

        }
    };
}
 
Zuletzt bearbeitet:
Also ich hatte vor einiger Zeit mal was mit LibGDX gemacht. Da war da so, dass Ich 0 hatte, wenn das Handy senkrecht steht, und der Wert beim Linkskippen negativ, und beim Rechtskippen positiv wird. Es gibt da auch 3 Drehachsen schau doch mal in der Dokumentation nach.
 
genau so ist es bei mir auch. Würde aber gerne das es bei 90 startet und dann beim links oder rechts kippen negativ wird bis 90grad, und das dieses negativ zeichen verschwindet.
 
Äh, damit ich das richtig verstehe: Du bekommst Werte zwischen -90 und +90 und möchtest aber Werte zwischen 90 und 0 bekommen? 90 - Math.abs(degrees)?
 
Hab das jetzt mal getestet.

getOrientation liefert Winkel im Bogenmaß. Gem. Doku wäre pitch z. B. der Winkel zwischen "Displayebene" und "Bodenebene" im Bereich von -PI bis +PI. Das ist auch in meinem Test so, allerdings mit einem Wertebereich zwischen -PI/2 und +PI/2, liegt vermutlich an der ermittelten Rotationsmatrix.

Legt man das Gerät flach hin, so dass man das Display sieht, ist der Winkel 0. Senkt man nun die Oberseite des Geräts nach unten ab (bzw. hebt man die Unterseite an), steigt der Winkel an. Verhält sich also genau, wie in der Doku beschrieben.
 
habs jetzt so hinbekommen:

Java:
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) + "°");
                }

            }


        }
    };
}
 
A

Anzeige




Hier lernst du alle wichtigen Java-Grundlagen.
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben