android - कंपास सहित एंड्रॉइड फोन अभिविन्यास सिंहावलोकन




orientation device-orientation (3)

मैं थोड़ी देर के लिए एंड्रॉइड ओरिएंटेशन सेंसर के आसपास अपना सिर लेने की कोशिश कर रहा हूं। मैंने सोचा कि मैं इसे समझ गया। तब मुझे एहसास हुआ कि मैंने नहीं किया। अब मुझे लगता है (उम्मीद है) मुझे इसके लिए फिर से बेहतर महसूस हो रहा है लेकिन मैं अभी भी 100% नहीं हूं। मैं इसकी अपनी समझदार समझ की कोशिश करूंगा और उम्मीद करूँगा और उम्मीद है कि अगर मैं भागों में गलत हूं या किसी भी रिक्त स्थान को भरता हूं तो लोग मुझे सही करने में सक्षम होंगे।

मुझे कल्पना है कि मैं 0 डिग्री रेखांश (प्राइम मेरिडियन) और 0 डिग्री अक्षांश (भूमध्य रेखा) पर खड़ा हूं। यह स्थान वास्तव में अफ्रीका के तट से समुद्र में है लेकिन मेरे साथ भालू है। मैं अपने फोन को अपने चेहरे के सामने रखता हूं ताकि फोन के नीचे मेरे पैरों को इंगित किया जा सके; मुझे उत्तर का सामना करना पड़ रहा है (ग्रीनविच की ओर देख रहे हैं) इसलिए फोन के दाएं हाथ की तरफ पूर्व की ओर अफ्रीका की ओर इशारा करते हैं। इस अभिविन्यास में (नीचे दिए गए आरेख के संदर्भ में) मेरे पास एक्स-अक्ष इंगित करने वाला पूर्व है, ज़ेड-अक्ष आकाश को दक्षिण और वाई-अक्ष बिंदु इंगित कर रहा है।

अब फोन पर सेंसर आपको इस स्थिति में डिवाइस के अभिविन्यास (स्थान नहीं) को काम करने की अनुमति देता है। इस भाग ने मुझे हमेशा भ्रमित कर दिया है, शायद इसलिए कि मैं समझना चाहता था कि कुछ काम करने से पहले मैंने यह स्वीकार किया कि यह सिर्फ काम करता है। ऐसा लगता है कि फोन दो अलग-अलग तकनीकों के संयोजन का उपयोग करके अपना अभिविन्यास तैयार करता है।

इससे पहले कि, मैं ऊपर वर्णित दिशा में 0 डिग्री अक्षांश और देशांतर पर खड़े भूमि के उस काल्पनिक टुकड़े पर खड़े होने की कल्पना करें। कल्पना कीजिए कि आप blindfolded हैं और आपके जूते एक खेल के मैदान चौराहे के लिए तय कर रहे हैं। अगर कोई आपको पीठ में फेंक देता है तो आप आगे बढ़ेंगे (उत्तर की तरफ) और अपने हाथों को तोड़ने के लिए दोनों हाथों को बाहर रख दें। इसी प्रकार यदि कोई आपको कंधे छोड़ देता है तो आप अपने दाहिने हाथ पर गिर जाएंगे। आपके आंतरिक कान में "गुरुत्वाकर्षण सेंसर" (यूट्यूब क्लिप) है जो आपको यह पता लगाने की अनुमति देता है कि क्या आप आगे / पीछे गिर रहे हैं, या बाएं / दाएं गिर रहे हैं या गिर रहे हैं (या ऊपर !!)। इसलिए मनुष्य एक ही एक्स और जेड अक्ष के चारों ओर संरेखण और घूर्णन का पता लगा सकते हैं।

अब कल्पना करें कि किसी ने अब चौराहे पर आपको 9 0 डिग्री घुमाया है ताकि आप अब पूर्व का सामना कर रहे हों। आप वाई अक्ष के चारों ओर घुमाए जा रहे हैं। यह धुरी अलग है क्योंकि हम इसे जैविक रूप से नहीं पहचान सकते हैं। हम जानते हैं कि हम एक निश्चित राशि से गुजर रहे हैं लेकिन हम ग्रह के चुंबकीय उत्तरी ध्रुव के संबंध में दिशा को नहीं जानते हैं। इसके बजाय हमें बाहरी उपकरण ... एक चुंबकीय कंपास का उपयोग करने की आवश्यकता है। यह हमें यह पता लगाने की अनुमति देता है कि हम किस दिशा का सामना कर रहे हैं। हमारे फोन के साथ भी यही सच है।

