Подтвердить что ты не робот

Как откалибровать датчик ориентации в андроиде?

Я пишу приложение в Google Android 2.1, которому необходимо знать, в каком направлении (n/w/s/e) стоит устройство (HTC Hero). Датчик и его слушатель работают отлично, но значения, которые я получаю от датчика, абсолютно дрянные. например он говорит мне, что я столкнулся с севером, когда устройство сталкивается с SW или так...

Это похоже на известную проблему с устройствами Android. "Решения", которые я нашел в Интернете, выглядят следующим образом:

  • Встряхните устройство вокруг
  • переместите устройство как восемь
  • нажмите на устройства назад

Предполагается, что это приведет к повторной калибровке датчиков. И: вещь с "перемещением" работает для меня... но это не очень профессионально, я думаю...

так - как мне вызвать повторную калибровку датчика ориентации из SDK? Мне нужно, чтобы датчик был правильно откалиброван без каких-либо причудливых вещей, которые сделают пользователей этого приложения похожими на полных идиотов, пока они "вручную" откалибруют свои телефоны...

Есть ли способ сделать это "правильно"?

EDIT:

Или: есть ли какой-либо способ определить ПРОГРАММАТИЧЕСКИ, если устройство правильно откалибровано или нет? В качестве резервной опции, так сказать, я мог бы предупредить пользователя о необходимости "ручной" перекалибровки устройства.

4b9b3361

Ответ 1

Я не верю, что есть способ узнать программно, если датчик компаса калиброван правильно, если вы не используете дополнительный источник данных, такой как GPS. Если вы можете использовать GPS, тогда, когда пользователь движется, вы можете сравнить движение GPS с заголовком компаса и исправить. Помните, что локальные магнитные поля могут испортить показания компаса, и устройства не имеют понятия, находитесь ли вы в середине леса или рядом с трансформатором.

С этими микроустройствами всегда будет немного перекос, с которым вам придется иметь дело. Если вы также проверите значения акселерометра, вы увидите, что в покое они не всегда возвращают 9,8 м/с ^ 2 (или, по крайней мере, последовательно между устройствами).

В вашей помощи вам просто нужно сказать пользователю, чтобы он вращал/крутил свой телефон на рисунке восьмой до reset компаса.

Ответ 2

Я предполагаю, что вы имеете в виду магнитометр внутри Героя.

Callibrating является жестким и будет/должен всегда требовать взаимодействия пользователя для реалистичного кавитации. Для этого существуют отдельные стратегии. Вы можете попросить пользователей удерживать устройство в северном направлении, а затем отозвать. Если пользователи не знают, где находится север, вы можете попросить их направить устройство на солнце и в зависимости от местоположения и времени, которое вы можете рассчитать, где это находится.

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

Общепринятой практикой является дополнение данных датчиков от одного датчика с данными другого датчика для повышения точности. Вы можете использовать GPS для определения заголовка, когда пользователь движется. Однако, если он движется медленно, это тоже неточно. Вы можете интегрировать данные, полученные акселерометром, для определения изменений ориентации (а не абсолютной ориентации). Но, честно говоря, гирометр был бы более идеальным в этом случае.

Системы, которые работают так, иногда называются Инерциальные навигационные системы (INS), поскольку они могут, учитывая фиксированную точку в пространстве, определять их последующего относительного положения и ориентации без дополнительных внешних данных. Использование фильтра Калмана является обычной практикой, чтобы время от времени отзывать систему, когда доступно абсолютное положение (например, полученное через GPS).

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

Ответ 3

Это некоторые обработчики ориентации, которые вы можете использовать

Константы int ORIENTATION_UNKNOWN Возврат из onOrientationChanged, когда невозможно определить ориентацию устройства (обычно, когда устройство находится в плоском положении). Общественные конструкторы   OrientationEventListener (контекст контекста) Создает новый OrientationEventListener.   OrientationEventListener (контекст контекста, int rate) Создает новый OrientationEventListener. Общественные методы boolean canDetectOrientation() void disable() Отключает идентификатор OrientationEventListener. void enable() Включает OrientationEventListener, чтобы он отслеживал датчик и вызывал onOrientationChanged (int), когда меняется ориентация устройства. абстрактная пустота onOrientationChanged (int orientation) Вызывается, когда ориентация устройства изменилась. [Expand] Унаследованные методы Из класса java.lang.Object Object clone() Создает и возвращает копию этого объекта. boolean equals (Object o) Сравнивает этот экземпляр с указанным объектом и указывает, равны ли они. void finalize() Вызывается до того, как память объекта будет восстановлена ​​виртуальной машиной. конечный класс getClass() Возвращает уникальный экземпляр класса, который представляет этот класс объекта. int hashCode() Возвращает целочисленный хэш-код для этого объекта. final void notify() Вызывает поток, ожидающий этого монитора объекта (путем вызова одного из методов wait()), который должен быть разбужен. final void notifyAll() Вызывает все потоки, которые ждут на этом объекте монитор (путем вызова одного из методов wait()), которые будут разбужены. Строка toString() Возвращает строку, содержащую краткое, понятное для человека описание этого объекта. окончательный void wait (long millis, int nanos) Заставляет вызывающий поток ждать, пока другой поток не вызовет метод notify() или notifyAll() этого объекта или до истечения указанного таймаута. окончательное пустое ожидание (длинные миллисы) Заставляет вызывающий поток ждать, пока другой поток не вызовет метод notify() или notifyAll() этого объекта или до истечения указанного таймаута. final void wait() Заставляет вызывающий поток ждать, пока другой поток не вызовет метод notify() или notifyAll() этого объекта. Константы public static final int ORIENTATION_UNKNOWN С: API Level 3

Возврат из onOrientationChanged, когда ориентация устройства не может быть определена (обычно, когда устройство находится в плоском положении). См. Также

* onOrientationChanged(int)

Постоянное значение: -1 (0xffffffff) Общественные конструкторы public OrientationEventListener (контекстный контекст) С: API Level 3

Создает новый OrientationEventListener. параметры контекст для OrientationEventListener. public OrientationEventListener (контекстный контекст, int rate) С: API Level 3

Создает новый OrientationEventListener. параметры контекст для OrientationEventListener. скорость обработки событий датчика (см. также SensorManager). Используйте значение SENSOR_DELAY_NORMAL по умолчанию для простого определения изменения ориентации экрана. Общественные методы public boolean canDetectOrientation() С: API Level 3

public void disable() С: API Level 3

Отключает идентификатор OrientationEventListener. public void enable() С: API Level 3

Включает OrientationEventListener, чтобы он отслеживал датчик и вызывал onOrientationChanged (int), когда меняется ориентация устройства. public abstract void onOrientationChanged (int orientation) С: API Level 3

Вызывается, когда ориентация устройства изменилась. параметр ориентации находится в градусах от 0 до 359. Ориентация составляет 0 градусов, когда устройство ориентировано в своем естественном положении, 90 градусов, когда его левая сторона находится наверху, 180 градусов, когда она перевернута, и 270 градусов, когда ее правая сторона сверху. ORIENTATION_UNKNOWN возвращается, когда устройство близко к плоскости, и ориентация не может быть определена.