2010-09-20 12 views
22

मैं 3 अक्ष के लिए accelerometer मान की गणना (आमतौर पर जब वहाँ केवल गुरुत्वाकर्षण है -1.0 और 1.0 के बीच डेटा शामिल हैं) प्रत्येक अक्ष।3 डी Accelerometer उन्मुखीकरण

glRotatef(yquad,1.0f,0.0f,0.0f); 
glRotatef(rquad,0.0f,1.0f,0.0f); 

यह गोलार्द्ध पर काम:

float R = sqrt(pow(Rx,2)+pow(Ry,2)+pow(Rz,2)); 
    float Arx = acos(Rx/R)*180/M_PI; 
    float Ary = acos(Ry/R)*180/M_PI; 
    float Arz = acos(Rz/R)*180/M_PI; 

तब मैं ओपन

rquad = Arx; 
yquad = Ary; 

कौन सा मेरी बॉक्स घूमता में बॉक्स कोण के लिए मूल्यों की स्थापना की। मैं पूर्ण क्षेत्र का उपयोग करना चाहता हूं और मुझे पता है कि मुझे इसे काम करने के लिए अरज़ मूल्य का उपयोग करना है, लेकिन मुझे नहीं पता कि मैं इस घूर्णन के लिए इसका उपयोग कैसे कर सकता हूं। क्या तुम मेरी मदद कर सकते हो?

अद्यतन:

rquad = -atan2(Rx/R, Rz/R)*180/M_PI; 
    yquad = -atan2(Ry/R, Rz/R)*180/M_PI; 

उत्तर

34

सही जवाब है:

Roll = atan2(Y, Z) * 180/M_PI; 
Pitch = atan2(-X, sqrt(Y*Y + Z*Z)) * 180/M_PI; 

स्रोत: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf (। पृष्ठ 10, Eqn 25 & 26)

उन्हें प्रदर्शन में उपयोग करने के लिए उन्हें इसके बारे में बहुत आसान है यूईएसपी का जवाब गलत है। यह स्वीकार्य अनुमान की तरह दिखता है जब तक पिच और रोल 45 डिग्री से ऊपर नहीं जाते।

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

+3

में त्रुटि का पता नहीं लगा है, मुझे पता है कि यह प्रश्न बहुत पुराना है, लेकिन मुझे गलत जवाब देने से नफरत है। मैं खुद इसे ढूंढ रहा था, और मुझे Google में सैकड़ों हिट मिलीं, उनमें से अधिकतर एक ही गलत जवाब के साथ – matteo

+2

जिस तरह से मैं स्रोत का उल्लेख करना भूल गया, जिसमें एक बहुत ही विस्तृत स्पष्टीकरण है: http: //www.freescale। com/files/sensors/doc/app_note/AN3461.pdf – matteo

+1

मान लीजिए कि आप लिंक किए गए स्रोत (एक महान संसाधन बीटीडब्ल्यू) से समीकरण 25 और 26 का उपयोग कर रहे हैं, पिच को 'atan2 (-X, sqrt (वाई * वाई + जेड + Z)) '? – uesp

-1

मैं निम्नलिखित गणना का उपयोग रोल और पिच मूल्यों में हमारे accelerometer रीडिंग परिवर्तित करने के लिए: अंतिम जवाब मेरे मामले में है

Roll = atan2(sqrt(Y*Y + X*X), Z) * 180/M_PI; 
Pitch = atan2(sqrt(X*X + Z*Z), Y) * 180/M_PI; 

आप स्वैप करने के लिए आवश्यकता हो सकती है एक्स/वाई/जेड वैल्यू या रोल/पिच का अनुवाद इस प्रकार निर्भर करता है कि आपके एक्सेलेरोमीटर कैसे परिभाषित किए जाते हैं।

glRotatef (Pitch, 0.0f, 0.0f, 1.0f); 
glRotatef (Roll, 1.0f, 0.0f, 0.0f); 
+0

उत्तर देने के लिए धन्यवाद, लेकिन मैंने कोशिश की और मुझे पिच और रोल के लिए 0 डिग्री -180 डिग्री मिल गया। मैं 0 डिग्री -360 डिग्री –