अब फोन में 3-अक्ष एक्सेलेरोमीटर भी है। मुझे नहीं पता कि वे वास्तव में कैसे काम करते हैं, लेकिन जिस तरह से मैं इसे कल्पना करता हूं वह गुरुत्वाकर्षण को आकाश से गिरने के लिए निरंतर और समान 'वर्षा' के रूप में कल्पना करना है और उपरोक्त आकृति में अक्षों की कल्पना करने के लिए ट्यूबों के रूप में बहती है जो बारिश की मात्रा का पता लगा सकती है। जब फोन सीधे हो जाता है तो सभी बारिश वाई 'ट्यूब' के माध्यम से बहती है। यदि फोन धीरे-धीरे घूमता है तो इसकी स्क्रीन आसमान का सामना करती है, वाई के माध्यम से बहने वाली बारिश की मात्रा शून्य हो जाएगी जबकि ज़ेड के माध्यम से मात्रा लगातार बढ़ेगी जब तक अधिकतम बारिश बहती न हो। इसी प्रकार यदि हम अब फोन को अपनी तरफ टिपते हैं तो एक्स ट्यूब अंततः बारिश की अधिकतम मात्रा एकत्र करेगा। इसलिए 3 ट्यूबों के माध्यम से बहने वाली बारिश की मात्रा को मापकर फोन के अभिविन्यास के आधार पर आप अभिविन्यास की गणना कर सकते हैं।

फोन में एक इलेक्ट्रॉनिक कंपास भी है जो एक सामान्य कंपास की तरह व्यवहार करता है - इसकी "आभासी सुई" चुंबकीय उत्तर को इंगित करती है। एंड्रॉइड इन दो सेंसर से जानकारी विलीन करता है ताकि जब भी SensorEvent का TYPE_ORIENTATION उत्पन्न होता है तो values[3] सरणी है
मूल्य [0]: अजीमुथ - (चुंबकीय उत्तर के पूर्व में कंपास वाला कंपास)
मूल्य [1]: पिच, एक्स-अक्ष के चारों ओर घूर्णन (फोन आगे या पीछे झुक रहा है)
मूल्य [2]: रोल, वाई-अक्ष के चारों ओर घूर्णन (फोन अपने बाएं या दाएं तरफ झुक रहा है)

तो मुझे लगता है कि (यानी मुझे नहीं पता) एंड्रॉइड कारण तीसरे एक्सेलेरोमीटर के पढ़ने के बजाए एजीमुथ (कंपास असर) देता है यह है कि कंपास असर अधिक उपयोगी है। मुझे यकीन नहीं है कि उन्होंने इस प्रकार के सेंसर को क्यों हटा दिया क्योंकि अब ऐसा लगता है कि आपको SensorEvent के प्रकार TYPE_MAGNETIC_FIELD लिए सिस्टम के साथ श्रोता पंजीकृत करने की आवश्यकता है। इवेंट का value[] सरणी को रोटेशन मैट्रिक्स (नीचे देखें) प्राप्त करने के लिए सेंसरमेंजर.getRotationMatrix SensorManger.getRotationMatrix(..) विधि में पार करने की आवश्यकता है जिसे बाद में सेंसरमेनगर.getऑरिएंटेशन SensorManger.getRotationMatrix(..) विधि में पास किया जाता है। क्या किसी को पता है कि क्यों एंड्रॉइड टीम ने Sensor.TYPE_ORIENTATION हटा दिया। Sensor.TYPE_ORIENTATION ? क्या यह एक दक्षता चीज है? यही एक टिप्पणी में एक टिप्पणी में निहित है, लेकिन आपको अभी भी development/samples/Compass/src/com/example/android/compass/CompassActivity.java उदाहरण में एक अलग प्रकार के श्रोता को पंजीकृत करने की आवश्यकता है।

अब मैं रोटेशन मैट्रिक्स के बारे में बात करना चाहूंगा। (यह वह जगह है जहां मैं सबसे अनिश्चित हूं) तो ऊपर हमारे पास एंड्रॉइड दस्तावेज से तीन आंकड़े हैं, हम उन्हें ए, बी और सी कहते हैं।

