9

मैं एक साधारण बढ़ी वास्तविकता ऐप बनाने की कोशिश कर रहा हूं, इसलिए मैं सेंसर डेटा के साथ काम करना शुरू कर देता हूं।एंड्रॉइड: डिवाइस के ओरिएंटेशन की गणना करने में समस्या

इस सूत्र (Android compass example) और उदाहरण (http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html) के अनुसार, Sensor.TYPE_ACCELEROMETER और Sensor.TYPE_MAGNETIC_FIELD का उपयोग कर उन्मुखीकरण की गणना वास्तव में फिट नहीं करता है।

इसलिए मुझे "अच्छे" मान प्राप्त करने में सक्षम नहीं है। अजीमट मूल्यों का कोई मतलब नहीं है, इसलिए यदि मैं फोन को मूल्य परिवर्तन के ऊपर ले जाता हूं तो चरम सीमा में बदल जाता है। यहां तक ​​कि अगर मैं सिर्फ फोन घुमाता हूं, तो मूल्य फ़ोन अभिविन्यास का प्रतिनिधित्व नहीं करता है।

क्या किसी को कोई विचार है, जो दिए गए उदाहरण के अनुसार मूल्य गुणवत्ता में सुधार करने के लिए है?

उत्तर

0

क्या आपने संयुक्त (सेंसर-फ़्यूज़न) प्रकार सेंसर.TYPE_ROTATION_VECTOR की कोशिश की है। यह बेहतर परिणाम दे सकता है: https://developer.android.com/reference/android/hardware/SensorEvent.html पर जाएं और 'rotation_vector' के लिए खोजें।

+1

ठीक है, तो क्या इस सेंसर के साथ काम करने का कोई उदाहरण है? मुझे एक्स * पाप (θ/2), वाई * पाप (θ/2) और जेड * पाप (θ/2) के लिए मान मिलते हैं। लेकिन मैं मूल्य कैसे प्राप्त करूं, मुझे अपना कंपास बनाने की जरूरत है। क्या मुझे फिर से getRotationMatrix का उपयोग करना चाहिए? आपकी सहायता के लिए धन्यवाद. –

+0

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

19

इस नमूना ऐप का आप किस प्रकार के अभिविन्यास का उपयोग करते हैं? जो लिखा गया है, वह कोड है, समर्थित एकमात्र अभिविन्यास तालिका पर पोर्ट्रेट या फ्लैट है, यह डिवाइस पर निर्भर करता है। "अच्छा" से आपका क्या मतलब है?

यह सामान्य है कि डिवाइस को घूर्णन करते समय मान "अच्छा" नहीं होता है, डिवाइस समन्वय प्रणाली पोर्ट्रेट में काम कर रही है, या फ्लैट मुझे नहीं पता (स्क्रीन के साथ वाई अक्ष लंबवत, जेड स्क्रीन के केंद्र से आने वाली स्क्रीन से धुरी धुरी, एक्स अक्ष लंबवत वाई अक्ष के साथ स्क्रीन पर दाईं ओर जा रही है)। ऐसा करने से, डिवाइस को घूर्णन करने से डिवाइस समन्वय प्रणाली घुमाएगी, आपको इसे रीमेप करना होगा।

लेकिन अगर आप पोर्ट्रेट ओरिएंटेशन में डिवाइस के शीर्षक चाहते हैं, यहाँ कोड का एक टुकड़ा है कि मेरे लिए अच्छा काम करता है: में

@Override 
public void onSensorChanged(SensorEvent event) 
{ 
    // It is good practice to check that we received the proper sensor event 
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) 
    { 
     // Convert the rotation-vector to a 4x4 matrix. 
     SensorManager.getRotationMatrixFromVector(mRotationMatrix, 
       event.values); 
     SensorManager 
       .remapCoordinateSystem(mRotationMatrix, 
         SensorManager.AXIS_X, SensorManager.AXIS_Z, 
         mRotationMatrix); 
     SensorManager.getOrientation(mRotationMatrix, orientationVals); 

     // Optionally convert the result from radians to degrees 
     orientationVals[0] = (float) Math.toDegrees(orientationVals[0]); 
     orientationVals[1] = (float) Math.toDegrees(orientationVals[1]); 
     orientationVals[2] = (float) Math.toDegrees(orientationVals[2]); 

     tv.setText(" Yaw: " + orientationVals[0] + "\n Pitch: " 
       + orientationVals[1] + "\n Roll (not used): " 
       + orientationVals[2]); 

    } 
} 

