Использование getRotationMatrix и getOrientation в Android 2.1
У меня были проблемы с этим слишком долго. Этот код должен выводить 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 ответа
Возможно, я что-то упустил (и вы, возможно, уже решили это), но мне кажется, что ваш оператор 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;
после вашего первого случая.
Причина, по которой вы получаете 0.0, -0.0, -0.0 из getOrientation(), заключается в том, что getRotationMatrix() не всегда получает правильный результат. Вам нужно проверить возвращаемое значение getRotationMatrix(), которое будет ложным, если результат недействительным, или истинным, если он был успешным.
Добавлено: На самом деле, это не вышло правильно. Вы получаете неверный результат по той причине, на которую указал агандер. Проверка возвращаемого значения будет просто указанием на то, что вы на самом деле получаете неверный результат.