2012-07-16 12 views
16

से रोल मैं एक सेंसर प्रबंधक है कि एक rotationMatrix रिटर्न उपकरणों मैग्नेटोमीटर और Accelerometer के आधार पर की है। मैं भी विचलन पिच और उपयोगकर्ता के उपकरण के रोल की गणना करने के प्रयास कर रहे हैं लेकिन यह है कि पिच और रोल दूसरे के साथ हस्तक्षेप और गलत परिणाम दे लग रहा है। rotationMatrix से डिवाइस के वाई पिच और रोल को निकालने का कोई तरीका है?निकालने विचलन, पिच, और एक rotationMatrix

संपादित नीचे ब्लेंडर के जवाब की व्याख्या करने के, जो मैं के लिए आभारी हूँ लेकिन वहाँ नहीं अभी तक की कोशिश कर रहा, मैं इस तरह की एक rotaion मैट्रिक्स से कोण पाने के लिए कोशिश कर रहा हूँ:

 float R[] = phoneOri.getMatrix(); 
     double rmYaw = Math.atan2(R[4], R[0]); 
     double rmPitch = Math.acos(-R[8]); 
     double rmRoll = Math.atan2(R[9], R[10]); 

मैं डॉन ' टी नहीं जानता कि मैं मैट्रिक्स के गलत हिस्सों का संदर्भ दे रहा हूं या नहीं, लेकिन मुझे नतीजे नहीं मिल रहे हैं।

मैं डिग्री में मूल्यों को प्राप्त करने की उम्मीद कर रहा था, लेकिन अजीब पूर्णांक हो रही है।

मेरी मैट्रिक्स मेरी sensorManager से आ रही है इस तरह दिखता है जो:

public void onSensorChanged(SensorEvent evt) { 
      int type=evt.sensor.getType(); 
      if(type == Sensor.TYPE_ORIENTATION){ 
       yaw = evt.values[0]; 
       pitch = evt.values[1]; 
       roll = evt.values[2]; 
      } 
      if (type == Sensor.TYPE_MAGNETIC_FIELD) { 
       orientation[0]=(orientation[0]*1+evt.values[0])*0.5f; 
       orientation[1]=(orientation[1]*1+evt.values[1])*0.5f; 
       orientation[2]=(orientation[2]*1+evt.values[2])*0.5f; 
      } else if (type == Sensor.TYPE_ACCELEROMETER) { 
       acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f; 
       acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f; 
       acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f; 
      } 
      if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) { 
       float newMat[]=new float[16]; 

       SensorManager.getRotationMatrix(newMat, null, acceleration, orientation); 
       if(displayOri==0||displayOri==2){ 
        SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat); 
       }else{ 
        SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat); 
       } 

       matrix=newMat; 

नमूना मैट्रिक्स जब डिवाइस मेज पर चेहरा रख रही है

0.9916188, -0.12448014, -0.03459576, 0.0 
0.12525482, 0.9918981, 0.021199778, 0.0 
0.031676512,-0.025355382, 0.9991765, 0.0 
0.0,   0.0,   0.0,   1 

उत्तर

double rmPitch = Math.toDegrees(Math.acos(R[10])); 

उत्तर

19

यॉ, पिच और रोल यूलर कोण से मेल खाते हैं। आप कर सकते हैं convert a transformation matrix to Euler angles बहुत आसानी से:

enter image description here

+5

धन्यवाद लेकिन ईमानदार है कि है, मेरे लिए ग्रीक किया जाना है। क्या आप मेरे लिए अनुवाद करने के लिए इतने किआस होंगे .. जावा की तरह? – erik

+14

ठीक है, वे * यूनानी अक्षरों हैं;) 'ए_31' का अर्थ तीसरी पंक्ति और पहला स्तंभ में प्रविष्टि है। जावा में इन फ़ंक्शंस अंतर्निहित हैं ताकि आप इसका अनुवाद कर सकें। – Blender

+0

कृपया ऊपर मेरा संपादन देखें .. मेरा रोटेशन मैट्रिक्स आकार में 16 मान है। अगर मैं यह सही कर रहा हूँ पता नहीं है .. – erik

12

मेरा मानना ​​है कि यूलर कोण करने के लिए (zxz बाह्य), और रोल पिच यॉ एक अलग तरह की यूलर कोण हैं ब्लेंडर का जवाब नहीं सही है, क्योंकि वह रोटेशन मैट्रिक्स से एक परिवर्तन दिया है (zyx extrinsic)।

वास्तविक परिवर्तन सूत्र बल्कि होगा:

yaw=atan2(R(2,1),R(1,1)); 
pitch=atan2(-R(3,1),sqrt(R(3,2)^2+R(3,3)^2))); 
roll=atan2(R(3,2),R(3,3)); 

Source

+1

इस प्रतिक्रिया में एक लाख +1 होना चाहिए। यह SensorManager.TYPE_ROTATION_VECTOR से प्राप्त रोटेशन मैट्रिक्स को सही ढंग से बदलने के लिए एकदम सही सूत्र है। –

+1

यहां "आर" क्या है? यदि यह सेंसर मैनेजर.getRotationMatrix() से लिया गया एक रोटेशन मैट्रिक्स है, तो इस मामले में, आर एक एकल dimen सरणी है लेकिन उपरोक्त उत्तर में यह 2 डी सरणी की तरह लगता है। –

+1

मुझे खेद है, एंड्रॉइड प्रोग्रामिंग के बारे में कुछ भी नहीं पता, मेरा कोड केवल स्रोत के समीकरणों का कार्यान्वयन था। – Aquadarius

2

सेंसर प्रबंधक एक SensorManager.getOrientation तीनों कोण पाने के लिए प्रदान करता है।

+0

मुझे लगता है कि 'getOrientation()' द्वारा प्रदान किया गया "yaw" बिल्कुल सही नहीं है; जावाडोक इसे "अजीमुथ" के रूप में वर्णित करता है। हालांकि यह मेरे प्राणघातक मस्तिष्क से परे है। –