加速度计值为度

时间:2016-08-28 10:21:12

标签: android accelerometer

我编写了以下代码,其中加速度计的值在旋转期间以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];

应该有一个公式采用上述值并以度为单位进行转换。

有什么想法吗?

谢谢,

西奥。

修改

@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));
}

3 个答案:

答案 0 :(得分:1)

  

现在我想将我从SensorEvents获得的值转换为度

从TYPE_ACCELEROMETER获得的值的单位是m / s ^ 2,因此尝试转换为度数没有意义。

您的俯仰和滚动计算似乎不正确。要获得正确的计算,请参阅位于https://github.com/hoananguyen/dsensor/blob/master/dsensor/src/main/java/com/hoan/dsensor_master/DSensorEventProcessor.javaprocessSensorData(DProcessedSensorEvent.DProcessedSensorEventBuilder builder)课程中的方法DSensorEventProcessor

要将音高和滚动转换为度数,请使用Math.toDegrees(valueToConvert)

答案 1 :(得分:0)

您需要注册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源代码评论,了解所有其他信息。

答案 2 :(得分:0)

您的代码似乎正确。使用Math.PI中的(180.0/3.14)来获得更准确的结果。