Saya telah mencoba untuk memahami sensor orientasi Android untuk sementara waktu. Saya pikir saya mengerti. Kemudian saya menyadari bahwa saya tidak melakukannya. Sekarang saya pikir (harapan) saya memiliki perasaan yang lebih baik untuk itu lagi tetapi saya masih belum 100%. Saya akan mencoba menjelaskan pemahaman saya yang tambal sulam tentang itu dan semoga orang-orang dapat mengoreksi saya jika saya salah dalam beberapa bagian atau mengisi kekosongan.
Saya membayangkan saya berdiri di 0 derajat bujur (garis bujur utama) dan 0 derajat lintang (ekuator). Lokasi ini sebenarnya berada di laut lepas pantai Afrika tapi tahan dengan saya. Saya memegang telepon saya di depan wajah saya sehingga bagian bawah telepon mengarah ke kaki saya; Saya menghadap Utara (melihat ke arah Greenwich) jadi oleh karena itu sisi kanan telepon mengarah ke Timur menuju Afrika. Dalam orientasi ini (dengan mengacu pada diagram di bawah), saya memiliki sumbu X mengarah ke Timur, sumbu Z mengarah ke Selatan dan sumbu Y mengarah ke langit.
Sekarang sensor di ponsel memungkinkan Anda untuk mengetahui orientasi (bukan lokasi) perangkat dalam situasi ini. Bagian ini selalu membuat saya bingung, mungkin karena saya ingin memahami bagaimana sesuatu bekerja sebelum saya menerima bahwa itu berhasil. Tampaknya ponsel ini mengetahui orientasinya menggunakan kombinasi dua teknik berbeda.
Sebelum saya membahasnya, bayangkan kembali berdiri di atas sebidang tanah imajiner pada garis lintang dan bujur 0 derajat berdiri ke arah yang disebutkan di atas. Bayangkan juga bahwa Anda ditutup matanya dan sepatu Anda dipasang di bundaran taman bermain. Jika seseorang mendorong Anda dari belakang, Anda akan jatuh ke depan (ke arah Utara) dan mengulurkan kedua tangan untuk mematahkan kejatuhan Anda. Demikian pula jika seseorang mendorong bahu kiri Anda, Anda akan jatuh ke tangan kanan. Telinga bagian dalam Anda memiliki "sensor gravitasi" (klip youtube) yang memungkinkan Anda mendeteksi jika Anda jatuh ke depan / belakang, atau jatuh ke kiri / kanan atau jatuh (atau ke atas !!). Oleh karena itu, manusia dapat mendeteksi penyelarasan dan rotasi di sekitar sumbu X dan Z yang sama dengan telepon.
Sekarang bayangkan seseorang sekarang memutar Anda 90 derajat di bundaran sehingga Anda sekarang menghadap ke Timur. Anda sedang diputar di sekitar sumbu Y. Sumbu ini berbeda karena kita tidak dapat mendeteksinya secara biologis. Kita tahu bahwa kita memiliki sudut dalam jumlah tertentu tetapi kita tidak tahu arah hubungannya dengan kutub Utara magnet planet. Sebagai gantinya kita perlu menggunakan alat eksternal ... kompas magnet. Ini memungkinkan kita untuk memastikan arah mana yang kita hadapi. Hal yang sama berlaku dengan telepon kita.
Sekarang ponsel ini juga memiliki akselerometer 3 sumbu. Saya tidak punyaSaya membayangkan bagaimana sebenarnya mereka bekerja tetapi cara saya memvisualisasikannya adalah membayangkan gravitasi sebagai 'hujan' yang konstan dan seragam jatuh dari langit dan membayangkan sumbu pada gambar di atas sebagai tabung yang dapat mendeteksi jumlah hujan yang mengalir. Saat telepon diangkat ke atas, semua hujan akan mengalir melalui 'tabung' Y. Jika telepon diputar secara bertahap sehingga layarnya menghadap ke langit, jumlah hujan yang mengalir melalui Y akan berkurang menjadi nol sedangkan volume melalui Z akan terus meningkat hingga jumlah maksimum hujan yang mengalir masuk. Demikian pula jika kita sekarang memiringkan ponsel ke sisinya, tabung X pada akhirnya akan mengumpulkan jumlah hujan maksimal. Oleh karena itu, tergantung pada orientasi ponsel dengan mengukur jumlah hujan yang mengalir melalui 3 tabung, Anda dapat menghitung orientasinya.
Ponsel ini juga memiliki kompas elektronik yang berperilaku seperti kompas biasa - "jarum virtual" -nya mengarah ke utara magnet. Android menggabungkan informasi dari dua sensor ini sehingga setiap kali a SensorEvent
dari TYPE_ORIENTATION
dihasilkan, values[3]
larik memiliki
nilai [0]: Azimuth - (kompas yang mengarah ke timur utara magnet)
[1]: Pitch, rotasi di sekitar sumbu x (adalah ponsel condong ke depan atau ke belakang)
nilai [2]: Roll, rotasi di sekitar sumbu y (apakah ponsel condong ke kiri atau kanan)
Jadi saya pikir (yaitu saya tidak tahu) alasan Android memberikan azimuth (arah kompas) daripada membaca akselerometer ketiga adalah karena arah kompas lebih berguna. Saya tidak yakin mengapa mereka menghentikan jenis sensor ini karena sekarang tampaknya Anda perlu mendaftarkan listener dengan sistem untuk SensorEvent
tipe s TYPE_MAGNETIC_FIELD
. value[]
Larik peristiwa perlu dimasukkan ke dalam SensorManger.getRotationMatrix(..)
metode untuk mendapatkan matriks rotasi (lihat di bawah) yang kemudian diteruskan ke dalam SensorManager.getOrientation(..)
metode. Adakah yang tahu mengapa tim Android tidak lagi digunakan Sensor.TYPE_ORIENTATION
? Apakah ini hal efisiensi? Itulah yang tersirat di salah satu komentar untuk pertanyaan serupa tetapi Anda masih perlu mendaftarkan jenis pendengar yang berbeda dipengembangan / sampel / Kompas / src / com / contoh / android / kompas / CompassActivity.java contoh.
Sekarang saya ingin berbicara tentang matriks rotasi. (Di sinilah saya paling tidak yakin) Jadi di atas kami memiliki tiga angka dari dokumentasi Android, kami akan menyebutnya A, B dan C.
A = Gambar metode SensorManger.getRotationMatrix (..) dan mewakili sistem koordinat Dunia
B = Sistem koordinat yang digunakan oleh SensorEvent API.
C = Angka metode SensorManager.getOrientation (..)
Jadi pemahaman saya adalah bahwa A mewakili "sistem koordinat dunia" yang saya anggap mengacu pada cara lokasi di planet ini diberikan sebagai pasangan (lintang, bujur) dengan opsional (ketinggian). X adalah koordinat "arah timur" , Y adalah koordinat "arah utara" . Z menunjuk ke langit dan melambangkan ketinggian.
Sistem koordinat telepon ditunjukkan pada gambar B adalah tetap. Sumbu Y-nya selalu menunjuk ke atas. Matriks rotasi terus dihitung oleh telepon dan memungkinkan pemetaan di antara keduanya. Jadi, apakah saya benar dalam berpikir bahwa matriks rotasi mengubah sistem koordinat B menjadi C? Jadi ketika Anda memanggil SensorManager.getOrientation(..)
metode, Anda menggunakan values[]
larik dengan nilai yang sesuai dengan gambar C.Ketika telepon mengarah ke langit, matriks rotasi adalah matriks identitas (matriks matematis yang setara dengan 1) yang berarti tidak diperlukan pemetaan karena perangkat sejajar dengan sistem koordinat dunia.
Baik. Saya pikir saya lebih baik berhenti sekarang. Seperti yang saya katakan sebelumnya, saya berharap orang akan memberi tahu saya di mana saya telah mengacaukan atau membantu orang (atau membingungkan orang lebih jauh!)