आप शीर्षक (या दिगंश) प्राप्त होंगे:

orientationVals[0] 
+1

रिकॉर्ड के लिए, मैंने इस कोड को 3x3 के साथ करने की कोशिश की मैट्रिक्स लेकिन यह केवल 4x4 (उर्फ फ्लोट [16]) – MonoThreaded

+0

के साथ काम करता है, इसके लिए यह 4 * 4 (उर्फ फ्लोट [16]) –

7

शायद पार्टी के लिए देर हो चुकी है। वैसे भी यहाँ कैसे मैं दिगंश

private final int sensorType = Sensor.TYPE_ROTATION_VECTOR; 
float[] rotMat = new float[9]; 
float[] vals = new float[3]; 

@Override 
public void onSensorChanged(SensorEvent event) { 
    sensorHasChanged = false; 
    if (event.sensor.getType() == sensorType){ 
     SensorManager.getRotationMatrixFromVector(rotMat, 
       event.values); 
     SensorManager 
       .remapCoordinateSystem(rotMat, 
         SensorManager.AXIS_X, SensorManager.AXIS_Y, 
         rotMat); 
     SensorManager.getOrientation(rotMat, vals); 
     azimuth = deg(vals[0]); // in degrees [-180, +180] 
     pitch = deg(vals[1]); 
     roll = deg(vals[2]); 
     sensorHasChanged = true; 
    } 
} 

आशा है कि यह मदद करता है

+0

के साथ काम करता है 'रीमैप कॉर्डिनेट सिस्टम' कॉल केवल पहचान परिवर्तन है, इसलिए यह अनावश्यक है। बदतर, यह इनपुट और आउटपुट दोनों के लिए 'rotMat' का उपयोग करके, कुछ दस्तावेज स्पष्ट रूप से कहता है कि आपको नहीं करना चाहिए। – Thomas

+0

धन्यवाद यह काम करता है! – Bogdan

11

उत्तर TIBO से अच्छा है मिल गया, लेकिन अगर आप रोल मूल्य प्रवेश करें, तो आप अनियमित संख्या उम्मीद नहीं है। आप में लिए और remap से बाहर विभिन्न मैट्रिक्स का उपयोग करने के

SensorManager.remapCoordinateSystem(mRotationMatrix, 
        SensorManager.AXIS_X, SensorManager.AXIS_Z, 
        mRotationMatrix); 

को

इस वजह से है (रोल एआर ब्राउज़र के लिए महत्वपूर्ण है)। यह निम्न कोड मेरे लिए सही रोल मान के साथ काम करता है:

@Override 
public void onSensorChanged(SensorEvent event) 
{ 
    // It is good practice to check that we received the proper sensor event 
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) 
    { 
     // Convert the rotation-vector to a 4x4 matrix. 
     SensorManager.getRotationMatrixFromVector(mRotationMatrixFromVector, event.values); 
     SensorManager.remapCoordinateSystem(mRotationMatrixFromVector, 
        SensorManager.AXIS_X, SensorManager.AXIS_Z, 
        mRotationMatrix); 
     SensorManager.getOrientation(mRotationMatrix, orientationVals); 

     // Optionally convert the result from radians to degrees 
     orientationVals[0] = (float) Math.toDegrees(orientationVals[0]); 
     orientationVals[1] = (float) Math.toDegrees(orientationVals[1]); 
     orientationVals[2] = (float) Math.toDegrees(orientationVals[2]); 

     tv.setText(" Yaw: " + orientationVals[0] + "\n Pitch: " 
       + orientationVals[1] + "\n Roll (not used): " 
       + orientationVals[2]); 

    } 
} 
+0

हां, आप स्रोत कोड में देख सकते हैं: सार्वजनिक स्थैतिक बूलियन रीमेप समन्वय प्रणाली (फ्लोट [] inR, int X, int वाई, फ्लोट [] आउटआर) * @param outR * रूपांतरित रोटेशन मैट्रिक्स। इनआर और आउटआर एक ही * सरणी नहीं होनी चाहिए। – codevscolor

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^