2016-08-28 10 views
3

Я написал следующий код, в котором значения акселерометра показаны в x, y, z во время вращения.Значения акселерометра до градусов

public class MainActivity extends AppCompatActivity implements SensorEventListener { 

private TextView xText,yText,zText; 
private Sensor mySensor; 
private SensorManager SM; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //Creating the Sensor Manager 
    SM = (SensorManager)getSystemService(SENSOR_SERVICE); 

    // Accelerometer Sensor 
    mySensor = SM.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 

    // Register sensor Listener 
    SM.registerListener(this, mySensor, SensorManager.SENSOR_DELAY_NORMAL); 

    // Assign TextView 
    xText = (TextView)findViewById(R.id.xText); 
    yText = (TextView)findViewById(R.id.yText); 
    zText = (TextView)findViewById(R.id.zText); 


} 

@Override 
public void onSensorChanged(SensorEvent sensorEvent) { 



    xText.setText("X: " + sensorEvent.values[0]); 
    yText.setText("Y: " + sensorEvent.values[1]); 
    zText.setText("Z: " + sensorEvent.values[2]); 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int i) { 

    } 
} 

Теперь я хочу преобразовать значения, которые я получаю из SensorEvents, в градусы. Здесь я рассматривал различные вопросы, но я смутился.

double x = sensorEvent.values[0]; 
    double y = sensorEvent.values[1]; 
    double z = sensorEvent.values[2]; 

Должна быть формула, которая принимает вышеуказанные значения и преобразует их в градусы.

Любые идеи?

Thanks,

Theo.

EDIT

@Override 
public void onSensorChanged(SensorEvent sensorEvent) { 
    //xText.setText("X: " + sensorEvent.values[0]); 
    //yText.setText("Y: " + sensorEvent.values[1]); 
    //zText.setText("Z: " + sensorEvent.values[2]); 

    double x = sensorEvent.values[0]; 
    double y = sensorEvent.values[1]; 
    double z = sensorEvent.values[2]; 

    double pitch = Math.atan(x/Math.sqrt(Math.pow(y,2) + Math.pow(z,2))); 
    double roll = Math.atan(y/Math.sqrt(Math.pow(x,2) + Math.pow(z,2))); 
    //convert radians into degrees 
    pitch = pitch * (180.0/3.14); 
    roll = roll * (180.0/3.14) ; 

    yText.setText(String.valueOf(pitch)); 
    zText.setText(String.valueOf(roll)); 
} 
+0

Вам повезло? –

ответ

0

Youll необходимо зарегистрироваться на TYPE_ACCELEROMETER, но и для TYPE_MAGNETIC_FIELD и чем вы можете использовать SensorManager встроенный метод для вашей помощи:

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

Вы можете узнать всю дополнительную информацию, прочитав SensorManager комментарии исходного кода.

+0

Хорошо. Спасибо за ответ. Но как отображать градусы? Если я поставлю xText.setText (String.valueOf (myAzimut)); Я ничего не получаю :( – Theo

+0

вы добавили android.permission.ACCESS_COARSE_LOCATION android.permission.ACCESS_FINE_LOCATION? Потому что кажется, что вы получаете нулевое значение. –

+0

oops. Я этого не делал. Позвольте мне добавить их и сообщить вам ... – Theo

1

Теперь я хочу, чтобы преобразовать значения, которые я получаю от SensorEvents градусы

Единицей значение, которое вы получаете от TYPE_ACCELEROMETER является м/с^2, таким образом, пытается преобразовать в степень не иметь смысл.

Ваши расчеты высоты и наклона не кажутся правильными. Для правильного расчета см метода processSensorData(DProcessedSensorEvent.DProcessedSensorEventBuilder builder) в DSensorEventProcessor классе на https://github.com/hoananguyen/dsensor/blob/master/dsensor/src/main/java/com/hoan/dsensor_master/DSensorEventProcessor.java

Для преобразования тангажа и крена в градусы использовать Math.toDegrees(valueToConvert)

0

вашего кода кажутся правильным. используйте Math.PI в (180.0/3.14), чтобы получить более точные результаты.