Использование getRotationMatrix и getOrientation в Android 2.1 - PullRequest
8 голосов
/ 03 июня 2010

У меня проблемы с этим слишком долго. Этот код должен выводить dx, dy, dz для акселерометра и промежуточную сумму dx. Также должны быть выведены азимут, высота и крен.

Я использовал приведенную здесь информацию , но безрезультатно.

Этот код неправильно выводит высоту, азимут или крен. Он выводит 0.0, -0.0, -0.0 для трех последних текстовых представлений соответственно.

switch (event.sensor.getType()) {
    case Sensor.TYPE_ACCELEROMETER:
        accelerometerValues = event.values.clone();
    case Sensor.TYPE_MAGNETIC_FIELD:
        geomagneticMatrix = event.values.clone();
        sensorReady = true;
        break;
    default:
        break;
}   

if (geomagneticMatrix != null && accelerometerValues != null && sensorReady) {
    sensorReady = false;

    float[] R = new float[16];
    float[] I = new float[16];

    SensorManager.getRotationMatrix(R, I, accelerometerValues, geomagneticMatrix);

    float[] actual_orientation = new float[3];
    SensorManager.getOrientation(R, actual_orientation);

    tvXCoordinate.setText(accelerometerValues[0] + "");
    tvYCoordinate.setText(accelerometerValues[1] + "");
    tvZCoordinate.setText(accelerometerValues[2] + "");

    floatXTotal += accelerometerValues[0];
    tvXTotal.setText(floatXTotal + "");

    tvAzimuth.setText(actual_orientation[0] + "");
    tvPitch.setText(actual_orientation[1] + "");
    tvRoll.setText(actual_orientation[2] + "");
}

Ответы [ 2 ]

6 голосов
/ 29 июня 2010

Возможно, я что-то упустил (и вы, возможно, уже решили это), но мне кажется, что ваш оператор switch неверен:

switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            accelerometerValues = event.values.clone();
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomagneticMatrix = event.values.clone();
            sensorReady = true;
            break;
        default:
            break;
    }

Если событие вашего датчика равно TYPE_ACCELEROMETER, значения этого события будут клонированы как в accelerometerValues, так и в geomagneticMatrix, а sensorReady будет установлено в значение true. Я думаю, что вам может понадобиться изменить порядок этого блока или добавить break; после первого случая.

2 голосов
/ 10 сентября 2010

Причина, по которой вы получаете 0.0, -0.0, -0.0 из getOrientation (), заключается в том, что getRotationMatrix () не всегда получает правильный результат. Вам нужно проверить возвращаемое значение getRotationMatrix (), которое будет ложным, если результат недействительным, или истинным, если он успешен.

Добавлено: На самом деле, это не получилось. Вы получаете неверный результат по той причине, на которую указал агандер. Проверка возвращаемого значения будет просто указанием на то, что вы на самом деле получаете неверный результат.

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