# Accelerometer daten umwandeln



## brilzi89 (12. Nov 2018)

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.


----------



## Lucaaa (13. Nov 2018)

```
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


----------



## brilzi89 (14. Nov 2018)

danke Lucaaa hab das auch gefunden, aber funktioniert bei mir nicht :/


----------



## Lucaaa (14. Nov 2018)

brilzi89 hat gesagt.:


> aber funktioniert bei mir nicht


Was genau?


----------



## brilzi89 (21. Nov 2018)

der wert am Handy geht trotzdem nur von 0 bis 10, wenn ich das Handy um 45grad drehe :/

hier mal mein Code:

```
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]);

                }
            }
        }

    };
}
```


----------



## Lucaaa (21. Nov 2018)

brilzi89 hat gesagt.:


> der wert am Handy geht trotzdem nur von 0 bis 10, wenn ich das Handy um 45grad drehe


Ich habe keine Ahnung aber vielleicht geht das ja:
45° = 10 ?
Was wenn:
10 *9/2 
Dann kommt da 45 raus.
Ich kenne mich damit nicht aus was da für werte zurück kommen


----------



## mihe7 (21. Nov 2018)

brilzi89 hat gesagt.:


> der wert am Handy geht trotzdem nur von 0 bis 10, wenn ich das Handy um 45grad drehe :/


Vielleicht solltest Du nicht `event.values[0]` sondern `azimuth` ausgeben und vielleicht solltest Du auch den Rückgabewert von `Math.toDegrees` verwenden...


----------



## brilzi89 (22. Nov 2018)

meinst du das so mihe7?


```
xValue.setText("X: " + Math.toDegrees(azimuth));
```


----------



## brilzi89 (22. Nov 2018)

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.



```
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));

            }

        }
    };
}
```


----------



## Lucaaa (22. Nov 2018)

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.


----------



## brilzi89 (22. Nov 2018)

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.


----------



## mihe7 (22. Nov 2018)

Ä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)?


----------



## Lucaaa (23. Nov 2018)

mihe7 hat gesagt.:


> Du bekommst Werte zwischen -90 und +90


Soweit ich weiß müssten Werte zwischen -10 und 10 zurück kommen.


----------



## mihe7 (24. Nov 2018)

@Lucaaa warum sollten bei einem Winkel Werte zwischen -10 und 10 rauskommen?


----------



## Lucaaa (24. Nov 2018)

mihe7 hat gesagt.:


> warum sollten bei einem Winkel Werte zwischen -10 und 10 rauskommen?


Der Beschleunigungssensor gibt Werte von -10 bis 10 zurück


----------



## mihe7 (24. Nov 2018)

Lucaaa hat gesagt.:


> Der Beschleunigungssensor gibt Werte von -10 bis 10 zurück


Math.toDegrees gibt einen Winkel zurück.


----------



## Lucaaa (24. Nov 2018)

mihe7 hat gesagt.:


> Math.toDegrees gibt einen Winkel zurück.


Dann dürfte ja alles funktionieren …?


----------



## mihe7 (24. Nov 2018)

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.


----------



## brilzi89 (26. Nov 2018)

habs jetzt so hinbekommen:


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

            }


        }
    };
}
```


----------



## mihe7 (26. Nov 2018)

`double degree = Math.abs(Math.toDegrees(roll));`


----------



## brilzi89 (26. Nov 2018)

mihe7 hat gesagt.:


> `double degree = Math.abs(Math.toDegrees(roll));`


danke


----------



## brilzi89 (26. Nov 2018)

hättet ihr vll noch ne idee zu einem Problem.

Beim Accelerometer startet der Wert ja bei 0 und geht links und rechts bis 180°.
Wie könnte man es hinbekommen das der Wert bei 90° startet und bis 0° links und rechts geht.


----------



## mihe7 (26. Nov 2018)

Naja, wenn der Wert im Intervall [0;180] liegt und Du ihn durch 2 dividierst, erhältst Du Werte im Intervall [0;90]. Jetzt noch von 90 abziehen...
`mapped = 90 - degrees / 2;`


----------



## brilzi89 (26. Nov 2018)

