android - डिवाइस के समन्वय प्रणाली से पूर्ण समन्वय प्रणाली में त्वरण




vector accelerometer (3)

@ एलेक्स के उत्तर के आधार पर, यहां कोड स्निपेट है:

private float[] gravityValues = null;
private float[] magneticValues = null;

 @Override
    public void onSensorChanged(SensorEvent event) {
        if ((gravityValues != null) && (magneticValues != null) 
            && (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)) {

            float[] deviceRelativeAcceleration = new float[4];
            deviceRelativeAcceleration[0] = event.values[0];
            deviceRelativeAcceleration[1] = event.values[1];
            deviceRelativeAcceleration[2] = event.values[2];
            deviceRelativeAcceleration[3] = 0;

            // Change the device relative acceleration values to earth relative values
            // X axis -> East
            // Y axis -> North Pole
            // Z axis -> Sky

            float[] R = new float[16], I = new float[16], earthAcc = new float[16];

            SensorManager.getRotationMatrix(R, I, gravityValues, magneticValues);

            float[] inv = new float[16];

            android.opengl.Matrix.invertM(inv, 0, R, 0);
            android.opengl.Matrix.multiplyMV(earthAcc, 0, inv, 0, deviceRelativeAcceleration, 0);
           Log.d("Acceleration", "Values: (" + earthAcc[0] + ", " + earthAcc[1] + ", " + earthAcc[2] + ")");                

        } else if (event.sensor.getType() == Sensor.TYPE_GRAVITY) {
            gravityValues = event.values;
        } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            magneticValues = event.values;
        } 
   }

मेरे एंड्रॉइड डिवाइस से मैं रैखिक त्वरण मूल्यों (डिवाइस के समन्वय प्रणाली में) और पूर्ण अभिविन्यास मानों (पृथ्वी की समन्वय प्रणाली में) की एक सरणी पढ़ सकता हूं। मुझे बाद के समन्वय में रैखिक त्वरण मूल्य प्राप्त करने की आवश्यकता है। प्रणाली।

मैं उन्हें कैसे परिवर्तित कर सकता हूं?

टिप्पणी में अली के जवाब के बाद संपादित करें :

ठीक है, इसलिए यदि मैं सही ढंग से समझता हूं, जब मैं रैखिक त्वरण को मापता हूं, तो फोन की स्थिति पूरी तरह से कोई फर्क नहीं पड़ता, क्योंकि रीडिंग पृथ्वी की समन्वय प्रणाली में दी जाती है। सही?

लेकिन मैंने अभी एक परीक्षण किया जहां मैंने फोन को अलग-अलग पदों पर रखा और विभिन्न अक्षों में त्वरण प्राप्त किया। चित्रों के 3 जोड़े हैं - पहला दिखाता है कि मैंने डिवाइस को कैसे रखा (मेरे पेंट "मास्टर कौशल" के लिए खेद है) और दूसरे रैखिक एसीसी द्वारा प्रदान किए गए डेटा से रीडिंग दिखाते हैं। सेंसर:

  1. डिवाइस बाईं ओर रखा

  1. डिवाइस वापस झूठ बोल रहा है

  1. डिवाइस खड़ा है

और अब - तीसरे मामले में क्यों ज़ेड अक्ष (वाई नहीं) के साथ त्वरण होता है क्योंकि डिवाइस की स्थिति कोई फर्क नहीं पड़ता?


ठीक है, सबसे पहले, यदि आप एंड्रॉइड पर वास्तविक जड़त्व नेविगेशन करने की कोशिश कर रहे हैं, तो आपके लिए अपना काम खत्म हो गया है। स्मार्ट फोन में इस्तेमाल किया जाने वाला सस्ता छोटा सेंसर बस सटीक नहीं है। हालांकि, इमारत के अंदर जैसे छोटी दूरी पर अंतःक्रियात्मक नेविगेशन पर कुछ दिलचस्प काम किया गया है। इस विषय पर शायद कागजात हैं जो आप खोद सकते हैं। Google "मोशन इंटरफेस डेवलपर्स सम्मेलन" और आपको कुछ उपयोगी मिल सकता है - यह एक सम्मेलन है जो कुछ महीने पहले इनवेन्सेंस लगाया गया था।

दूसरा, नहीं, रैखिक त्वरण डिवाइस निर्देशांक में है, न कि विश्व निर्देशांक। आपको स्वयं को परिवर्तित करना होगा, जिसका मतलब है कि डिवाइस के 3-डी अभिविन्यास को जानना।

आप जो करना चाहते हैं वह एंड्रॉइड के एक संस्करण का उपयोग करता है जो वर्चुअल सेंसर TYPE_GRAVITY और TYPE_LINEAR_ACCELERATION का समर्थन करता है। उचित सटीक और सटीक रीडिंग प्राप्त करने के लिए आपको gyros के साथ एक डिवाइस की आवश्यकता होगी।

आंतरिक रूप से, सिस्टम डिवाइस अभिविन्यास के लिए वास्तविक मूल्यों के साथ आने के लिए सिस्टम जीरोस, एक्सेलेरोमीटर और मैग्नेटोमीटर को जोड़ता है। यह एक्सेलेरोमीटर डिवाइस को अपने गुरुत्वाकर्षण और त्वरण घटकों में प्रभावी रूप से विभाजित करता है।

तो आप क्या करना चाहते हैं TYPE_GRAVITY, TYPE_LINEAR_ACCELERATION, और TYPE_MAGNETOMETER के लिए सेंसर श्रोताओं को सेट करना है। सेंसर मैनेजर को इनपुट के रूप में गुरुत्वाकर्षण और मैग्नेटोमीटर डेटा का उपयोग करें। रोटेशन मैट्रिक्स प्राप्त करने के लिए getRotationMatrix () प्राप्त करें जो विश्व निर्देशांक को डिवाइस निर्देशांक में बदल देगा या इसके विपरीत। इस मामले में, आप "बनाम" भाग चाहते हैं। यही है, अभिविन्यास मैट्रिक्स के हस्तांतरण द्वारा उन्हें गुणा करके रैखिक त्वरण इनपुट को विश्व निर्देशांक में परिवर्तित करें।


दस्तावेज के मुताबिक आपको फोन के समन्वय प्रणाली में रैखिक त्वरण मिलता है।

आप रोटेशन मैट्रिक्स के साथ गुणा करके पृथ्वी के समन्वय प्रणाली में फोन के समन्वय प्रणाली से किसी भी वेक्टर को बदल सकते हैं । आप getRotationMatrix() से रोटेशन मैट्रिक्स प्राप्त कर सकते हैं।

(शायद आपके लिए यह गुणा करने वाला एक फ़ंक्शन पहले से ही है लेकिन मैं एंड्रॉइड प्रोग्रामिंग नहीं करता हूं और मैं इसके एपीआई से परिचित नहीं हूं।)

रोटेशन मैट्रिक्स पर एक अच्छा ट्यूटोरियल दिशा कोसाइन मैट्रिक्स आईएमयू है: थ्योरी पांडुलिपि। सौभाग्य!





coordinate-transformation