Compass App Roll / Y значение не меняется, когда устройство установлено на движущемся транспортном средстве - PullRequest
0 голосов
/ 15 марта 2020

Заранее спасибо всем, кто может помочь разобраться в этом.

Я новичок в Android Разработчик и создал приложение Compass, которое поможет определять курс в градусах с помощью датчиков устройства. Компас возвращает правильное значение, когда само устройство вращается (пока оно неподвижно), но когда оно установлено в транспортном средстве, значения вращения остаются неизменными. Я проверил другие реализации приложения Compass и, похоже, я ничего не пропустил.

Любое понимание того, в чем может быть проблема?

public class MainActivity extends AppCompatActivity implements SensorEventListener {


private SensorManager mySensorManager;
private float[] accelVals = new float[3];
private float[] magVals = new float[3];
private float[] rotationMatrix = new float[16];
private float[] orientationVals = new float[3];
int Pose;

TextView displayData2;
Sensor myMagneticSensor, myAccelerometer;

// System display. Need this for determining rotation.
private Display mDisplay;


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

    displayData2 = (TextView) findViewById(R.id.data2);

    mySensorManager = (SensorManager) getSystemService(
            Context.SENSOR_SERVICE);

    myAccelerometer = mySensorManager.getDefaultSensor(
            Sensor.TYPE_ACCELEROMETER);

    myMagneticSensor = mySensorManager.getDefaultSensor(
            Sensor.TYPE_MAGNETIC_FIELD);


 }

@Override
protected void onStart() {
    super.onStart();

    // Listeners for the sensors are registered in this callback and
    // can be unregistered in onStop().
    //
    // Check to ensure sensors are available before registering listeners.
    // Both listeners are registered with a "normal" amount of delay
    // (SENSOR_DELAY_NORMAL).

    if (myAccelerometer != null) {
        mySensorManager.registerListener(this, myAccelerometer,
                SensorManager.SENSOR_DELAY_NORMAL);
    }
    if (myMagneticSensor != null) {
        mySensorManager.registerListener(this, myMagneticSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

}


@Override
protected void onStop() {
    super.onStop();

    // Unregister all sensor listeners in this callback so they don't
    // continue to use resources when the app is stopped.
    mySensorManager.unregisterListener(this);
}



    @Override
    public void onSensorChanged(SensorEvent event) {

        switch (event.sensor.getType()) {
            case Sensor.TYPE_ACCELEROMETER: {
                accelVals = event.values.clone();
                break;
            }
            case Sensor.TYPE_MAGNETIC_FIELD: {
                magVals = event.values.clone();
                break;
            }

        }

        SensorManager.getRotationMatrix(rotationMatrix, null, accelVals,
                magVals);
        SensorManager.getOrientation(rotationMatrix, orientationVals);
        // Convert the result from radians to degrees
        orientationVals[0] = (float) Math.toDegrees(orientationVals[0]);
        orientationVals[1] = (float) Math.toDegrees(orientationVals[1]);
        orientationVals[2] = (float) (Math.toDegrees(orientationVals[2]) + 360) % 360 ;

        Pose = Math.round(orientationVals[2]);

        //Print Data
        displayData2.setText("Pose: " + Pose);

       // displayData2.setText("Z: " + Float.toString(orientationVals[2]));



    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }

1 Ответ

0 голосов
/ 17 марта 2020

Я нашел способ обойти вышеуказанную проблему, внедрив вместо этого составной датчик Rotation_Vector, получив матрицу вращения, проанализировав векторные значения в методе ".getRoationMatrixFromVector", как показано ниже.

SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);

Значения RotationMatrix из альтернативного процесса, описанного выше, по-видимому, относятся к системе координат Земли, а не к системе устройства в стационарном состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...