bis 180° will ich eigentlich nicht gehen. Ich mache ne App zur Ladungssicherung und da misst man nur von 0 bis 90grad.
Sprich das Smartphone wird links und rechts nur um 90grad gedreht. Das Handy zeigt ja 0° an wenn ich das Handy gerade halte. Es sollte aber 90° anzeigen und wenn ich das Handy jetzt um 90° drehe auf 0° fallen. Fällt mir gerade schwer das zu erklären XD


----------



## mihe7 (26. Nov 2018)

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)`


----------



## Xyz1 (26. Nov 2018)

Bei mir schauen die Accelerometerwerte so aus, wenn das Schmierphone auf dem Tisch liegt :
 

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.


----------



## brilzi89 (26. Nov 2018)

mihe7 hat gesagt.:


> 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)`



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


----------



## brilzi89 (26. Nov 2018)

DerWissende hat gesagt.:


> 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,
> ...




Hast da aber viele Sonsoren XD


----------



## Xyz1 (26. Nov 2018)

brilzi89 hat gesagt.:


> Hast da aber viele Sonsoren


Das haben doch viele Handys.


----------



## mihe7 (26. Nov 2018)

brilzi89 hat gesagt.:


> 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


Ja, und?

Erklär doch mal, welche Werte Du in welcher Lage bekommst (EDIT: *ohne* einer meiner Umrechnungen) und welche Werte Du haben möchtest.


----------



## brilzi89 (26. Nov 2018)

nach rechts gedreht => 90° = 0° ; 45° = 45° ; 0° = 90°  ( wie gewollt)
nach links gedreht => 90° = 0° ; 135° = 45° ; 180° = 90° 

hoffe konnte es etwas besser darstellen


----------



## mihe7 (26. Nov 2018)

brilzi89 hat gesagt.:


> hoffe konnte es etwas besser darstellen


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.


----------



## Xyz1 (26. Nov 2018)

Bin heute auch zu blöd und möchte auch raw values haben....

Auch bei der Interpretation.... Misst ein Accelerometer Geschwindigkeitsarbeit, Beschleunigung, Lage oder potentielle bzw kinetische Energie??

Wenn Du Werte um 10 bekommst dann sind das möglicherweise g: https://stackoverflow.com/questions/5871429/accelerometer-data-how-to-interpret

90Grad wären ungefähr 1,5g...


----------



## mihe7 (27. Nov 2018)

DerWissende hat gesagt.:


> Misst ein Accelerometer Geschwindigkeitsarbeit, Beschleunigung, Lage oder potentielle bzw kinetische Energie??


Die Beschleunigung.


----------



## Xyz1 (27. Nov 2018)

mihe7 hat gesagt.:


> Die Beschleunigung.


Das hat Dir der Mephisto gesagt (Sorry)

Aber dann macht es doch keinen Sinn diese in Grad umrechnen zu wollen... 
schlaf gut


----------



## mihe7 (27. Nov 2018)

DerWissende hat gesagt.:


> Das hat Dir der Mephisto gesagt


Wer sonst? 



DerWissende hat gesagt.:


> Aber dann macht es doch keinen Sinn diese in Grad umrechnen zu wollen...


Warum nicht?


----------



## Xyz1 (27. Nov 2018)

Ist das wirklich kein Lagesensor?


----------



## mihe7 (27. Nov 2018)

DerWissende hat gesagt.:


> Ist das wirklich kein Lagesensor?


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.


----------



## Xyz1 (27. Nov 2018)

mihe7 hat gesagt.:


> irre, das Zeug.


Der Schnaps?


----------



## brilzi89 (28. Nov 2018)

Bin gerade im Ausendienst, gebe dir die Werte am Freitag mihe7 
Danke im Voraus


----------



## brilzi89 (2. Dez 2018)

mihe7 hat gesagt.:


> Evtl. bin ich heut zu doof, aber ich kann da gar nichts rauslesen.
> 
> Bitte folgende Infos:
> 
> ...



so  3 Uhr:  ist x:  0 grad  soll y : 0 grad 
1:30 Uhr:  ist x : 45 grad soll y : 45 grad
    0 Uhr :  ist x : 90 grad soll y : 90 grad
10:30 Uhr : ist x : 135 grad soll y : 45 grad
9 Uhr :        ist x : 180 grad soll y : 0 grad


----------



## brilzi89 (2. Dez 2018)

habs jetzt so hinbekommen wie ich es gerne hätte:


```
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) + "°");
```


----------

