Bir süredir kafamı Android yönlendirme sensörlerinin etrafından dolaşmaya çalışıyorum. Anladığımı sanıyordum. Sonra yapmadığımı anladım. Şimdi düşünüyorum da (umarım) tekrar daha iyi hissettim ama yine de% 100 değilim. Bu konudaki düzensiz anlayışımı açıklamaya çalışacağım ve umarım, eğer bölümlerde yanılsam veya boşlukları doldurursam insanlar beni düzeltebilecekler.
0 derece boylamda (ana meridyen) ve 0 derece enlemde (ekvator) durduğumu hayal ediyorum. Bu konum aslında Afrika kıyılarının açıklarında denizde ama benimle birlikte. Telefonumu yüzümün önünde tutuyorum, böylece telefonun altı ayaklarıma işaret ediyor; Kuzeye bakıyorum (Greenwich'e bakıyorum) bu nedenle telefonun sağ tarafı Doğu, Afrika'yı gösteriyor. Bu oryantasyonda (aşağıdaki diyagrama göre) X ekseni Doğuya, Z ekseni Güneye ve Y ekseni gökyüzüne işaret ediyor.
Artık telefondaki sensörler, bu durumda cihazın yönünü (konumunu değil) belirlemenize izin veriyor. Bu kısım her zaman kafamı karıştırdı, çünkü muhtemelen bir şeyin sadece işe yaradığını kabul etmeden önce nasıl çalıştığını anlamak istediğim için. Görünüşe göre telefon yönünü iki farklı tekniğin bir kombinasyonunu kullanarak yapıyor.
Buna geçmeden önce, yukarıda bahsedilen yönde duran 0 derece enlem ve boylamdaki o hayali kara parçasının üzerinde durduğunuzu hayal edin. Ayrıca gözünüzün bağlı olduğunu ve ayakkabılarınızın bir oyun alanı döner kavşağına sabitlendiğini hayal edin. Biri sizi arkaya iterse, öne doğru (Kuzeye doğru) düşersiniz ve düşüşünüzü engellemek için iki elinizi de uzatırsınız. Benzer şekilde, birisi sizi sol omzuna sokarsa, sağ elinize düşersiniz. İç kulağınızda "yerçekimi sensörleri" (youtube klipsi) vardır ; bu, öne / arkaya mı düşüyor, sola / sağa mı düşüyor veya düşüyor (veya yukarı !!). Bu nedenle insanlar, telefonla aynı X ve Z eksenleri etrafında hizalama ve dönüşü algılayabilir.
Şimdi birisinin sizi şimdi Doğu'ya bakacak şekilde döner kavşakta 90 derece döndürdüğünü hayal edin. Y ekseni etrafında döndürülüyorsunuz. Bu eksen farklı çünkü biyolojik olarak tespit edemiyoruz. Açının belli bir miktarda olduğunu biliyoruz, ancak gezegenin manyetik Kuzey kutbuna göre yönü bilmiyoruz. Bunun yerine harici bir alet kullanmalıyız ... manyetik bir pusula. Bu, hangi yöne baktığımızı belirlememizi sağlar. Aynısı telefonumuz için de geçerlidir.
Artık telefonun 3 eksenli ivmeölçeri de var. Bende HAYIR vargerçekte nasıl çalıştıklarına dair bir fikriniz var ama benim görselleştirme şeklim, yerçekimini gökyüzünden düşen sabit ve tekdüze 'yağmur' olarak hayal etmek ve yukarıdaki şekildeki eksenleri, içinden geçen yağmur miktarını algılayabilen tüpler olarak hayal etmektir. Telefon dik tutulduğunda tüm yağmur Y 'tüpünden' akacaktır. Telefon, ekranı gökyüzüne bakacak şekilde kademeli olarak döndürülürse, Y'den geçen yağmur miktarı sıfıra düşerken, Z'den geçen hacim, maksimum yağmur miktarı akana kadar sürekli olarak artacaktır. Benzer şekilde, telefonu yan tarafına yatırırsak, X tüpü sonunda maksimum miktarda yağmuru toplayacaktır. Bu nedenle telefonun yönüne bağlı olarak 3 borudan akan yağmur miktarını ölçerek yönünü hesaplayabilirsiniz.
Telefon ayrıca normal bir pusula gibi davranan elektronik bir pusulaya sahiptir - "sanal iğnesi" manyetik kuzeyi gösterir. Android, bu iki sensörden gelen bilgileri birleştirir, böylece bir SensorEvent
tanesi TYPE_ORIENTATION
oluşturulduğunda values[3]
dizinin
değerleri [0] vardır: Azimut - (manyetik kuzeyin doğusunu gösteren pusula)
değerleri [1]: Pitch, x ekseni etrafında dönüş (telefon öne veya arkaya eğilerek)
değerleri [2]: Döndürme, y ekseni etrafında dönme (telefonun sol veya sağ tarafına eğilmesi)
Bu yüzden bence (yani bilmiyorum) Android'in üçüncü ivmeölçeri okumak yerine azimutu (pusula yönü) vermesinin nedeni pusula yönünün sadece daha kullanışlı olmasıdır. Onlar şimdi sensör bu tür kullanımdan kaldırıldı neden sizin için sistemli bir dinleyici kayıt gerekmez görünüyor emin değilim SensorEvent
Çeşidi s TYPE_MAGNETIC_FIELD
. Olayın value[]
dizisinin, daha sonra SensorManger.getRotationMatrix(..)
yönteme iletilecek bir rotasyon matrisi (aşağıya bakın) elde etmek için SensorManager.getOrientation(..)
yönteme aktarılması gerekir . Android ekibinin neden kullanımdan kaldırıldığını bilen var mı Sensor.TYPE_ORIENTATION
? Verimlilik meselesi mi? Benzer bir soruya yapılan yorumlardan birinde ima edilen şey budur, ancak yine de farklı türde bir dinleyici kaydetmeniz gerekir.geliştirme / örnekler / Compass / src / com / example / android / compass / CompassActivity.java örneği.
Şimdi rotasyon matrisinden bahsetmek istiyorum. (En çok emin olmadığım yer burası) Yani yukarıda Android belgelerinden üç rakam var, onlara A, B ve C diyeceğiz.
A = SensorManger.getRotationMatrix (..) yöntemi şekli ve Dünyanın koordinat sistemini temsil eder
B = SensorEvent API tarafından kullanılan koordinat sistemi.
C = SensorManager.getOrientation (..) yöntem şekli
Anladığım kadarıyla, benim anladığım kadarıyla, A, gezegendeki konumların isteğe bağlı (yükseklik) bir (enlem, boylam) çifti olarak verildiğini varsaydığım "dünyanın koordinat sistemini" temsil ediyor. X "doğuya giden " koordinat, Y "kuzeye giden" koordinattır. Z gökyüzünü gösterir ve rakımı temsil eder.
Telefonların koordinat sistemi şekil B'de sabittir. Y ekseni her zaman üste işaret eder. Rotasyon matrisi telefon tarafından sürekli olarak hesaplanıyor ve ikisi arasında haritalamaya izin veriyor. Öyleyse, rotasyon matrisinin B'nin koordinat sistemini C'ye dönüştürdüğünü düşünmekte haklı mıyım? Dolayısıyla, SensorManager.getOrientation(..)
yöntemi çağırdığınızda values[]
, şekil C'ye karşılık gelen değerlere sahip diziyi kullanırsınız.Telefon gökyüzüne doğrultulduğunda, döndürme matrisi kimlik matrisidir (matris matematiksel olarak 1'in eşdeğeri), yani cihaz hizalandığında eşleştirme gerekli değildir. dünyanın koordinat sistemi ile.
Tamam. Sanırım şimdi dursam iyi olur. Daha önce de söylediğim gibi, umarım insanlar bana nerede batırdığımı veya insanlara yardım ettiğimi söyler (veya insanların kafaları daha da karışır!)