+0

प्राप्त करना चाहता हूं मैंने स्पष्ट सिर के साथ फिर कोशिश की :) यह अच्छी तरह से काम करता है –

+0

रोल के लिए समीकरण गलत है। मेरा answare देखें (मैं कोई क्रेडिट नहीं लेता, मैंने इसे वहां पाया) – matteo

10

जबकि Matteo का जवाब सही है, यह पूर्ण, पूर्ण समाधान प्रदान नहीं करता है: सूत्रों सही हैं:

Roll = atan2(Y, Z) * 180/M_PI; 
Pitch = atan2(-X, sqrt(Y*Y + Z*Z)) * 180/M_PI; 

हालांकि, जब पिच + 90/-90 डिग्री है और एक्स अक्ष खड़ी है ऊपर/नीचे की ओर इशारा करते, आदर्श accelerometer सामान्यीकृत उत्पादन किया जाना चाहिए:

accX = -1/accX = 1 
accY = 0 
accZ = 0 

एक roll angle of 0 degrees जिसका मतलब है; सही बात। लेकिन व्यवहार में, accelerometer उत्पादन शोर है और आप के करीब कुछ मिलेगा:

accX = -1/accX = 1 
accY = 0.003 
accZ = 0.004 

यह छोटा सा लग सकता है, लेकिन यह कारण रोल कोण ~ 30 dregrees जो सही नहीं है होना करने के लिए होगा।

स्पष्ट वृत्ति अंतिम अंक को फ़िल्टर करना होगा, लेकिन इससे परिशुद्धता प्रभावित होगी, जो हमेशा स्वीकार्य नहीं होती है।

Roll = atan2(Y, sign* sqrt(Z*Z+ miu*X*X)); 
sign = 1 if accZ>0, -1 otherwise 
miu = 0.001 

त्रुटि शुरू की इस तरह से है:

समझौता है, जो बहुत अच्छी तरह से संदर्भ एप्लिकेशन टिप्पणी से समझाया गया है, एक बहुत छोटे से रोल के लिए सूत्र में accelerometer एक्स अक्ष पढ़ने का प्रतिशत शामिल करने के लिए है पिछले मामले की तुलना में नाटकीय रूप से छोटे: समान स्थितियों के तहत रोल को मापते समय 2-3 डिग्री ऊपर वर्णित।

2

मैंने अनुशंसित समाधान (मैटियो) की कोशिश की है, और जब यह पहली बार काम करने लग रहा था, मैंने देखा कि जब पिच 90 डिग्री तक पहुंचती है (लगभग 70 डिग्री से शुरू होती है लेकिन विभिन्न फोनों में जरूरी नहीं है), तो रोल अचानक बढ़ता है। जब पिच 90 पर होता है तो रोल लगभग 0 से अधिक होना चाहिए और अब 180 से अधिक हो रहा है। मैं इसे गणितीय रूप से रोकने के लिए एक तरीका सोचने की कोशिश कर रहा हूं, अगर मैं रोल को + 90/-90 तक सीमित करता हूं सामान्य रूप से व्यवहार करता है लेकिन मुझे वह रेंज नहीं मिलती है जो मुझे चाहिए (+ 180/-180): Math.atan2 (y, Math.sqrt ((x x) + (z z)) * (180/गणित। पीआई))

+0

मुझे वही समस्या मिलती है, जैसे ही डिवाइस आधे रास्ते के करीब "उल्टा नीचे" होता है, रोल बस बहुत तेजी से फ़्लिप करता है, मैंने दूसरी गणना में एसएनजी (जेड) जोड़कर या बस पास होने पर फ़्लिप करके coutneracting की कोशिश की, लेकिन इसकी उतना आसान नहीं अगर मैं समन्वय प्रणाली की कुल्हाड़ियों को स्वैप करता हूं और फिर अपने पिच/रोल आउटपुट को स्वैप करता हूं, तो मुझे वही चीज़ मिल सकती है, लेकिन रोल के कारण समस्या उत्पन्न होती है, पिच नहीं। – rajkosto