Я деякий час намагався обвести голову навколо датчиків орієнтації на Android. Я думав, що це зрозумів. Тоді я зрозумів, що ні. Зараз я думаю (сподіваюсь), що в мене знову це відчувається краще, але я все ще не на 100%. Я спробую пояснити своє нечітке розуміння цього, і, сподіваюся, люди зможуть мене виправити, якщо я помиляюся в частинах або заповнити будь-які пробіли.
Я уявляю, що стою на 0 градусах довготи (меридіан) і 0 градусів широти (екватор). Це місце насправді знаходиться в морі біля узбережжя Африки, але несете мене. Я тримаю телефон перед обличчям, щоб нижня частина телефону вказувала на мої ноги; Я дивлюся на північ (дивлячись на Грінвіч), тому права рука телефону вказує на схід до Африки. У цій орієнтації (з посиланням на діаграму нижче) у мене вісь X спрямована на схід, вісь Z спрямована на південь, а вісь Y у небо.
Тепер датчики на телефоні дозволяють визначити орієнтацію (а не розташування) пристрою в цій ситуації. Ця частина мене завжди бентежила, напевно, тому, що я хотів зрозуміти, як щось працює, перш ніж я прийняв, що це просто працює. Здається, телефон розробив свою орієнтацію, використовуючи комбінацію двох різних технік.
Перш ніж дійти до цього, уявіть, що ви стоїте на тому уявному шматку землі на 0 градусах широти та довготи, що стоїть у напрямку, зазначеному вище. Уявіть також, що у вас зав'язані очі, і ваші черевики закріплені на об'їзді дитячого майданчика. Якщо хтось заштовхує вас спиною, ви впадете вперед (у бік Півночі) і покладете обидві руки, щоб зламати падіння. Аналогічно, якщо хтось поштовхне вам ліве плече, ви перепадете на праву руку. У вашому внутрішньому вусі є "гравітаційні датчики" (кліп YouTube), які дозволяють виявити, чи падаєте ви вперед / назад, або падаєте вліво / вправо або падаєте вниз (або вгору !!). Тому людина може виявити вирівнювання та обертання навколо тих же осей X і Z, що і телефон.
А тепер уявіть, що хтось зараз обертає вас на 90 градусів на круговому переході, так що ви зараз стикаєтеся зі Сходом. Ви обертаєтесь навколо осі Y. Ця вісь відрізняється тим, що ми її не можемо виявити біологічно. Ми знаємо, що ми нахилені на деяку кількість, але не знаємо напрям щодо магнітного північного полюса планети. Натомість нам потрібно використовувати зовнішній інструмент ... магнітний компас. Це дозволяє нам з’ясувати, в якому напрямку ми стикаємося. Те саме стосується нашого телефону.
Тепер у телефону також є 3-осевий акселерометр. У мене НІІдея, як вони насправді працюють, але те, як я це візуалізую, - це уявити собі гравітацію як постійний і рівномірний «дощ», що падає з неба, і уявити осі на малюнку вище як трубки, які можуть виявити кількість дощу, що протікає крізь. Коли телефон тримається вертикально, весь дощ потече через Y-трубку. Якщо телефон поступово повертати таким чином, що його екран стикається з небом, кількість дощу, що протікає через Y, зменшиться до нуля, тоді як гучність через Z буде постійно збільшуватися, поки не пройде максимальна кількість дощу. Аналогічно, якщо ми зараз перекинемо телефон на бік, трубка X з часом збирає максимальну кількість дощу. Тому залежно від орієнтації телефону, вимірюючи кількість дощу, що протікає через 3 трубки, можна обчислити орієнтацію.
У телефоні також є електронний компас, який веде себе як звичайний компас - його "віртуальна голка" вказує на магнітний північ. Android об'єднує інформація з цих двох датчиків таким чином , що кожного разу , коли SensorEvent
з TYPE_ORIENTATION
генеруються values[3]
масив має
значення [0]: Азимут - (компас підшипник до схід від магнітної півночі)
значення [1]: Крок, обертання навколо осі х (це телефон Нахилившись вперед або назад)
значення [2]: котиться, обертається навколо осі y (телефон перекидається на його ліву чи праву сторону)
Тому я думаю (тобто я не знаю), чому причина Android дає азимут (підшипник компаса), а не читання третього акселерометра - це те, що підшипник компаса просто корисніший. Я не впевнений, чому вони втратили датчик такого типу, оскільки тепер, здається, вам потрібно зареєструвати слухача в системі для SensorEvent
s типу TYPE_MAGNETIC_FIELD
. value[]
Масив події потрібно перенести в SensorManger.getRotationMatrix(..)
метод, щоб отримати матрицю обертання (див. Нижче), яка потім передається в SensorManager.getOrientation(..)
метод. Хтось знає, чому застаріла команда Android Sensor.TYPE_ORIENTATION
? Це річ ефективності? Це те, що мається на увазі в одному з коментарів до подібного питання, але вам все одно потрібно зареєструвати іншого типу слухача врозробка / зразки / Compass / src / com / example / android / compass / CompassActivity.java приклад.
Зараз я хотів би поговорити про матрицю обертання. (Це я там, де я не впевнений) Отже, вище, ми маємо три фігури з документації на Android, ми їх назвемо A, B і C.
A = SensorManger.getRotationMatrix (..) рисунок методу та являє собою систему координат світу
B = Координатна система, що використовується API SensorEvent.
C = рисунок методу SensorManager.getOrientation (..)
Отже, я розумію, що А являє собою "систему координат у світі", яка, як я вважаю, відноситься до того, як місця на планеті даються як пара (широта, довгота) з необов'язковою (висотою). X - координата "схід" , Y - координата "північного" . Z вказує на небо і представляє висоту.
Система координат телефонів показана на малюнку В. Його вісь Y завжди вказує на верх. Матриця обертання постійно обчислюється телефоном і дозволяє проводити картування між ними. Тож я маю рацію, думаючи, що матриця обертання перетворює систему координат від B до C? Отже, коли ви викликаєте SensorManager.getOrientation(..)
метод, ви використовуєте values[]
масив зі значеннями, які відповідають фігурі C. Коли телефон вказується на небо, матриця обертання - це матриця ідентичності (матричний математичний еквівалент 1), що означає, що не потрібно відображати карти, оскільки пристрій вирівнюється зі світовою системою координат.
Гаразд. Я думаю, що зараз краще зупинитися. Як я вже говорив раніше, я сподіваюся, що люди підкажуть мені, де я плутав чи допомагав людям (або ще більше плутав людей!)