Я работаю над устройством Android, у которого нет магнитометра, но есть датчик вращения (гироскоп), датчик гравитации и GPS. Я хотел бы определить истинный север/азимут с помощью этих датчиков, но не могу понять, как это сделать. Как без магнитометра определить ориентацию этого устройства? Очевидно, каким-то образом он знает, где указан север, и приложение «Карты» работает просто отлично.
Как определить магнитный север/азимут без магнитометра
Ответы (1)
ОБНОВЛЕНИЕ:
Вы можете использовать датчик вектора вращения, который кажется идеальным для вашей ситуации.
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
Система координат, которую вы хотите, выглядит следующим образом:
- X определяется как векторное произведение Y x Z. Оно касается земли в текущем местоположении устройства и указывает приблизительно на восток.
- Y направлен по касательной к земле в текущем местоположении устройства и указывает в сторону геомагнитного Северного полюса.
- Z указывает на небо и перпендикулярно плоскости земли.
Android предоставляет множество датчиков
если вы специально хотите использовать гироскоп (Sensor.TYPE_GYROSCOPE
), вы можете сделать это следующим образом (взято из пример Google):
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
public void onSensorChanged(SensorEvent event) {
//...
}
но вы можете попробовать и проверить, можете ли вы использовать API более высокого уровня, который будет использовать более одного датчика.
Вам следует взглянуть на этот простой пример от JavaCodeGeeks. где они используют Sensor.TYPE_ORIENTATION
по умолчанию для создания компаса Android
Еще немного информации о Sensor.TYPE_ORIENTATION. Согласно Google, вы по-прежнему можете использовать ориентацию устройства , но вызывая getOrientation()
вместо того, чтобы воздействовать непосредственно на датчик.
Вместо использования необработанных данных от датчика ориентации мы рекомендуем использовать метод
getRotationMatrix()
в сочетании с методомgetOrientation()
для вычисления значений ориентации, как показано в следующем примере кода. В рамках этого процесса вы можете использовать методremapCoordinateSystem()
для перевода значений ориентации в систему отсчета вашего приложения.
Плохая новость заключается в том, что и getOrientation()
, и старый Sensor.TYPE_ORIENTATION
хотя бы частично полагаются на магнитометр.
Надеюсь это поможет!
TYPE_ROTATION_VECTOR
использует магнитометр?
- person lolelo; 21.09.2020