Главная » Разработка для Android » Вычисление положения с помощью акселерометра и датчика магнитного поля

0

Лучший  способ определить  положение  устройства  в пространстве  — вычислить его, используя напрямую  показания акселерометра и датчика магнитного поля.

Данный подход позволяет вам изменять систему отсчета для перена- значения  осей X, Y и Z, чтобы корректировать ожидаемую  ориентацию устройства.

При таком подходе используются сразу два датчика  — акселерометр и датчик магнитного поля, поэтому вам необходимо создать и зарегистриро- вать две реализации SensorEventListener. Внутри методов onSensorChanged для каждой из них записывайте свойство values, получаемое из двух разных полей, как показано в листинге 14.4.

Листинг 14.4. Определение положения в пространстве  с помощью акселерометра и датчика магнитного поля

float[] accelerometerValues;

float[] magneticFieldValues;

final SensorEventListener myAccelerometerListener = new

SensorEventListener() {

public void onSensorChanged(SensorEvent sensorEvent) {

if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER)

accelerometerValues = sensorEvent.values;

}

public void onAccuracyChanged(Sensor sensor, int accuracy) {}

};

final SensorEventListener myMagneticFieldListener = new

SensorEventListener() {

public void onSensorChanged(SensorEvent sensorEvent) {

if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)

magneticFieldValues = sensorEvent.values;

}

public void onAccuracyChanged(Sensor sensor, int accuracy) {}

};

Зарегистрируйте обе реализации SensorEventListener с помощью объ- екта SensorManager, как показано в следующем дополнении к листингу 14.4. В этом фрагменте  используются аппаратные  датчики по умолчанию  и ча- стота обновления SENSOR_DELAY_UI:

SensorManager sm = (SensorManager)getSystemService(Context.SENSOR_ SERVICE);

Sensor aSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); Sensor mfSensor = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

sm.registerListener(myAccelerometerListener, aSensor, SensorManager.SENSOR_DELAY_UI);

sm.registerListener(myMagneticFieldListener, mfSensor, SensorManager.SENSOR_DELAY_UI);

Чтобы вычислить текущее положение в пространстве с помощью показа- ний этих датчиков, используйте методы getRotationMatrix и getOrientation

из объекта SensorManager, как показано  ниже. Обратите  внимание  на то, что getOrientation возвращает  радианы, а не градусы.

float[] values = new float[3]; float[] R = new float[9]; SensorManager.getRotationMatrix(R, null,

accelerometerValues, magneticFieldValues);

SensorManager.getOrientation(R, values);

// Преобразуйте радианы в градусы.

values[0] = (float) Math.toDegrees(values[0]); values[1] = (float) Math.toDegrees(values[1]); values[2] = (float) Math.toDegrees(values[2]);

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии