Получить направление движения устройства без GPS

С помощью какого датчика я могу обнаружить, когда устройство движется в направлении в абсолютной координате (например, движется к +x или -x).

Мне нужны точные данные, поэтому я не могу использовать GPS.

Полная задача состоит в том, чтобы рисовать в краске (на компьютере) с датчиками устройства Android, и эта часть задачи мне неизвестна.


person Arash    schedule 25.11.2014    source источник
comment
Я предлагаю для этого гироскопическую мышь. Все другие решения, которые я могу придумать, были бы хуже и сложнее в реализации.   -  person Ali    schedule 26.11.2014
comment
@Ali спасибо, но это в iphone, вы тоже предлагаете первую часть объяснений Эдварда Фалька для моего выбора (в Android)?   -  person Arash    schedule 26.11.2014
comment
Гироскопическая мышь состоит из 3 строк кода и не зависит от устройства. Пожалуйста, простите меня за то, что я не искал соответствующий Android API. Я предлагаю гироскопическую мышь, предполагая, что я правильно понял вашу реальную цель (Полная задача состоит в том, чтобы нарисовать рисунок (на компьютере) с помощью устройства Android).   -  person Ali    schedule 26.11.2014
comment
Так где же эти 3 строчки кода?   -  person Arash    schedule 26.11.2014
comment
Прочитайте ответ, который я связал; посмотрите видео, которое я упоминаю в своем ответе. Если у вас остались вопросы, задайте новый и более конкретный вопрос.   -  person Ali    schedule 26.11.2014


Ответы (2)


Я немного смущен тем, что вы спрашиваете. Вы хотите положить устройство в карман и ходить, и делать заговор везде, где вы ходили? Или вы хотите помахать устройством в руке, как 3D-мышью, для рисования?

Что касается последнего, см. Предложение Али выше. Если вы хотите заняться отслеживанием движения, вот что я могу вам сказать:

Вы можете легко использовать акселерометр (или гравитационный, если он есть) и магнитометр в сочетании с SensorManager.getRotationMatrix(), чтобы узнать, в каком направлении обращено устройство.

На самом деле датчик ВРАЩЕНИЯ делает все это за вас. Вам просто нужно достаточно математики, чтобы преобразовать кватернион в матрицу преобразования; это довольно легко.

(Если вы пытаетесь реализовать гироскопическую мышь, вы можете не читать здесь.)

Затем вы можете использовать датчик линейного ускорения, чтобы определить направление движения устройства. Это будет что-то вроде инерциальной навигационной системы для бедняков. Но это предполагает, что устройство неподвижно, когда вы запускаете приложение, и что датчики действительно достаточно точны, чтобы делать то, что вы хотите.

Ускорение даст вам вектор в координатах устройства. Умножьте этот вектор на матрицу, которую вы получили от датчика ROTATION или SensorManager.getRotationMatrix(), чтобы получить вектор ускорения в мировых координатах. Затем интегрируйте этот вектор с течением времени, чтобы получить вектор скорости, а затем интегрируйте этот вектор с течением времени, чтобы получить расстояние и направление перемещения с момента запуска приложения.

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

Честно говоря, решить эту проблему очень и очень сложно. Там, вероятно, есть докторская степень или, по крайней мере, пара статей для вас, если вы решите это. Выполните поиск по термину «внутренняя навигация», чтобы получить дополнительные ссылки.

Но имейте в виду, что без какой-либо службы определения местоположения (сети или GPS) невозможно быть уверенным, в каком направлении движется устройство или где оно находится.

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


Серьезно, если вы не говорите здесь об очень малых расстояниях, GPS — ваш лучший выбор.

person Edward Falk    schedule 26.11.2014
comment
О, еще один момент: есть разница между истинным севером и магнитным севером. Вам понадобятся геомагнитные координаты, чтобы знать, насколько нужно скорректировать курс, чтобы компенсировать магнитное отклонение. Я считаю, что для этого есть класс Android. - person Edward Falk; 26.11.2014
comment
В этом случае вы, вероятно, захотите получить датчик ВРАЩЕНИЯ и преобразовать кватернион в матрицу преобразования. Это довольно легко сделать; просто погуглите. - person Edward Falk; 26.11.2014
comment
Вы имеете в виду датчик ОРИЕНТАЦИИ? Я буду искать в Google и надеюсь найти, если вы знаете какой-либо учебник или источник, пожалуйста, дайте ссылку, спасибо - person Arash; 26.11.2014
comment
Датчик ORIENTATOION устарел по уважительным причинам. Он разваливается (дегенеративные состояния), когда его держат близко к вертикали. Лучше всего использовать датчик ВРАЩЕНИЯ, который возвращает кватернион. Довольно легко преобразовать кватернион в матрицу преобразования 3x3. - person Edward Falk; 29.11.2014

Начиная с уровня Android API 24, существует датчик с именем TYPE_POSE_6DOF. На телефонах, которые поддерживают это, он будет использовать датчики и отслеживание камеры, чтобы обеспечить как относительное, так и абсолютное вращение и положение в трехмерном пространстве. https://developer.android.com/reference/android/hardware/Sensor#TYPE_POSE_6DOF https://developer.android.com/reference/android/hardware/SensorEvent#values

Другим вариантом может быть использование ARCore, который предоставит аналогичные значения для позы камеры. https://developers.google.com/ar/reference/java/arcore/reference/com/google/ar/core/Pose

Наконец, в этом видео представлен отличный обзор сенсоров Android (до ARCore). В частности, раздел около 23:23 объясняет, почему выполнение двойного интеграла силы акселерометра не дает полезного представления положения. https://www.youtube.com/watch?v=C7JQ7Rpwn2k

(Если кому-то интересно, я только что попытался выполнить двойной интеграл акселерометров для проекта, над которым работал, но я продолжал получать ненулевую скорость, когда устройство возвращалось в состояние покоя, что вызывало значительный дрейф значения положения, даже в течение 1 секунды.)

person Matt    schedule 29.01.2019