Как определить магнитный север/азимут без магнитометра

Я работаю над устройством Android, у которого нет магнитометра, но есть датчик вращения (гироскоп), датчик гравитации и GPS. Я хотел бы определить истинный север/азимут с помощью этих датчиков, но не могу понять, как это сделать. Как без магнитометра определить ориентацию этого устройства? Очевидно, каким-то образом он знает, где указан север, и приложение «Карты» работает просто отлично.


person strangetimes    schedule 11.10.2016    source источник
comment
stackoverflow.com/questions/38711705/   -  person Ircover    schedule 11.10.2016
comment
@Ircover Спасибо, я обновил свой вопрос, я думаю, мне нужен «истинный север», а не только ориентация устройства (поскольку это вернет 0, если оно обращено прямо вверх). По сути, я пытаюсь создать компас с заданными ограничениями.   -  person strangetimes    schedule 11.10.2016
comment
Если устройство перемещается (более чем на несколько метров), то GPS может предоставить вам направление движения. Теоретически вы можете использовать это для калибровки датчика вращения, а затем отслеживать с его помощью вращение устройства. Конечно, на практике все усложняется, если устройство вращается вокруг нескольких осей.   -  person Markus Kauppinen    schedule 11.10.2016


Ответы (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 хотя бы частично полагаются на магнитометр.

Надеюсь это поможет!

person HenriqueMS    schedule 11.10.2016
comment
спасибо за это, я знаю, как использовать гироскоп - я просто не знаю, как определить «истинный север» по его показаниям, так как мне нужно сначала получить представление о том, где находится север. К сожалению, TYPE_ORIENTATION устарела и поэтому недоступна для использования :( - person strangetimes; 11.10.2016
comment
тогда посмотрю еще ;) - person HenriqueMS; 11.10.2016
comment
спасибо, я отмечу это как правильный ответ, хотя оборудование, на котором я работаю, не дает мне никаких показаний для TYPE_ROTATION :( Но это звучит как единственный другой выбор, который у меня может быть. - person strangetimes; 11.10.2016
comment
Спасибо ;) Вы заметили, что на самом деле это TYPE_ROTATION_VECTOR, а не TYPE_ROTATION? (Всего лишь уточняю) - person HenriqueMS; 11.10.2016
comment
Да, спасибо за двойную проверку, это то, что я имел в виду :) Это приборная панель автомобиля, с которой я работаю, и, очевидно, она не хочет играть в мяч. - person strangetimes; 11.10.2016
comment
Но TYPE_ROTATION_VECTOR использует магнитометр? - person lolelo; 21.09.2020