Как рассчитать тангаж и крен с помощью SensorManager.getOrientation()

В настоящее время я пытаюсь заменить свой «Sensor.TYPE_ORIENTATION», потому что он устарел. Итак, В документации Android отсутствует большая часть информации о том, как это сделать. Во время отладки и копания здесь, на SO, я понял, как вычислить azimuth, который когда-то был предоставлен OrientationSensor. Я делаю это таким образом:

float accelerometerVals[] = new float[3];
float magneticVals[] = new float[3];

float orientationSensorVals[] = new float[3]; 

float rotationMatrix[] = new float[16];
float orientation[] = new float[3];

    @Override
    public void onSensorChanged(SensorEvent event) {
        switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
             System.arraycopy(event.values, 0, accelerometerVals, 0, 3);
             break;
        case Sensor.TYPE_MAGNETIC_FIELD:
              System.arraycopy(event.values, 0, magneticVals, 0, 3);
              break;
        case Sensor.TYPE_ORIENTATION:
              System.arraycopy(event.values, 0, orientationSensorVals, 0, 3);
              break;
        default:
              break;
        }

        if (null != magneticVals && null != accelerometerVals){
            SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerVals, magneticVals)
            SensorManager.getOrientation(rotationMatrix, orientation);
            float azimuth = Math.toDegrees(orientation[0])
            //this calculation gives me the Azimuth in the same format that OrientationSensor
            azimuth += (azimuth >= 0) ? 0 : 360
            float FALSE_PITCH = Math.toDegrees(orientation[1])
            float FALSE_ROLL = Math.toDegrees(orientation[2])
        }    

Обратите внимание на переменные FALSE_PITCH && FALSE_ROLL. Я понятия не имею, как «нормализовать» (значения отличаются от +10 до -10) эти значения, чтобы получить тот же результат, что и раньше, внутри моего OrientationSensor.


person Rafael T    schedule 05.04.2012    source источник


Ответы (2)


Я столкнулся с той же проблемой, но я удивлен, что ваш бросок не подходит, как и для меня. Вот что я использовал:

//Let values[] be your orientation[] variable once in degrees.

// Azimuth scaling
if (values[0]<0) values[0] += 360;

// Pitch scaling
if (values[1]<-90) values[1] += (-2*(90+values[1]));
else if (values[1]>90) values[1] += (2*(90-values[1]));

// Roll scaling
// NOT NEEDED

Не могли бы вы опубликовать некоторые выходные данные как датчика ориентации, так и вашей переменной ориентации [] градусов?

person PeterGriffin    schedule 18.04.2012
comment
Не могли бы вы объяснить, почему не нужно нормализовать рулон? - person Matthias; 17.03.2013

Может тебе поможет!!

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
boolean orientok = mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI);

//test if orientation sensor exist on the device
if (!orientok){
        mSensorManager.unregisterListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION));
        ((TextView)findViewById(R.id.orient)).setText("no orientation sensor");
    }

public void onSensorChanged(SensorEvent event) {
    switch(event.sensor.getType()){
    case Sensor.TYPE_ORIENTATION:
        onOrientChanged(event);
        break;
                    ...// add other sensor type if you want and create for each one his function like the example below
}

 public void onOrientChanged(SensorEvent event) {
    float azimuth,pitch,roll;
    azimuth = event.values[0];
    pitch = event.values[1];
    roll = event.values[2];
    ((TextView)findViewById(R.id.azimuth)).setText("Axe x "+azimuth);
    ((TextView)findViewById(R.id.pitch)).setText("Axe y "+pitch);
    ((TextView)findViewById(R.id.roll)).setText("Axe z "+roll);
}
person 13KZ    schedule 18.04.2012
comment
TYPE_ORIENTATION устарела - person Puzirki; 29.10.2014