ए = सेंसर मैनेजर .getRotationMatrix (..) विधि आकृति और दुनिया की समन्वय प्रणाली का प्रतिनिधित्व करता है

बी = सेंसरइवेंट एपीआई द्वारा इस्तेमाल समन्वय प्रणाली।

सी = सेंसर मैनेजर .getOrientation (..) विधि आकृति

तो मेरी समझ यह है कि ए "दुनिया की समन्वय प्रणाली" का प्रतिनिधित्व करता है जो मुझे लगता है कि ग्रह पर स्थानों को एक वैकल्पिक (ऊंचाई) के साथ (अक्षांश, देशांतर) जोड़े के रूप में दिया जाता है। एक्स "easting" समन्वय है, वाई "easting" समन्वय है। जेड आकाश को इंगित करता है और ऊंचाई का प्रतिनिधित्व करता है।

फ़ोन समन्वय प्रणाली को चित्र बी में दिखाया गया है। इसकी वाई अक्ष हमेशा शीर्ष पर इंगित करती है। घूर्णन मैट्रिक्स की लगातार फोन द्वारा गणना की जा रही है और दोनों के बीच मैपिंग की अनुमति देता है। तो क्या मैं सोच रहा हूं कि रोटेशन मैट्रिक्स बी से सी की समन्वय प्रणाली को बदलता है? तो जब आप SensorManager.getOrientation(..) विधि को कॉल करते हैं तो आप values[] सरणी का उपयोग values[] साथ मानते हैं। जब फ़ोन आकाश को इंगित करता है तो रोटेशन मैट्रिक्स पहचान मैट्रिक्स (मैट्रिक्स गणितीय समकक्ष 1) होता है इसका मतलब है कि डिवाइस को दुनिया की समन्वय प्रणाली के साथ गठबंधन करने के लिए कोई मैपिंग आवश्यक नहीं है।

ठीक। मुझे लगता है कि मैं अब बेहतर रोकता हूं। जैसा कि मैंने पहले कहा था कि मुझे आशा है कि लोग मुझे बताएंगे कि मैंने गड़बड़ कर ली है या लोगों की मदद की है (या लोगों को भी भ्रमित कर दिया है!)


आप एक स्क्रीन टर्न deserves एक और लेख की जांच करना चाह सकते हैं। यह बताता है कि आपको रोटेशन मैट्रिक्स की आवश्यकता क्यों है।

संक्षेप में, फोन के सेंसर हमेशा उसी समन्वय प्रणाली का उपयोग करते हैं, भले ही डिवाइस घूर्णन हो।

उन अनुप्रयोगों में जो एकल अभिविन्यास पर लॉक नहीं होते हैं, जब आप डिवाइस को घुमाते हैं तो स्क्रीन समन्वय प्रणाली बदल जाती है। इस प्रकार, जब डिवाइस को अपने डिफ़ॉल्ट दृश्य मोड से घुमाया जाता है, तो सेंसर समन्वय प्रणाली स्क्रीन समन्वय प्रणाली के समान नहीं होती है। इस मामले में रोटेशन मैट्रिक्स का उपयोग ए से सी को बदलने के लिए किया जाता है (बी हमेशा स्थिर रहता है)।

यह दिखाने के लिए यहां एक कोड स्निपेट है कि इसका उपयोग कैसे किया जा सकता है।

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]);
        }
    }
}

इसे देखें: .com: Q.5202147

आप 3 आरेख ए, बी, सी तक ज्यादातर सही होने लगते हैं। उसके बाद आप खुद को उलझन में डाल दिया है।


रोल गुरुत्वाकर्षण का एक कार्य है, एक 90 डिग्री रोल एक्स रजिस्टर में सभी गुरुत्वाकर्षण रखता है।

पिच एक जैसा है, एक 90 डिग्री पिच अप y रजिस्टर में गुरुत्वाकर्षण के सभी घटक रखता है।

यॉ / हेडिंग / अजीमुथ का गुरुत्वाकर्षण पर कोई प्रभाव नहीं पड़ता है, यह हमेशा गुरुत्वाकर्षण के दाहिने कोण पर होता है, इसलिए कोई फर्क नहीं पड़ता कि आप गुरुत्वाकर्षण का सामना कर रहे हैं, इससे कोई फर्क नहीं पड़ता।

यही कारण है कि आपको आकलन करने के लिए एक कंपास की आवश्यकता है, शायद यह समझ में आता है?







compass-geolocation