2012-12-11 28 views
12

पर ओपनसीवी रोटेशन और अनुवाद वैक्टर को कनवर्ट करना इस प्रश्न का उत्तर देने के लिए Google परिणाम और स्टैक ओवरफ्लो पोस्ट हैं, लेकिन साधारण तथ्य यह है कि मैं उन्हें समझ नहीं पा रहा हूं। कोई फर्क नहीं पड़ता कि मैं कितना पढ़ता हूं, मैं अपने सिर को quaternions और Euler कोणों और Rodriguez के आसपास बदल नहीं सकता है और यह सब।एक्सवाईजेड रोटेशन और एक्सवाईजेड स्थिति

कोई मुझे समझाने के लिए तैयार है कि मैं 12 वर्ष की तरह रोटेशन और अनुवाद वैक्टर से कैसे प्राप्त करूं, ओपनसीवी की हल पीएनपी() विधि xyz स्थिति और xyz रोटेशन मानों द्वारा लौटाया गया है जिसे मैं 3 डी ग्राफिक्स एप्लिकेशन में प्लग कर सकता हूं?

यह सी ++ में एक उन्नत वास्तविकता अनुप्रयोग के लिए है। मेरे पास ओपनसीवी भाग है और चल रहा है, एक मार्करबोर्ड को ट्रैक कर रहा है और ग्राफिक्स प्रोग्राम में रोटेशन और अनुवाद वैक्टर भेज रहा है, लेकिन मुझे नहीं पता कि उस जानकारी का उपयोग कैसे करें मेरी 3 डी ऑब्जेक्ट को पॉज़ करने के लिए।

मैं वास्तव में इसके पीछे गणित को समझना चाहता हूं, और यहां सिद्धांत के किसी भी रोगी स्पष्टीकरण की सराहना करता हूं। लेकिन मैं कुछ कोड के लिए एक सूचक के लिए भी व्यवस्थित रहूंगा जिसे मैं कॉपी/पेस्ट कर सकता हूं और सिद्धांत को एक और दिन सीख सकता हूं। असल में मुझे कंक्रीट कोड देखकर और सिद्धांत के पीछे काम करने के द्वारा इस तरह की चीजें सीखना प्रतीत होता है।

संपादित करें: this जैसा है ... जो स्पष्ट रूप से मुझे सही दिशा में इंगित करना चाहिए, लेकिन यह मुझे पता है कि सभी के लिए समय मशीन की योजना भी हो सकती है। यह मेरे लिए हुआ है कि मैं उपचारात्मक हाई स्कूल गणित के लिए पूछ रहा हूं, लेकिन यह पहली बार नहीं हो सकता है।

संपादित करें: यहां रोटेशन वेक्टर और अनुवाद वेक्टर का हल उदाहरण पीएनपी() से वापस किया जा रहा है ... ग्राफिक्स एप्लिकेशन की यात्रा के लिए एक्सएमएल में परिवर्तित किया गया है। ध्यान दें कि इनमें से प्रत्येक में मैंने देखा है जिसमें तीन पंक्तियां और एक स्तंभ शामिल है।

<Tvec type_id="opencv-matrix"> 
    <rows>3</rows> 
    <cols>1</cols> 
    <dt>f</dt> 
    <data> 
    -2.50094433e+01 -6.59909010e+00 1.07882790e+02 
    </data> 
</Tvec> 
<Rvec type_id="opencv-matrix"> 
    <rows>3</rows> 
    <cols>1</cols> 
    <dt>f</dt> 
    <data> 
    -1.92100227e+00 -2.11300254e-01 2.80715879e-02 
    </data> 
</Rvec> 
+0

यह प्रश्न http://math.stackexchange.com/ – karlphillip

+10

पर ले जाया जाना चाहिए, इसके साथ यह बात देखें, अगर मैं गणित में उस प्रश्न से पूछता हूं, तो मैं उन चीज़ों से प्रतिक्रिया प्राप्त करूंगा जो मैं करता हूं 't समझ। यह समझने की मेरी एकमात्र उम्मीद यह है कि कोड में इसे कैसे किया जाए। तब मैं गणित को समझ सकता हूं। यह ठीक है कि मस्तिष्क को जारी किया गया था कैसे काम करता है। – John

उत्तर

12

प्रारंभ में मुझे ओपनसीवी के प्रारूपों के बारे में कुछ भी नहीं पता था। तो पहले कुछ शोध। the documentation for solvePnP पर देखकर, ऐसा लगता है कि यह एक मैट्रिक्स लौट रहा है। Rodrigues2 फ़ंक्शन ने appears का उल्लेख इन दिनों Rodrigues कहलाया है।

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

तो आपका इनपुट angle-axis representation में है।x, y और z अक्ष के बारे में आप simultaneous rotation के रूप में व्याख्या कर सकते हैं। तो अगर "एक्सवाईजेड रोटेशन" से आपका मतलब एक साथ घूर्णन होता है, तो आप पहले से ही वहां हैं। अगर, हालांकि, आप कुछ संयोजन है जो पहले एक्स अक्ष और के बारे में तो z अक्ष के बारे में तो घूमता y अक्ष के बारे में और मतलब है, आप एक अजीब सेटअप में हैं, और शायद यह सुनिश्चित करना चाहिये आप सही एपीआई का उपयोग कर रहे हैं।

