Я пытался на некоторое время окунуться в сенсоры ориентации Android. Я думал, что понял. Тогда я понял, что нет. Теперь я думаю (надеюсь), что у меня есть лучшее чувство для него снова, но я все еще не на 100%. Я попытаюсь объяснить свое неоднозначное понимание этого и, надеюсь, люди смогут исправить меня, если я ошибаюсь по частям или заполняю любые пробелы.Обзор ориентации телефона Android, включая компас
Я полагаю, что я стою на 0 градусов долготы (первичный меридиан) и 0 градусов широты (экватор). Это место действительно находится в море у берегов Африки, но несут меня. Я держу свой телефон перед моим лицом, так что нижняя часть телефона указывает на мои ноги; Я смотрю на Север (смотря на Гринвич), поэтому правая сторона телефона указывает на Восток в сторону Африки. В этой ориентации (со ссылкой на приведенную ниже диаграмму) у меня ось X направлена на восток, ось Z указывает на юг и точку оси Y на небо.
Теперь датчики на телефоне позволяют работать ориентацию (не местоположение) устройства в этой ситуации. Эта часть меня всегда путала, вероятно, потому, что я хотел понять, как что-то работало, прежде чем я согласился, что он просто работает. Похоже, что телефон разрабатывает свою ориентацию, используя комбинацию двух разных методов.
Прежде, чем я доберусь до этого, представьте, что вы стоите на этом мнимом участке земли при 0 градусах широты и долготы, стоящих в указанном выше направлении. Представьте себе, что вы с завязанными глазами и ваши ботинки закреплены на кольцевой развязке на детской площадке. Если кто-то запишет вас спиной, вы упадете вперед (к северу) и положите обе руки, чтобы сломать свое падение. Точно так же, если кто-то швыряет вас влево, вы упадете на правую руку. У вашего внутреннего уха есть «гравитационные датчики» (youtube clip), которые позволяют вам обнаруживать, что вы падаете вперед/назад или падаете влево/вправо или падаете вниз (или вверх!). Поэтому люди могут обнаруживать выравнивание и вращение вокруг тех же осей X и Z, что и телефон.
Теперь представьте, что кто-то теперь поворачивает вас на 90 градусов на кольцевой развязке, чтобы вы теперь обратились к Востоку. Вы вращаетесь вокруг оси Y. Эта ось различна, потому что мы не можем ее обнаружить биологически. Мы знаем, что мы наклонены на определенное количество, но мы не знаем направления по отношению к магнитному Северному полюсу планеты. Вместо этого нам нужно использовать внешний инструмент ... магнитный компас. Это позволяет нам определить, с каким направлением мы сталкиваемся. То же самое можно сказать и с нашим телефоном.
Теперь телефон также имеет 3-осный акселерометр. У меня есть идея, как они на самом деле работают, но то, как я представляю себе, - представить себе гравитацию как постоянный и равномерный «дождь», падающий с неба, и представить себе оси на рисунке выше как трубки, которые могут обнаружить количество дождя через. Когда телефон держится вертикально, весь дождь будет проходить через Y 'tube'. Если телефон постепенно поворачивается, поэтому его экран обращен к небу, количество дождя, протекающего через Y, будет уменьшаться до нуля, а громкость через Z будет постоянно увеличиваться до тех пор, пока не достигнет максимального количества дождя. Точно так же, если мы теперь опрокинем телефон на свою сторону, X-трубка в конечном итоге соберет максимальное количество дождя. Поэтому в зависимости от ориентации телефона, измеряя количество дождя, проходящего через 3 трубки, вы можете рассчитать ориентацию.
Телефон также имеет электронный компас, который ведет себя как обычный компас - его «виртуальная игла» указывает на магнитный север.Android объединяет информацию из этих двух датчиков таким образом, что всякий раз, когда SensorEvent
из TYPE_ORIENTATION
генерируются values[3]
массива имеет
значения [0]: азимут - (компас подшипник к востоку от магнитного севера)
значения [1]: Шаг, вращение вокруг ось х (это телефон наклоняясь вперед или назад)
значения [2]: ролл, вращение вокруг оси у (это телефон наклоняясь на левой или правой стороне)
Так что я думаю, что (то есть я не не знаю), причина, по которой Android дает азимут (компасный подшипник), а не чтение третьего акселерометра, заключается в том, что компасный подшипник является более полезным. Я не уверен, почему они устарели от такого типа датчиков, поскольку теперь вам нужно зарегистрировать слушателя с системой для SensorEvent
s типа TYPE_MAGNETIC_FIELD
. Массив события value[]
должен пройти по методу SensorManger.getRotationMatrix(..)
, чтобы получить матрицу вращения (см. Ниже), которая затем передается в метод SensorManager.getOrientation(..)
. Кто-нибудь знает, почему команда Android устарела Sensor.TYPE_ORIENTATION
? Это эффективность? Это то, что подразумевается в одном из комментариев к аналогичному question, но вам все равно нужно зарегистрировать другой тип слушателя в примере development/samples/Compass/src/com/example/android/compass/CompassActivity.java.
Я бы сейчас хотел бы говорить о матрице вращения. (Вот где я не уверен) Итак, у нас есть три цифры из документации Android, мы будем называть их A, B и C.
A = SensorManger.getRotationMatrix (..) метод фигура и представляет система координат в мире
B = Coordinate system used by the SensorEvent API.
C = SensorManager.getOrientation (..) метод фигура
Так я понимаю, что А представляет собой «мировую систему координат», который я полагаю, относится к тому, местоположения на планете даны как (широта, долгота) coupl e с опцией (высота). X - координата "easting", Y - координата "northing". Z указывает на небо и представляет собой высоту.
Система координат телефонов, показанная на рисунке B, фиксирована. Его ось Y всегда указывает верхнюю. Матрица вращения постоянно вычисляется по телефону и позволяет отображать между ними. Я правильно понимаю, что матрица вращения преобразует систему координат B в C? Поэтому, когда вы вызываете метод SensorManager.getOrientation(..)
, вы используете массив values[]
со значениями, которые соответствуют рисунку C. Когда телефон направлен на небо, матрица вращения является матрицей идентичности (матричный математический эквивалент 1), что означает, что отображение не требуется, поскольку устройство согласовано с мировой системой координат.
Хорошо. Кажется, мне лучше остановиться сейчас. Как я уже говорил, я надеюсь, что люди скажут мне, где я перепутался или помог людям
Мне очень понравился этот вопрос. Я не могу ответить, но мне это нравится. –
Тим, ты когда-нибудь получал ответ? Я тоже царапаю голову. Это один из самых плохо документированных API, которые я когда-либо видел. –
Не боюсь. Мне пришлось двигаться дальше. Когда-нибудь я вернусь к этому вопросу. – Tim