关于getorientation函数输出的混淆

时间:2015-01-26 14:14:18

标签: android orientation sensor

根据官方帖子, X被定义为矢量乘积Y.Z(它在设备的当前位置与地面相切并且大致点西)。 Y在器件的当前位置与地面相切,并指向磁北极。 Z指向地球的中心并垂直于地面。

Y与Roll相关,X与Pitch相关,Z与方位角相关。

因此,有理由认为旋转可能导致Pitch的读数变化,当您将手机朝北方向保持平坦时,旋转会导致Roll的读数发生变化你把电话朝东方向,对吧?换句话说,在手机的坐标系中导致俯仰角度变化的实际旋转将导致在将手机向东方向握持时坐标系统中的滚动读数变化。

然而,在我看来,当我看到屏幕上的读数时并非如此。当我将手机平放在东方时,手机坐标系中的实际音高旋转动作仍然会导致音高变化。用于getorientation功能。 Plz帮助我!!非常感谢你!

以下是我正在使用的代码:

    package com.example.yang.euler;
    import android.app.Activity;
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    public class MainActivity extends Activity{
    private SensorManager sm;
    private Sensor aSensor;
    private Sensor mSensor;
    public EditText Azimuth;
    public EditText Pitch;
    public EditText Roll;

float[] accelerometerValues = new float[3];
float[] magneticFieldValues = new float[3];


@Override
public View findViewById(int id) {
    return super.findViewById(id);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    aSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mSensor = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

    sm.registerListener(myListener, aSensor, SensorManager.SENSOR_DELAY_NORMAL);
    sm.registerListener(myListener, mSensor,SensorManager.SENSOR_DELAY_NORMAL);

    calculateOrientation();

}

public void onPause(){
    sm.unregisterListener(myListener);
    super.onPause();
}


final SensorEventListener myListener = new SensorEventListener() {
    public void onSensorChanged(SensorEvent sensorEvent) {

        if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
            magneticFieldValues = sensorEvent.values.clone();
        if (sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY)
            accelerometerValues = sensorEvent.values.clone();
        calculateOrientation();
    }
    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};


private  void calculateOrientation() {
    Azimuth = (EditText) findViewById(R.id.editazimuth);
    Pitch = (EditText) findViewById(R.id.editpitch);
    Roll = (EditText) findViewById(R.id.editroll);
    float[] values = new float[3];
    float[] R = new float[9];
    SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticFieldValues);
    SensorManager.getOrientation(R, values);
    values[0] = (float) Math.toDegrees(values[0]);
    values[1] = (float) Math.toDegrees(values[1]);
    values[2] = (float) Math.toDegrees(values[2]);
    Azimuth.setText(values[0]+"");
    Pitch.setText(values[1]+"");
    Roll.setText(values[2]+"");
}}

0 个答案:

没有答案