Wie kann man die X-Achse richtig messen mit Android Code?
Sehr geehrte Damen und Herren
In meinem App, welches ich zurzeit programmiere, möchte ich wie bei Doodle Jump bei Schwenken des Mobiltelefon ein Dreieck verschieben. Ich habe schon diverse Anleitungen gefunden, jedoch habe ich das Problem, dass wenn mein Handy nicht flach liegt, also zum Boden geneigt, dass dann die Werte nicht mehr stimmen. Kann mir jemand weiterhelfen?
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
senGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
sensorManager.registerListener(this,senGyroscope,SensorManager.SENSOR_DELAY_FASTEST);
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType()== Sensor.TYPE_ROTATION_VECTOR)
{
getGyroscope(event);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
private void getGyroscope(SensorEvent event)
{
float[] values = event.values;
// Movement
float x = values[0];
float y = values[1];
this.posx_player = (int) ((middle_screen_x-middle_player_x)+(x*1500));
txt2.setText(""+y);
txt3.setText(""+x);
params_player= new RelativeLayout.LayoutParams(150,150);
params_player.setMargins(posx_player, (size_screen_y-400), 0, 0);
img_player.setLayoutParams(params_player);
}
1 Antwort
Grob gesagt:
Das Gyroskop erkennt Rotationen - im dreidimensionalen Raum gibt es drei Achsen um die man rotieren kann:
float[] values = event.values;
// Movement
float x = values[0];
float y = values[1
l;
float z = values[2];
Die Doku schreibt:
The coordinate-system is defined relative to the screen of the phone in its
default orientation. The axes are not swapped when the device's screen
orientation changes.
The X axis is horizontal and points to the right,
the Y axis is vertical and points up and
the Z axis points towards the outside of the front face of the screen
Mit anderen Worten - die Achsen sind nicht fest im Raum sondern beziehen sich auf die aktuelle Ausrichtung des Handys.
Es gibt also KEINE feste Achse die z.B. wie ein Lot immer von oben nach unten (Richtung Erdmittelpunkt) zeigen würde.
Liegt das Handy flach auf dem Tisch wäre das die Z-Achse.
Hält man hingegen das Handy im Hochformat wie ein Bild an die Wand dann würde die Y-Achse nach unten zeigen
Man muss also (je nach Ausrichtung des Handies) alle 3 Werte des Gyroskop berücksichtigen.
Die Werte eines Gyroskop "driften" allerdings im Lauf der Zeit davon - sie sind nur für kurze Zeiträume und auch nur relativ genau..
Um die tatsächliche Ausrichtung des Handys im Raum zu bestimmen sind sie alleine nicht geeignet - dazu eignen sich die Magnetfeldsensoren besser:
http://developer.android.com/guide/topics/sensors/sensors_position.html
Also vereinfacht gesagt.
Um dauerhauft einigermassen präzise zu erkennen wo Norden oder "unten" ist nimmt man diese Sensoren - und um kurzfristige Drehungen schnell berücksichtigen zu können die Werte des Gyroskop.
Je nachdem auf was es mehr ankommt (hohe absolute Genauigkeit aber langsam oder nur relative Genauigkeit aber schnell) muss man das für den jeweiligen Anwendungszweck auch noch "feintunen"
Das ist alles andere als trivial....
Vielleicht hilft Dir das weiter - speziell die erste Antwort ist recht gut:
http://stackoverflow.com/questions/13679568/using-android-gyroscope-instead-of-accelerometer-i-find-lots-of-bits-and-pieces/13895376#13895376
Danke für deine Antwort, ich habe ein 3eck mit welchem ich mich wie bei Doodle jumb von links nach rechts bewege. Gibt es also keine einfache Lösung für mein Problem?