यदि यह Euler angles है, तो आप बाद में "XYZ रोटेशन" कह रहे हैं कुछ भ्रामक है। विकिपीडिया लेख Rotation formalisms in three dimensions विभिन्न प्रारूपों की सूची देता है, और उनके बीच कैसे परिवर्तित किया जाता है। विशेष रूप से, यह एक्सिस और कोण से मैट्रिक्स में और वहां से यूलर कोणों में परिवर्तित करने के लिए सूत्र देता है।

सुनिश्चित करें कि आप अपने ग्राफिक्स आउटपुट मशीनरी से मेल खाने के लिए सही प्रतिनिधित्व का उपयोग कर रहे हैं। या यदि आपके पास कोई विकल्प है, तो rotation marix प्रतिनिधित्व पर सीधे काम करने का प्रयास करें, क्योंकि यह समझने और काम करने के लिए सबसे आसान होना चाहिए।

+0

यह बहुत अच्छा है ... और आपके द्वारा किए गए शोध के लिए धन्यवाद । मैं निश्चित रूप से एक साथ घूर्णन के बाद हूं, हालांकि मुझे कभी नहीं पता था कि इसे कहा जाता था ... लेकिन मुझे नहीं लगता कि मैं "पहले से ही" कैसे हूं। मैं अपने मूल प्रश्न के संपादन के रूप में solPnP() विधि से वापस लौटाए गए डेटा को प्रदर्शित करने के लिए यह प्रदर्शित करने के लिए पोस्ट करूंगा कि मैंने इसे अभी तक XYZ रोटेशन और XYZ स्थिति में नहीं बनाया है। – John

+0

@ जॉन, मुझे तीन संख्याएं दिखाई देती हैं, और कोई कारण नहीं है कि उन्हें एक साथ घूर्णन का वर्णन क्यों नहीं करना चाहिए। सभी संख्याएं श्रेणी में हैं [-π, π] और वेक्टर के मानक भी हैं। आप वास्तव में त्रुटि का पता लगाते हैं? आपका ग्राफिक्स एप्लिकेशन क्या है? – MvG

+0

@MvG ... ठीक है, यह दिलचस्प है। मैंने सोचा था कि वे संख्याएं अक्सर रेडियंस की सीमा के बाहर अच्छी तरह से चली जाती हैं, लेकिन डेटा को छेड़छाड़ करने के बारे में अधिक बारीकी से देखकर मैं पीआई के नीचे या नकारात्मक पीआई के नीचे की संख्या नकारात्मक एक्सपोनेंट देखता हूं। हो सकता है कि मैं वास्तव में यह सब से अधिक कठिन बना रहा था। फिर भी, एक साथ घूर्णन की आपकी व्याख्या वास्तव में सहायक थी।मैं इस सामान से भयभीत होने के करीब हूं :-) – John

2
  1. सजातीय निर्देशांक (4D) करने के लिए अपने 3 डी वैक्टर बढ़ाएँ। इसका मतलब है घटक के साथ एक 4 डी वेक्टर (एक्स, वाई, जेड, 1)

  2. अपने घूर्णन और अनुवाद पैरामीटर के आधार पर 4x4 रूपांतरण मैट्रिक्स बनाएं। इसे एक affine परिवर्तन कहा जाता है। आप घूर्णन matrices के बारे में लेख के साथ सही रास्ते पर हैं।

  3. रूपांतरण मैट्रिक्स के साथ अपने समन्वय वैक्टर को गुणा करें।

चेक बाहर इस विकिपीडिया अनुभाग: http://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations

यह एक उदाहरण 2 डी निर्देशांक में उत्पन्न किया है, मुझे यकीन है कि आप विचार के लिए पर्याप्त 3 डी के लिए विस्तार करने के लिए मिल रहा है।

+0

इस के लिए बहुत बहुत धन्यवाद ... आप मेरे मस्तिष्क को चोट पहुंचा रहे हैं, लेकिन मुझे लगता है कि मैं (बस) जो कुछ आपने कहा था उसे समझने में सक्षम हो सकता है :) – John

2

मेरा अनुमान है कि ओपनसीवी पहले ही एक्सवाईजेड रोटेशन देता है। अपना बायां हाथ लें (left hand rule) और अपनी मुट्ठी बंद करें। अपने अंगूठे को ऊपर उठाएं (जेड अक्ष), अपनी इंडेक्स उंगली को सीधे (एक्स अक्ष) के सामने बढ़ाएं, फिर अपनी मध्य उंगली को दाएं (वाई अक्ष) तक बढ़ाएं।

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

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

रोटेशन वेक्टर आमतौर पर उस स्थान के बारे में बताते हैं जहां अंतरिक्ष में आपके ऑब्जेक्ट को घुमाया जाना चाहिए।

+0

उंगलियों के दिशानिर्देशों का आपका असाइनमेंट असामान्य है। आमतौर पर आपके पास अंगूठे = x, अनुक्रमणिका = y और middle = z है। जैसा कि आपने संदर्भित लेख में चित्रित किया है। लेकिन यह आपकी पोस्ट के सार को प्रभावित नहीं करता है। – MvG

+0

मुझे पता है ... मैं एक एयरोस्पेस पृष्ठभूमि से आया हूं, जेड हमेशा आकाश की ऊंचाई है लेकिन वीडियो गेम से मेरा मित्र असहमत है। – Eric