Обзор ориентации телефона Android, включая компас

Я уже некоторое время пытался разобраться в датчиках ориентации Android. Я думал, что понял это. Потом я понял, что нет. Теперь я думаю (надеюсь), что снова чувствую себя лучше, но я все еще не на 100%. Я попытаюсь объяснить свое неоднозначное понимание этого, и, надеюсь, люди смогут исправить меня, если я ошибаюсь в некоторых частях или заполню какие-либо пробелы.

Я полагаю, что стою на 0 градусах долготы (нулевой меридиан) и 0 градусах широта (экватор). Это место на самом деле находится в море у побережья Африки, но терпите меня. Я держу телефон перед лицом так, чтобы его нижняя часть была направлена ​​к моим ногам; Я смотрю на север (смотрю в сторону Гринвича), поэтому правая сторона телефона указывает на восток в сторону Африки. В этой ориентации (со ссылкой на диаграмму ниже) у меня ось X указывает на восток, ось Z указывает на юг, а ось Y указывает на небо.

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

Прежде чем я перейду к этому, представьте, что снова стою на этом воображаемом участке земли на 0 градусов широты и долготы в указанном выше направлении. Представьте также, что вам завязаны глаза, и ваша обувь прикреплена к круговой площадке детской площадки. Если кто-то толкнет вас в спину, вы упадете вперед (на север) и вытянете обе руки, чтобы остановить падение. Точно так же, если кто-то толкнет вас в левое плечо, вы упадете на правую руку. Ваше внутреннее ухо "

А теперь представьте, что кто-то теперь разворачивает вас на круговом перекрестке на 90 градусов, так что вы теперь смотрите на восток. Вас вращают вокруг оси Y. Эта ось отличается, потому что мы не можем обнаружить ее биологически. Мы знаем, что находимся под определенным углом, но мы не знаем направления относительно северного магнитного полюса планеты.

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

Теперь в телефоне также есть 3-осевой акселерометр. У меня нет НЕТ представления о том, как они на самом деле работают, но я представляю себе это так: я представляю гравитацию как постоянный и равномерный «дождь», падающий с неба, и представляю оси на рисунке выше в виде трубок, которые могут обнаруживать количество проливного дождя. Когда телефон находится в вертикальном положении, весь дождь будет течь через Y-образную трубку. Если телефон постепенно поворачивать так, чтобы его экран был обращен к небу, количество дождя, протекающего через Y, уменьшится до нуля, а громкость через Z будет постоянно увеличиваться до тех пор, пока не пройдет максимальное количество дождя. Точно так же, если мы теперь наклоним телефон на бок, X-трубка в конечном итоге соберет максимальное количество дождя. Следовательно, в зависимости от ориентации телефона, измерив количество дождя, протекающего через 3 трубки, вы можете рассчитать ориентацию.

В телефоне также есть электронный компас, который ведет себя как обычный компас - его «виртуальная стрелка» указывает на магнитный север. Android объединяет информацию от этих двух датчиков, так что всякий раз, когда создается SensorEvent of TYPE_ORIENTATION , массив values ​​[3] имеет

В телефоне также есть электронный компас, который ведет себя как обычный компас - его «виртуальная стрелка» указывает на магнитный север. Android объединяет информацию от этих двух датчиков, так что всякий раз, когда создается SensorEvent of TYPE_ORIENTATION , массив values ​​[3] имеет

В телефоне также есть электронный компас, который ведет себя как обычный компас - его «виртуальная стрелка» указывает на магнитный север. Android объединяет информацию от этих двух датчиков, так что всякий раз, когда создается SensorEvent of TYPE_ORIENTATION , массив values ​​[3] имеет
значения [0]: Азимут - (пеленг компаса к востоку от магнитного севера)
значения [1]: шаг, вращение вокруг оси x (наклоняется ли телефон вперед или назад)
values ​​[2]: Roll, вращение вокруг оси Y (телефон наклоняется влево или вправо)

Так что я думаю (т.е. не знаю), почему Android дает азимут (направление по компасу), а чем показания третьего акселерометра, так это то, что пеленг компаса просто более полезен. Я не уверен, почему они не рекомендуют этот тип датчика, так как теперь кажется, что вам нужно зарегистрировать в системе слушателя для SensorEvent типа TYPE_MAGNETIC_FIELD . Массив события value [] необходимо передать в метод SensorManger.getRotationMatrix (..) , чтобы получить матрицу вращения (см. Ниже), которая затем передается в SensorManager. getOrientation (..) метод. Кто-нибудь знает, почему команда Android устарела Sensor.TYPE_ORIENTATION ? Это вопрос эффективности? Это то, что подразумевается в одном из комментариев к аналогичному вопросу , но вам все равно необходимо зарегистрировать другой тип слушателя в development / samples / Compass / src / com / example / android / compass / CompassActivity.java пример.

Теперь я хотел бы поговорить о матрице вращения. (Вот где я не уверен) Итак, выше у нас есть три фигуры из документации Android, мы назовем их A, B и C.

A = SensorManger.getRotationMatrix (..) рисунок метода и представляет мировую систему координат

B = Система координат, используемая API SensorEvent.

C = SensorManager.getOrientation (..) method figure

Итак, я понимаю, что A представляет «мировую систему координат», которая, как я полагаю, относится к способу расположения на планете даны как пара (широта, долгота) с необязательной (высота). X - координата "восточного направления" , Y - координата "северного положения" . Z указывает на небо и представляет высоту.

Телефонная система координат, показанная на рисунке B, является фиксированной. Его ось Y всегда указывает на вершину. Матрица вращения постоянно вычисляется телефоном и позволяет отображать между ними. Итак, правильно ли я думаю, что матрица вращения преобразует систему координат B в C? Поэтому, когда вы вызываете метод SensorManager.getOrientation (..) , вы используете массив values ​​[] со значениями, соответствующими рисунку C. Когда телефон направлен в небо, матрица вращения представляет собой единичную матрицу (матричный математический эквивалент 1), что означает, что отображение не требуется, поскольку устройство выровнено с мировой системой координат.

Хорошо. Думаю, мне лучше остановиться. Как я уже говорил, я надеюсь, что люди расскажут мне, где я напутал или помог людям (или запутал людей еще больше!)

106
задан Community 23 May 2017 в 11:47
поделиться