Accelerometer daten umwandeln

brilzi89

Bekanntes Mitglied
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

Bekanntes Mitglied
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
 

brilzi89

Bekanntes Mitglied
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]);

                }
            }
        }

    };
}
 

brilzi89

Bekanntes Mitglied
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:

Lucaaa

Bekanntes Mitglied
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

Bekanntes Mitglied
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

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

mihe7

Top Contributor
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

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

            }


        }
    };
}
 

brilzi89

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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)
 
X

Xyz1

Gast
Bei mir schauen die Accelerometerwerte so aus, wenn das Schmierphone auf dem Tisch liegt:D :
Screenshot.jpg

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? :D
Alle anderen dürften stimmen.
 

brilzi89

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Top Contributor
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.
 

brilzi89

Bekanntes Mitglied
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.

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

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

Java:
  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) + "°");
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Accelerometer ohne Activity Android & Cross-Platform Mobile Apps 8
G accelerometer Android & Cross-Platform Mobile Apps 2
M Firebase RealtimeDatabase - Daten aus Queries in CSV File speichern Android & Cross-Platform Mobile Apps 1
N XY-Plottet keine Daten obwohl Funktion ausgeführt wird Android & Cross-Platform Mobile Apps 4
N XY-Plot plottet keine Daten Android & Cross-Platform Mobile Apps 0
W Background Service Daten verarbeiten/Schleife ect. Android & Cross-Platform Mobile Apps 1
R Android Daten speichern und anzeigen Android & Cross-Platform Mobile Apps 7
MiMa Daten vom Brustgurt bekommen? Android & Cross-Platform Mobile Apps 3
ruutaiokwu Android Daten von "Activity A" nach "Activity B" umleiten? Android & Cross-Platform Mobile Apps 13
P Daten bzw Objekte auf das Handy lokal speichern Android & Cross-Platform Mobile Apps 29
W Android Browser startet immer, bevor die Daten dafür geholt wurden Android & Cross-Platform Mobile Apps 15
J Android Server-Login Daten in der App sicherer hinterlegen? Android & Cross-Platform Mobile Apps 7
T Firestore Daten in Spinner Android & Cross-Platform Mobile Apps 0
L Android Daten von Webseite runterladen, die mit HTTP-Authentifizierung gesichert ist Android & Cross-Platform Mobile Apps 5
S Android Apk Daten auslesen Android & Cross-Platform Mobile Apps 6
G Android Daten in einer Datenbank speichern Android & Cross-Platform Mobile Apps 1
ATZENPOWER Android Probleme mit mobilen Daten via lte Android & Cross-Platform Mobile Apps 10
S Android Studio MySql Daten in Listview mit sub Item Android & Cross-Platform Mobile Apps 11
A Android Daten in der Cloud speichern (Google) Android & Cross-Platform Mobile Apps 1
K Unbekannte Menge von Daten (Strings oder Ints) an Activity übergeben Android & Cross-Platform Mobile Apps 0
K Android SQLite Query "WHERE _id in (X, Y, Z)" keine Daten Android & Cross-Platform Mobile Apps 6
M Anzeigen der Daten dauert zu lange - Progressdialog? Android & Cross-Platform Mobile Apps 5
K Android DialogFragment mit SimpleCursorAdapter: Auf Daten zugreifen? Android & Cross-Platform Mobile Apps 4
S Daten aus Android Gerät auslesen Android & Cross-Platform Mobile Apps 3
L Android Datei erstellen, Daten einspeichern und auslesen Android & Cross-Platform Mobile Apps 2
B Alle Daten gehen verloren, wenn die Displaysperre aktiviert wird? Android & Cross-Platform Mobile Apps 21
M Daten zwischen mehreren Activities Android & Cross-Platform Mobile Apps 2
M Daten zwischen Activities übergeben Android & Cross-Platform Mobile Apps 7
G Daten von einer Activity zur nächsten übergeben Android & Cross-Platform Mobile Apps 6
G Wie gebe ich dem DrawView die Daten mit? Android & Cross-Platform Mobile Apps 2
V App Daten in Java Applikation Android & Cross-Platform Mobile Apps 3
D Android Daten verwalten Android & Cross-Platform Mobile Apps 2
S Android binäre Daten zwischen Android und einem Java-Server Android & Cross-Platform Mobile Apps 5
M Android Von Smartphone auf Daten von Server zugreifen Android & Cross-Platform Mobile Apps 2
C Android Listen/Daten aus der SQLLite Datenbank darstellen Android & Cross-Platform Mobile Apps 2
L Android Einlesen und rausschreiben von Daten auf SD Android & Cross-Platform Mobile Apps 3
U Android Daten dauerhaft speichern? Android & Cross-Platform Mobile Apps 2
P Java ME benutzer daten speichern Android & Cross-Platform Mobile Apps 5
7 GPS-Daten auslesen auf Samsung SGH I900 Omnia Android & Cross-Platform Mobile Apps 3
X RMS - Will die Daten auf den PC kopieren Android & Cross-Platform Mobile Apps 3
B Daten in *.txt schreiben Android & Cross-Platform Mobile Apps 7
R Lesen und schreiben von Daten. Android & Cross-Platform Mobile Apps 2
K XDA Orbit: Auslesen der GPS Daten mit J2ME Android & Cross-Platform Mobile Apps 2
M Daten aus Jad-file auslesen Android & Cross-Platform Mobile Apps 2
O eingehende Daten speichern Android & Cross-Platform Mobile Apps 2
W JSONARRAY per Intent an andere Activity übergeben und umwandeln ggbf. Android & Cross-Platform Mobile Apps 1
F Images in Video umwandeln Android & Cross-Platform Mobile Apps 0
L Android Theorie: Umwandeln von Text in Morsecode Android & Cross-Platform Mobile Apps 15
B Java PC Spiel fürs Handy umwandeln? Android & Cross-Platform Mobile Apps 8

Ähnliche Java Themen


Oben