SORU
27 Ocak 2011, PERŞEMBE


Android pusula gibi yönünü genel bakış telefon

Bir süre Android oryantasyon sensörleri başımı almak için çalışıyorum. Bunu anladığımı sanmıştım. O halde olmadığımı fark ettim. Şimdi (umarım) daha iyi hissediyorum ama hala 0 değilim sanırım. Deneyin ve benim yamalı bu anlayış açıklayacağım ve eğer insanlar yerlerinde yanılıyorsam beni düzeltin ya da herhangi bir boşlukları doldurmak için mümkün olur umarım.

0 derece boylam (başlangıç meridyeni) ve 0 derece enlem (Ekvator) yanında olduğumu hayal ediyorum. Bu konum aslında Afrika açıklarında denize ama benimle ayı. Bende telefonumu önünde yüzümü o alt telefonunu puan ayaklarım; ben Kuzeye bakan (Greenwich doğru bakarak) bu yüzden bu yüzden sağ tarafta telefonun puan Doğuya doğru Afrika. Bu yönde (aşağıdaki şemaya referans) X ekseni Doğu, Z ekseni işaret güneyi işaret ve Y ekseni gökyüzüne işaret.

Şimdi telefondaki algılayıcılar oryantasyon (yer) bu durumda Cihazın çalışması için izin verir. Bu kısmı her zaman bir şey işe yaradı sadece o kabul etmeden önce, nasıl çalıştığını anlamak istedim çünkü bana, muhtemelen kafasını karıştırdı. Telefonun yönünü iki farklı teknikleri bir arada kullanarak işe yarar gibi görünüyor.

Ona gelmeden önce, yönü, yukarıda bahsi geçen arka 0 derece enlemde arazi resmine bir parça üzerinde duran ve boylam yanında olduğunu hayal et. Gözleri bağlı ve ayakkabılarını Bahçesi dolambaçlı bir sabit olduğunu da düşünün. Eğer birisi seni sırtından itti eğer ileriye doğru (Kuzeye doğru) güz ve iki elini de senin düşüşünü kırmak için söndürüldü. Eğer biri, kaşla göz arasında benzer şekilde sağ elinde aşık edeceksin omuz bıraktın. İç kulak "yerçekimi sensörleri" eğer ileri/geri düşen, ya da sol/sağ düşen veya düşme varsa algılamak için izin (youtube clip) (ya!). Bu nedenle insanlar uyum tespit ve telefonu aynı X ve Z eksenlerinde dönme yapabilir.

Şimdi düşünebiliyor musun, şimdi Doğuya bakacak şekilde dolambaçlı üzerinde 90 derece döner. Y ekseni etrafında döndürülmüş. Bu eksen biyolojik olarak tespit edemiyoruz, çünkü farklı. Belirli bir miktar açılı biliyoruz ama gezegenin manyetik Kuzey Kutbu ile ilgili yönü bilmiyoruz. Bunun yerine harici bir araç... manyetik bir pusula kullanmak için ihtiyacımız var. Bu bizim karşı karşıya olduğumuz tespit etmek için izin verir. Aynı bizim telefon için de geçerli.

Şimdi telefonu da 3-eksen ivme ölçer var. VarHAYIRfikir nasıl aslında iş ama ben böyle hayal olduğu için hayal yerçekimi gibi sabit ve tekdüze 'yağmur' gökyüzünü düşmesin ve hayal eksenlerde yukarıdaki şekil olarak tüpleri algılayabilir miktarda yağmur akan. Telefon yağmur Y akacağını tüm dik tutulduğunda ''. tüp Eğer telefon yavaş yavaş döndürülmüş yani ekran yüzleri gökyüzü miktarda yağmur akan Y, azaltmak için ise sıfır ses ile Z sürekli artış kadar maksimum miktarda yağmur olup akan. Biz şimdi onun yüzüne telefonu ipucu benzer şekilde, eğer X tüpün sonunda yağmur maksimum miktarda toplamak olacaktır. Bu nedenle yağmur miktarı 3 tüpler akan ölçerek telefonun yönüne göre yönünü hesaplayabilirsiniz.

Telefon ayrıca "sanal iğne" manyetik kuzeyi gösterir. normal bir pusula gibi davranan bir elektronik pusula var Android TYPE_ORIENTATION SensorEvent üretilen her values[3] dizi vardır, böylece bu iki sensörlerinden gelen bilgileri birleştirir
değerleri[0]: Azimut - (manyetik Kuzey pusula rulman Doğu)
değerleri[1]: x-ekseni telefon ileri veya geri eğilerek (). etrafında dönme Pitch ^br> değerleri[2]: y-eksen telefonun sol veya sağ yan üzerine eğilerek (). etrafında dönme Roll

Nedeni ise Android üçüncü ivme okuma pusula rulman sadece daha yararlı olması yerine Azimut (pusula kerteriz) verir (yani ben bilmiyorum) bu yüzden bence. SensorEvents sistemi ile bir dinleyici kaydetmeniz gerekir gibi görünüyor şimdi sensör, bu tip 5* *tür onlar kaldırılmış neden emin değilim. Olay value[] dizi SensorManger.getRotationMatrix(..) yöntem içine bepassed sonra SensorManager.getOrientation(..) yönteme geçirilen bir rotasyon matrisi (aşağıya bakınız) almak gerekiyor. Herkes Android ekibi Sensor.TYPE_ORIENTATION onaylanmadı neden biliyor mu? Verimlilik bir şey mi? question benzer bir yorum bir ima ama hala development/samples/Compass/src/com/example/android/compass/CompassActivity.java örnekte dinleyici farklı türde bir kayıt gerekiyor.

Şimdi rotasyon matrisi hakkında konuşmak istiyorum. (Bu benim en) emin değildir Android belgelerine üç rakam var yukarıda, onları A, B ve C diyelim

A = SensorManger.(..) getRotationMatrix yöntemi şekil ve Dünyanın koordinat sistemi temsil eder

B = Coordinate system used by the SensorEvent API.

C= SensorManager.getOrientation(..) yöntemi şekil

Yani benim anladığım Bir temsil "dünya koordinat sistemi" sanırım ifade eder şekilde yerlerde gezegen verilir (enlem, boylam) çift ile isteğe bağlı (yükseklik). X "northing" koordinat Y "easting" koordinat. Z gökyüzünü işaret ve yükseklik temsil eder.

Koordinat sistemi şekil B olarak gösterilir telefonları sabittir. Y ekseni her zaman üst noktalara çıktı. Rotasyon matrisi sürekli telefonla hesaplanır ve bu ikisi arasındaki eşleme sağlar. Yani döndürme matris dönüşümleri doğru düşünme C B koordinat sistemi mıyım? SensorManager.getOrientation(..) yöntemini çağırdığınızda şekil C. karşılık gelen değerler values[] dizi kullandın. Telefonu gökyüzüne işaret olduğunda rotasyon matrisi hiçbir eşleştirme cihazı dünyanın koordinat sistemi ile uyumlu olarak gerekli olduğu anlamına gelir kimlik matrisi (1 matris matematiksel eşdeğer).

Tamam. Ben en iyisi biraz ara ver bence. İnsanlar berbat ettim nerede olduğunu söyler umarım daha önce söylediğim ya da insanlar (veya kafası karışık insanlar bile daha fazla!) yardım etmiş gibi

CEVAP
24 Temmuz 2011, Pazar


One Screen Turn Deserves Another makale kontrol etmek isteyebilirsiniz. Rotasyon matrisi ihtiyacınız açıklıyor.

Özetle, telefonun sensörlerini her zaman aynı cihaz döndürülür bile koordinat sistemi kullanın.

Tek bir yönelim için kilitli uygulamalar, ekran cihazı döndürdüğünüzde sistem değişiklikleri koordine. Cihaz varsayılan görünüm modu döndürülmüş böylece, sensör sistemi artık ekran koordinat sistemi ile aynı koordinatı. Bu durumda rotasyon matrisi C (B hep sabit kalır) dönüştürmek için kullanılır.

İşte nasıl kullanılabileceğini göstermek için bir kod parçası.

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// Register this class as a listener for the accelerometer sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
// ...and the orientation sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                    SensorManager.SENSOR_DELAY_NORMAL);

//...
// The following code inside a class implementing a SensorEventListener
// ...

float[] inR = new float[16];
float[] I = new float[16];
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] orientVals = new float[3];

double azimuth = 0;
double pitch = 0;
double roll = 0;

public void onSensorChanged(SensorEvent sensorEvent) {
    // If the sensor data is unreliable return
    if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        return;

    // Gets the value of the sensor that has been changed
    switch (sensorEvent.sensor.getType()) {  
        case Sensor.TYPE_ACCELEROMETER:
            gravity = sensorEvent.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomag = sensorEvent.values.clone();
            break;
    }

    // If gravity and geomag have values then find rotation matrix
    if (gravity != null && geomag != null) {

        // checks that the rotation matrix is found
        boolean success = SensorManager.getRotationMatrix(inR, I,
                                                          gravity, geomag);
        if (success) {
            SensorManager.getOrientation(inR, orientVals);
            azimuth = Math.toDegrees(orientVals[0]);
            pitch = Math.toDegrees(orientVals[1]);
            roll = Math.toDegrees(orientVals[2]);
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chilla Frilla™

    Chilla Frill

    7 Aralık 2006
  • Videogamerz | Call of Duty

    Videogamerz

    5 NİSAN 2012
  • Vsauce

    Vsauce

    30 Temmuz 2007